IT인으로 살아남기

[SpringBoot] application.yml 데이터베이스 연결 정보 방법에 대해서 본문

Spring

[SpringBoot] application.yml 데이터베이스 연결 정보 방법에 대해서

seoeunpapa 2025. 1. 20. 23:42
728x90

 

Spring Boot의 application.yml에서 데이터베이스 연결 정보를 암호화하는 방법에 대해서


1. 문제점: application.yml의 보안 문제

application.yml에는 다음과 같이 데이터베이스 연결 정보가 들어갑니다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: myuser
    password: mypassword  # <-- 노출되면 보안 문제 발생!

이 경우, password가 평문으로 저장되므로 보안에 취약합니다.


2. 해결 방법

방법 1: 환경 변수(Environment Variables) 사용

  • YAML 파일에서 직접 비밀번호를 저장하지 않고, 운영 체제의 환경 변수를 참조하는 방법입니다.
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
  • 운영 체제에 환경 변수를 설정합니다.
    • Linux/macOS:
      export DB_USERNAME=myuser
      export DB_PASSWORD=mypassword
      
    • Windows (PowerShell):
      $env:DB_USERNAME="myuser"
      $env:DB_PASSWORD="mypassword"
      
  • 장점: 코드에 비밀번호가 직접 저장되지 않음
  • 단점: 운영 환경별로 환경 변수를 설정해야 함

방법 2: Jasypt로 암호화

Jasypt (Java Simplified Encryption)을 사용하면, application.yml 내의 민감한 정보를 암호화할 수 있습니다.

(1) Jasypt 의존성 추가

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

(2) 비밀번호 암호화

Jasypt CLI 도구를 사용하여 비밀번호를 암호화할 수 있습니다.

java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
   input="mypassword" \
   password="mysecretkey" \
   algorithm=PBEWithMD5AndDES

위 명령어를 실행하면 암호화된 값이 출력됩니다.

예제:

ENC(xYZ123ABC890==)

(3) application.yml에 암호화된 값 저장

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: myuser
    password: ENC(xYZ123ABC890==)  # 암호화된 값

(4) Jasypt 암호 해독을 위한 키 설정

application.properties 또는 환경 변수에서 암호화 키를 설정해야 합니다.

jasypt.encryptor.password=mysecretkey

또는 JVM 옵션으로 설정:

-Djasypt.encryptor.password=mysecretkey
  • 장점: 암호화된 값을 YAML에 저장 가능
  • 단점: 해독 키가 필요하며, 안전하게 관리해야 함

방법 3: AWS Secrets Manager 또는 HashiCorp Vault 사용

AWS Secrets Manager, HashiCorp Vault 같은 외부 비밀 관리 시스템을 사용하면, 애플리케이션이 실행될 때만 필요한 정보를 가져올 수 있습니다.

(1) AWS Secrets Manager 예제

  1. AWS Secrets Manager에서 mydatabase-secret이라는 비밀을 생성
  2. spring-cloud-starter-aws-secrets-manager-config 의존성 추가:
<dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-starter-aws-secrets-manager-config</artifactId>
    <version>2.3.1</version>
</dependency>
  1. application.yml에서 설정:
spring:
  cloud:
    aws:
      secretsmanager:
        enabled: true
        default-context: mydatabase-secret
  • 장점: 민감한 정보를 완전히 외부 시스템에서 관리
  • 단점: AWS 비용 발생 및 설정이 필요함

3. 결론

방법 방법 수준 설정 난이도 추가 비용

방법 보안 수준 설정 난이도 추가 비용
환경 변수 사용 쉬움 없음
Jasypt 암호화 높음 중간 없음
AWS Secrets Manager / Vault 매우 높음 어려움 있음
  • 간단한 보안 적용 → 환경 변수 사용
  • 보안을 강화하고 싶다면 → Jasypt 사용
  • 엔터프라이즈 환경에서는 → AWS Secrets Manager 또는 Vault 활용

환경에 맞게 선택해서 적용하면 됩니다.

728x90