공부/MSA

[MSA] Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 설정 정보의 암호화 처리(대칭키와 비대칭키)

sesam 2024. 1. 29. 12:19
728x90

 

 

Encryption types

  1. Symmetric Encryption (Shared), 대칭키
    • Using the same key
  2. Asymmetric Encryption (RSA Keypair), 비대칭키
    • Private and Public Key
    • Usng Java keytool
    • 인크립션과 디크립션에 서로 다른 키(Public Key, Pricate Key)가 사용된다.
    • Public Key는 주로 암호화할 때, Private Key는 주로 복호화할 때 사용

 

Symmetric Encryption (Shared), 대칭키

config-service

의존성 추가

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

 

 

bootstrap.yml

User Microservice의 application.yml, bootstratp.yml을 수정 -> Config Server의 native-file-repo폴더의 user-service.yml로 이동

encrypt:
  key: abcdefghijklmnopqrstuvwxyz0123456789

 

 

user-service.yml

spring:
 datasource:
   driver-class-name: org.h2.Driver
   url: jdbc:h2:mem:testDB
   data-username: sa
   data-password: 1234

 

 

User Microservice의 H2 Database의 Password를 encryption해서 저장

⭐data-password에 꼭!!!!! 작은 따옴표 안에 {cipher}을 적고 암호화된 값을 넣어야 한다!!

 

값을 웹에서 확인했을 때는 암호화된 값이 아니라 원래 값이 나온다.

 

 

서버 기동

주소창에 http://IP:user-service포트번호/h2-console

Password에 1234 넣으면 Test successful 뜬다.

 

 

 

Asymmetric Encryption (RSA Keypair), 비대칭키

Public Key, Pricate Key 생성 → JDK keytool 이용

 

폴더 생성

mkdir {user.home}/Desktop/Work/keystore

 

cmd

keytool -genkeypair -alias apiEncryptionKey -keyalg RSA 
-dname "CN=Sein Lee, OU=API Development, O=joneconsulting.co.kr, L=Seoul, C=KR" 
-keypass "test1234" -keystore apiEncryptionKey.jks -storepass "test1234"

 

깨졌지만 잘 만들어졌다!

 

생성된 키 자세히 알아보기

keytool -list -keystore apiEncryptionKey.jks -v

 

 

~~~~ 여기까지만 해도 좋다! ~~~

 


 

 

 

Public에 해당하는 Trust Server.cer 인증서 파일이 추출된다.

keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trustServer.cer

 

 

인증서 파일을 다시 JDK파일로 바꿔서 사용할 수도 있다. (-keystore 변경시켜줄 파일 이름)

공개키 추출

keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks

 

 

생성된 키(public.jks) 자세히 알아보기

keytool -list -keystore publicKey.jks -v

 

 

처음에 만든 값(apiEncryptionKey)과 publicKey를 비교해보자.

뒤에 -v를 빼면 짧게 결과값이 나온다.

keytool -list -keystore publicKey.jks
keytool -list -keystore apiEncryptionKey.jks

내 cmd 결과값이 깨져 나와서 강의화면을 넣었다..

 

 

apiEncryptionKey, publicKey, TrustServer 총 3개가 생성된 것을 볼 수 있다.

Spring Cloud Configuration Server에서는 apiEncryptionKey 하나만 있으면 된다...

ls -al

 

 

 


 

 

적용해보자

 

config-service

bootstrap.yml

encrypt:
#  key: abcdefghijklmnopqrstuvwxyz0123456789  # 이건 대칭키일 때 사용
  key-store:
    location: file:///${user.home}/Desktop/MSA_STUDY/keystore/apiEncryptionKey.jks
    password: test1234
    alias: apiEncryptionKey

 

 

postman에서 암호화 진행

1234를 암호화 했음.

 암호화한 .yml에 넣어준다.

 

웹에서는 1234라고 잘 나온다

 

 

 

 

 

gateway-service의 token secret도 비대칭키를 적용해보자

비대칭 키 적용

 

웹에서 확인

 

 

디버그 모드에서 확인

 

 

 

user-service와 gateway-service에서 공통적인 부분이 있다면 공통적으로 해결하는게 좋다.

위에는 연습삼아 따로 적용했지만,

아래 사진을 보면 application.yml을 공통적으로 사용하는 것을 확인할 수 있다.

 

 

 

 

 

 

💬 혼잣말

  • Public Key는 주로 암호화할 때, Private Key는 주로 복호화할 때 사용

강의에서는 apiEncryptionKey만 사용했는데

apiEncryptionKey, publicKey, TrustServer 키를 생성해서 어떻게 사용하는지 까지 해봐야겠다..

 

 

 

 

 

 

 

 

 

 

 

 

728x90