본문 바로가기
Spring/Cloud

[Spring] 안전한 MSA 운영을 위한 필수 전략: 설정 정보 암호화 및 복호화 흐름 정리

by coding_whale 2026. 4. 24.
반응형

마이크로서비스 아키텍처(MSA)에서 설정을 중앙화하면 운영의 유연성이 비약적으로 상승한다.
하지만 중앙 저장소(Git 등)에 데이터베이스 비밀번호, API 토큰, 클라우드 접근 키(Secret Key) 등을 평문으로 저장하는 것은 보안 측면에서 매우 치명적인 행위다. 누군가 저장소 권한을 얻거나 실수로 코드가 노출될 경우 시스템 전체가 마비될 위험이 있기 때문이다.
이를 해결하기 위해 Spring Cloud Config는 {cipher} 키워드를 기반으로 한 강력한 암복호화 기능을 제공한다. 설정값은 저장소에 암호화된 상태로 보관되며, 애플리케이션이 이를 사용할 때만 복호화되어 주입되는 시스템을 구축하는 것이 이번 학습의 핵심 목표다.

 

1 . 주요 특징 및 핵심 로직

Spring Cloud Config의 암호화 시스템은 'Config Server'를 중심으로 동작한다. 개발자가 민감 정보를 암호화하여 저장소에 올리면, Config Server가 이를 인지하고 적절한 시점에 복호화하여 클라이언트에게 전달하는 구조다.

이 시스템을 지탱하는 논리적 축은 다음과 같다.

  • 중앙화된 복호화 주체: 마이크로서비스(Client)마다 키를 가질 필요 없이, Config Server 한 곳에서 복호화를 전담하여 키 관리 포인트를 일원화한다.
  • 유연한 알고리즘 지원: 단순한 대칭키 방식부터 엔터프라이즈 급의 비대칭키(RSA) 방식까지 환경에 맞는 보안 수준을 선택할 수 있다.
  • 투명한 데이터 주입: 클라이언트 애플리케이션은 해당 값이 암호화되었었는지 알 필요가 없다. 평상시처럼 환경 변수나 @Value를 통해 평문으로 주입받아 사용한다.

 

2. 상세 가이드 및 심층 분석

📌 암호화 방식 비교: 대칭키 vs 비대칭키

구분 대칭키 (Symmetric) 비대칭키 (Asymmetric)
방식 암호화와 복호화에 동일한 키 사용 공개키로 암호화, 개인키로 복호화 (RSA)
설정 난이도 매우 낮음 (encrypt.key 설정) 보통 (KeyStore 생성 필요)
보안성 키 유출 시 위험도가 높음 역할 분리가 가능하여 보안성이 높음
권장 환경 로컬 테스트 및 소규모 프로젝트 실제 운영 및 엔터프라이즈 환경

🔍 STEP 1. 비대칭키 생성을 위한 KeyStore 구축 (Java Keytool)

실무에서는 보안성이 높은 비대칭키 방식을 선호한다. JDK에 포함된 keytool을 사용하여 PKCS12 형식의 키스토어를 생성하는 과정이 선행되어야 한다.

# 비대칭키 쌍 생성 (RSA 2048비트)
keytool -genkeypair \
  -alias apiEncryptionKey \
  -keyalg RSA \
  -keysize 2048 \
  -storetype PKCS12 \
  -keystore apiEncryptionKey.p12 \
  -validity 3650

 

🔍 STEP 2. Config Server 설정 (bootstrap.yml)

생성된 키스토어 파일을 Config Server가 인식할 수 있도록 경로와 비밀번호를 설정한다.

encrypt:
  key-store:
    location: file:/opt/security/apiEncryptionKey.p12 # 키스토어 파일 경로
    password: "${KEYSTORE_PASSWORD}" # 환경 변수 권장
    alias: apiEncryptionKey # 키 생성 시 지정한 별칭

 

🔍 STEP 3. 데이터 암호화 및 Git 저장소 반영

Config Server가 기동되면 /encrypt 엔드포인트를 통해 평문을 암호화할 수 있다.

  1. 암호화 요청: curl -X POST http://localhost:8888/encrypt -d 'my-db-password'
  2. 결과값 획득: AJKBDS... (암호화된 문자열 반환)
  3. 저장소 기록: Git 내의 설정 파일에 반드시 {cipher} 접두사를 붙여 저장한다.
spring:
  datasource:
    password: "{cipher}f923b7c2a4...3984d" # 암호화된 값

 

3. 실무 팁 및 주의사항

  • 복호화 시점의 선택: 기본적으로 Config Server가 복호화하여 클라이언트에게 전달하지만, 보안 정책상 네트워크 구간에서도 암호화 상태를 유지해야 한다면 클라이언트가 직접 복호화하도록 설정할 수 있다. 이 경우 클라이언트가 spring-security-crypto 의존성과 복호화 키를 직접 가져야 한다.
  • 환경 변수 활용: encrypt.key나 키스토어 비밀번호를 설정 파일에 평문으로 적는 것은 또 다른 보안 홀을 만드는 것이다. 반드시 OS 환경 변수나 서버 구동 시 파라미터로 주입받도록 구성해야 한다.
  • 로그 레벨 주의: 암호화된 값이 복호화되는 과정에서 로그에 평문이 찍히지 않도록 주의해야 한다. 특히 운영 환경에서는 민감한 환경 변수를 출력하는 로그 레벨을 엄격히 제한해야 한다.
  • JCE(Java Cryptography Extension) 확인: 구버전 Java를 사용하는 경우 강력한 암호화 알고리즘(AES-256 등) 사용을 위해 JCE Unlimited Strength Jurisdiction Policy 파일을 별도로 설치해야 할 수도 있으나, 최신 JDK 버전에서는 기본적으로 포함되어 있다.

 

4. 마무리

Spring Cloud Config의 암호화 기능은 단순히 기술적인 구현을 넘어, 마이크로서비스 환경에서 '신뢰할 수 있는 데이터 전달 체계'를 구축하는 과정이다.
대칭키 방식에서 비대칭키 방식으로의 확장은 운영 리스크를 줄이고 관리의 전문성을 높여준다. Git 저장소에는 암호화된 cipher 텍스트만 남기고, 실제 구동 시점에만 안전하게 복호화되어 흐르는 이 구조는 현대적인 클라우드 네이티브 애플리케이션이 갖춰야 할 보안의 기본 소양이다. 

반응형