이 글은 인프런 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의를 듣고 쓴 글입니다.
설정 정보의 암호화 처리
설정 정보, 즉 비밀번호나 민감한 정보를 따로 관리하는 것까지는 했다. 하지만 설정 정보를 저장할 때 plaintext, 즉 그냥 텍스트로 저장하면 위험하다. 암호화된 설정 정보를 저장해놓고, 실제 사용할 때는 복호화해서 사용하자.
설정 정보를 암호화할 때는 대칭키 혹은 비대칭키를 사용한다.
그 중 비대칭키는 RSA 를 사용하며, Java의 keytool을 사용하면 된다. 먼저 대칭키부터 살펴보자.
대칭키
configuration server에 우선 bootstrap 의존성이 있어야 한다. 그 후 bootstrap.yml 파일에 다음과 같이 설정한다.
encrypt:
key: abcdefghijklmnopqrstuvwxyz0123456789
아무 값이나 쓴 거다. 앞으로 설정 정보를 파일에 저장할 때는 이 키로 암호화된 데이터를 넣을 것이다.
이제 config-server를 기동하고, 다음과 같이 요청하면 암호화된다.
그리고 이 값을 다시 복호화하려면 이렇게 하면 된다.
이제 user-service의 민감한 정보를 직접 파일에 저장하고 config-server를 통해 불러오는 것을 해보자.
민감한 정보는 datasource 정보가 있을 수 있다. user-service에서 datasource 에 관련된 부분을 주석처리하고 이걸 user-service.yml 파일에 옮긴다.
단, 우리는 1234라는 비밀번호를 쓸 것이므로 다음과 같이 쓴다.
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb
username: sa
password: '{cipher}f0a5599e25746ca139e1439eac4ae7141e506d0098fd3def2247d659eb74bec1'
generate-unique-name: false
name: testdb
- 여태까지 비밀번호는 공란이었는데, 이제 1234로 쓰려는 것이다.
- 비밀번호가 암호문이라는 것을 알리기 위해 앞에 {cipher} 를 붙인다.
이제 모든 서비스를 기동하고 잘 적용되었는지 확인하기 위해 다음과 같은 요청을 보내본다.
1234라는 비밀번호가 잘 나온다. 즉, 파일에 저장되어 있던 암호문이 config-server 로 넘어오면서 bootstrap.yml 파일에 있는 키 값으로 복호화한 것이다.
마찬가지로 이 비밀번호로 h2-console 도 잘 들어가지는지 확인해본다.
잘 된다.
비대칭키
비대칭키를 이용하기 위해서 JDK keytool 을 이용한다.
비밀키를 만들고, 이 파일을 config-server에 명시해야 한다. 그럼 공개키는 알아서 한다. 하지만, 공개키까지 만들어보는 실습을 진행하자.
마음에 드는 경로에 keytool 폴더를 생성하고 다음과 같은 명령어를 사용해 개인키를 생성한다.
keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=morenow, OU=API Development, O=morenow.co.kr, L=Seoul, C=KR" -keypass "test1234" -keystore apiEncryptionKey.jks -storepass "test1234"
- alias로 별명을 생성한다.
- keyalg 으로 암호화 알고리즘을 선택한다. 우리는 RSA를 사용한다.
- dname으로 사용자에 관한 정보를 넣는다.
- keypass로 비밀키의 패스워드를, storepass로 해당 파일의 패스워드를 생성한다.
- keystore로 파일 이름을 지정한다.
이러면 apiEncryptionKey.jks 파일이 만들어지는 것을 볼 수 있다. 이 파일을 뜯어보기 위해 다음 명령어를 입력하자.
keytool -list -keystore apiEncryptionKey.jks -v
아까 생성한 패스워드인 test1234를 입력하면 파일을 정확하게 볼 수 있다. 여기서 다음과 같은 정보가 있다.
Entry type: PrivateKeyEntry
비밀키라는 뜻이다.
여기까지만 해도 되지만, 다른 사람에게 공개키를 전달한다거나, 다른 이유로 공개키가 직접 필요할 수도 있다. 이 과정을 보자.
다음과 같은 명령어를 입력한다.
keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trustServer.cer
비밀키에 대한 인증서를 만든다는 소리다. rfc는 request for comment이며 표준 문서 형식이다. trustServer.cer는 인증서라고 생각하면 된다.
이후에 다음과 같은 명령어를 입력한다.
keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
이제 publicKey.jks 가 만들어지는데, 이게 공개키이다. 아까와 같이 다음 명령어를 입력하면
keytool -list -keystore publicKey.jks -v
다음과 같은 부분이 보인다.
Entry type: trustedCertEntry
즉, 공개키라는 소리다.
지금은 쓸 일이 없다.
다시 돌아가서 기존 config-server의 bootstrap.yml 파일을 다음과 같이 수정한다.
encrypt:
# key: abcdefghijklmnopqrstuvwxyz0123456789
key-store:
location: file://${user.home}/Desktop/MSA/keystore/apiEncryptionKey.jks
password: test1234
alias: apiEncryptionKey
이제 설정은 끝났다! 똑같이 하면 된다.
아까같이 1234를 암호화해보자. 훨씬 더 긴 암호문이 나온다.
복호화도 똑같이 할 수 있다.
그럼, 아까 h2 console 의 비밀번호를 키가 바뀌었으니 다시 설정해보자.
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb
username: sa
password: '{cipher}AQBq2xSWdWFdq9nuv4v5lcFCfFbhrz6/MW2jmQQdzObg2A5DuXVI8drePdaNWLrMbwez3i7V4M4Gdrv4itszUToI9bes7d4OAmw3egmUDrwHGC+0TxsfRkhp4SYXPRY9JRNP+uupyz6P5LDAb+9c5ua1hrfcScb3ONh/CKH93wccI3iH8dpYrajwKnRk10TlGxg55XM3k1TdcUjg8KkUs2+JmR9KVvT/fOEPlmu382Oy8RZFsXdJXpivxAlSLEPGVrpPT4XbohSCV0txhV/YO6+Mfh6AC5vrR4+Vis2Y/GzYhQhjQ2vAVxzb9RfQkvsRy76vtIljM1XeU/GwzXGn+2VPKq3h+LRHcrDRS4TntqoJuEBIEVZfOT2VEpW6KbIZUys='
generate-unique-name: false
name: testdb
그럼 진짜 아까랑 똑같다. h2 console 도 로그인이 잘 되는 것을 알 수 있다.
하나만 더 해보자. jwt 를 만들 때 썼던 token.secret 값도 암호화해보자. Gateway 가 사용하는 파일을 ecommerce.yml 파일로 만들고 그 안의 token.secret 값을 암호화한다.
Gateway 의 bootstrap.yml 파일을 다음과 같이 변경하자.
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
profiles:
active: dev
사용하고 싶은 token.secret 값은 다음과 같다.
user_token_native_ecommerce
역시 암호화를 같은 방식으로 한 후에 ecommerce.yml 파일에 넣어주자. 결과는 다음과 같다.
token:
expiration_time: 86400000
secret: '{cipher}AQBVwbsm4ABqJ2ZQOuBXaRXp06ATGZ4FreAm3pjcHazGRRWdXgvmAz8xJsAtArdlAblthBELLCqCFGoCA4LB7y48Qa9QUswj0hXC44CexcdcamFROC+m54ueKi57fDBASY/uQkIUTiXKJ581ShB9mjgPiyODx4En9aF6VICz9g9DJh5MhrJAlehv77163Fa9GHDcn4I8W+hI16dmdkrKgKLexgc1j1D75DCyWOBdW91qPZu9wWKrK3zdpbzkDsnwfre4jcK13nXz4nrwW7v4LF6bg81CDPTqhZ1UInec9Wd7YNRQJIMyBUs1a9Ax7Y5/2DE9TAQ5PmIrWej+RcYVvSESox19iPCrTPqJAe0nRCmz1Oy9z7mvoCpp1t2IE8VTqulDua+ql+6WHeRGJAvfEI3f'
gateway:
ip: 192.168.0.17
실제 요청을 보내보자.
잘 복호화되어서 나온다!!!
'[MSA] Spring Cloud로 개발하는 마이크로서비스 애플리케이션' 카테고리의 다른 글
섹션 11 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.08.24 |
---|---|
섹션 10 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.08.18 |
섹션 8 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.08.11 |
섹션 7 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.08.04 |
섹션 6 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.08.04 |