
본 내용은 인프런의 이도원님의 SpringCloud 강의를 참고하여 작성되었습니다.
이전 포스팅에서 대칭키와 비대칭키 방식과 이에 사용되는 공개키 개인키에 대해 간단하게 알아보았다. 해당 대칭키 전략을 적용하여 설정정보 파일의 중요한 정보들을 암호화 해보자.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
}
encrypt.key는 application.yml 에서 정의하는 것이 아니라 bootstrap.yml 에서 정의하고 그 값을 가져 오기때문에 bootstrap을 사용하기 위한 의존성을 추가해야 한다.
encrypt:
key: [사용할 대칭키]
대칭키로 사용될 키를 명시해주면 끝!


Config Server의 Port로 encrypt/decrypt 요청을 보내게 되면 등록한 encrypt.key를 대칭키로 사용하여 암/복호화를 진행한다.
이후 설정정보 파일에서 암호화 된 값으로 변경해주자.
password: '{cipher}abcdefg...'
암호화 된 값임을 명시하는 {cipher} 키워드를 포함시켜야 한다.
공개키 암호화 방식: 공개키로 데이터를 암호화 하고 전달받은 데이터를 비밀키로 암호화 한다. 이경우는 데이터의 보안이 중시되는 경우에 사용된다.
비밀키 암호화 방식: 비밀키로 데이터를 암호화 하고 공개키와 함께 암호를 전달한다. 이 경우를 전자서명 방식으로 사용하며, 데이터의 보안보다는 송신자의 신원 확인을 목표로 한다. 송신받은 데이터를 공개키로 복호화에 성공하게 되면 송신자가 전달했다는 것이 증명되기 때문이다.
비대칭키 방식에는 암/복호화에 서로 다른 키가 사용되어야 한다. 비밀키와 이에 파생된 공개키를 생성하기 위해 JDK KeyTool을 사용해보자.
키 페어를 생성하기 위해서는 KeyTool 유틸리티 명령어가 필요하다. jks를 생성하고자 하는 디렉토리에서 해당 명령어를 입력하자.
keytool -genkeypair \ - 키 페어 생성 명령
-alias apiEncryptionKey \ - 별칭
-keyalg RSA \ - 암호화 알고리즘
-dname "CN=Wonseok Lee, OU=API Development, \ - 주체 이름 DN 설정
O=bookdodum.co.kr, L=Seoul, C=KR"
-keypass "test1234" \ - 개인 키를 저장할 때 사용할 암호
-keystore apiEncryptionKey.jks \ - 키 스토어 파일의 이름
-storepass "test1234" - 키 스토어 파일의 암호
아래의 명령어로 생성된 jks 파일의 정보를 출력해보자.
keytool -list -keystore apiEncryptionKey.jks -v

인증서의 고유 식별자, 타입, 주체 등 다양한 정보를 확인할 수 있는데, Entry Type을 확인해보면 PrivateKey인것을 알 수 있다. 비대칭키 방식을 사용하기 위해서 apiEncryptionKey를 통해 파생된 공개키를 생성해야 한다.
encrypt:
key-store:
location: file://${user.home}/Desktop/work/keystore/apiEncryptionKey.jks
password: test1234
alias: apiEncryptionKey
대칭키 방식과는 다르게 Java KeyStore(jks) 파일의 위치를 명시해주어야 한다.
keytool -export -alias apiEncryptionKey -keystore apiEncry
ptionKey.jks -rfc -file trustServer.cer
공개키를 생성하기 위한 인증서 파일을 apiEncryptionKey로 부터 추출하자.
keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
인증서를 기반으로 공개키를 생성하자.
필요한 경우에 이 공개키를 활용할 수 있다.
Config Server의 Port로 encrypt/decrypt 요청을 보내게 되면 등록한 jks를 대칭키로 사용하여 암/복호화를 진행한다.
jks에는 공개키/개인키 쌍이 저장되어 있으므로 비대칭키 전략을 사용한다고 볼 수 있다.
참고문헌
Inflearn: Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의자료