MSA 구축 (5) - 설정 파일의 암호화 처리 : 비대칭키를 이용한 암/복호화

오형상·2024년 11월 23일
0

Ficket

목록 보기
5/27
post-thumbnail

지난 글에서는 Git Repository를 Private으로 설정하여 Spring Cloud Config Server의 환경 설정 파일을 보호하는 방법을 다뤘습니다. 하지만, 이 방식만으로는 환경 설정 파일의 중요한 정보(예: 데이터베이스 비밀번호, API 키 등)가 유출될 가능성을 완전히 차단하기 어렵습니다.

이를 보완하기 위해 암호화 기법을 사용하는 것이 효과적입니다.

대칭키 vs 비대칭키

대칭키 암호화

  • 특징: 암호화와 복호화에 동일한 키를 사용합니다.
  • 장점: 성능이 우수하고 구현이 간단합니다.
  • 단점: 키가 노출되면 보안이 무너집니다.

비대칭키 암호화

  • 특징: 암호화는 공개키(Public Key)로, 복호화는 개인키(Private Key)로 처리됩니다.
  • 장점: 키 노출 위험이 적고, 보안이 뛰어납니다.
  • 단점: 대칭키에 비해 성능이 낮습니다.

본 글에서는 비대칭키 암호화를 선택하여 Spring Cloud Config Server에 적용하는 방법을 소개합니다. 개인키만 안전하게 보호하면 복호화를 제어할 수 있으므로, 보안적인 이점이 큽니다.


구현 과정

1. 키 페어 생성

1-1 키 저장 디렉토리 생성

키를 저장할 디렉토리를 생성합니다. 예를 들어, keystore 디렉토리를 생성합니다.

mkdir keystore

1-2. 키 페어 생성

키 페어(공개키와 개인키)를 생성합니다. 아래 명령어를 사용하세요.

keytool -genkeypair -alias ficketEncryptionKey -keyalg RSA -dname "CN=Hyeongsang Oh, OU=API Development, O=ficket.shop, L=Seoul, C=KR" -keypass "test1234" -keystore ficketEncryption.jks -storepass "test1234"
  • -alias: 키를 식별할 별칭
  • -keyalg: 사용할 알고리즘 (RSA)
  • -dname: 소유자 정보 (CN, OU, O, L, C)
  • -keypass: 키 비밀번호
  • -keystore: 생성될 JKS 파일 이름
  • -storepass: 키스토어 비밀번호

명령 실행 후, ficketEncryption.jks 파일이 생성됩니다.

2. Spring Cloud Config Server에 암호화 적용

2-1 의존성 추가

Spring Cloud Config Server에서 암호화를 사용하려면 spring-cloud-starter-bootstrap을 추가해야 합니다.

implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'

2-2 bootstrap.yml 설정

해당 키를 Spring Cloud Config Server의 resources에 옮기고 gitignore 처리해줍니다.
그리고 bootstrap.yml 파일에 개인키 정보를 등록합니다.

encrypt:
  key-store:
    location: classpath:/ficketEncryption.jks
    password: test1234
    alias: ficketEncryptionKey
  • location: 키스토어 파일 경로
  • password: 키스토어 비밀번호
  • alias: 키 별칭

2-3 암호화 및 복호화 테스트

Spring Cloud Config Server가 실행 중인 상태에서 Postman을 사용해 테스트합니다.

암호화 요청

  • URL: http://localhost:8888/encrypt
  • 메서드: POST
  • Body: 암호화할 텍스트

응답으로 암호화된 문자열이 반환됩니다.

복호화 요청

  • URL: http://localhost:8888/decrypt
  • 메서드: POST
  • Body: 암호화된 문자열

응답으로 원본 문자열(test)이 반환됩니다.


3. yml 파일에서 암호화된 값 사용하기

암호화된 값은 {cipher} 접두사를 붙여 yml 파일에 사용해야 합니다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ficket-user
    username: root
    password: "{cipher}AQCdtuMDbN+i8QoXEv22sRaePsWFrJRua8f" # 암호화된 값이 너무 길어 일부만 넣었습니다. 
    driver-class-name: com.mysql.cj.jdbc.Driver

Spring Cloud Config Server는 {cipher}로 시작하는 값을 자동으로 복호화하여 애플리케이션에 전달합니다.


Reference

0개의 댓글