인프런의 "Spring Cloud로 개발하는 마이크로서비스" 강의를 보고 작성되었습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4
현재 Config 서버에서는 native 파일을 가져오고 있지만, Remote Git을 이용해서 가져오기 위해 GitHub와 같은 곳에 config 파일을 등록할 수도 있습니다.
이러한 방식을 사용하게 되면 config 파일에 작성된 token secret이나 datasource 등과 같은 내용이 적혀 있는 경우 보안적으로 위험합니다.
따라서 이번에는 암호화하여 config 파일을 작성하고 Spring Cloud Config에서 복호화하여 사용하는 방법을 구현했습니다.
암호화 방식에는 크게 2가지가 존재합니다.
대칭키 암호화는 그림과 같이 암호화와 복호화에 동일한 키를 사용하는 암호화 방식입니다.
대칭키 암호화는 비대칭키 암호화보다 데이터를 암호화하기 위한 연산이 빨라 속도가 더 빠르다는 장점이 있습니다.
하지만, 같은 키를 사용하기 때문에 키를 교환해야 합니다. 따라서 키 교환 시 탈취의 가능성이 생깁니다.
대칭키가 키 교환에 문제가 있기 때문에 이를 해결하기 위한 비대칭키 암호화가 등장했습니다.
비대칭키 암호화는 암호화된 데이터를 복호화하는 곳에서 공개키를 만들어 공개합니다. 이 공개키로 데이터를 암호화하고 복호화하는 곳에서는 개인키를 가지고 있어 개인키로 암호화된 데이터를 복호화합니다.
따라서 공개키로 데이터를 복호화할 수 없기 때문에 탈취의 문제가 발생하지 않습니다.
하지만, 연산 속도가 느리다는 단점이 있습니다.
Config 서버의 bootstrap.yml에 다음과 같이 대칭키에 사용될 key를 등록합니다.
Config 서버에 /encrypt를 호출하면 등록된 키로 암호화된 데이터를 얻을 수 있습니다.
/decrypt를 호출해 복호화된 plain text 값을 확인할 수 있습니다.
User Microservice에 등록된 내용 중 datasource의 password를 암호화된 데이터로 등록하기 위해 application.yml 파일에서 주석 처리합니다.
주석 처리한 부분을 config 서버에서 사용하는 yml 파일 (현재 프로젝트에서는 native 파일)에 암호화된 내용으로 작성합니다.
user-service.yml에 작성했기 때문에 User Microservice의 bootstrap.yml에서 user-service.yml을 사용할 것을 설정합니다.
Config 서버의 user-service.yml을 확인하는 url로 접속해 암호화된 데이터가 복호화된 데이터로 나오는 것을 확인할 수 있습니다.
h2 데이터베이스 접속 시 plain text의 비밀번호를 입력하면 접속 가능합니다.
JDK keytool을 이용해 Private key와 Public key를 생성합니다.
터미널에서 다음과 같이 작성해 private key를 생성합니다.
keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=name, OU=API Development, O=springmsa, L=Seoul, C=KR" -keypass "zaq12wsx" -keystore apiEncryptionKey.jks -storepass "zaq12wsx"
Public key 인증서 파일을 추출해 인증서 파일을 jks 파일로 바꿔 사용하도록 변경합니다.
- 인증서 파일 추출
keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trustServer.cer
- jks 파일로 변경
keytool -import -alias trustServer -file .\trustServer.cer -keystore publicKey.jks
명령어를 실행한 폴더에 다음과 같이 key가 생성된 것을 확인할 수 있습니다.
key-store 에 위에서 만든 개인키를 등록해 줍니다.
기존에 Config 서버에서 사용하는 application.yml에 작성한 token.secret 값을 비대칭키로 암호화된 데이터로 변경합니다.
회원 등록, 로그인을 제외한 api를 호출하게 되면 api gateway에 등록된 필터를 거쳐 토큰 값을 확인합니다.
이때, token.secret 값을 가져오는 부분을 debug 해보면 비대칭키로 암호화한 데이터가 복호화된 데이터로 나오는 것을 확인할 수 있습니다.