일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 자바기술면접
- Spring
- lock
- 개발자기술면접
- equals
- 기술면접대비
- stream
- DB
- 객체지향언어
- 자바
- hashcode
- 네트워크
- 자바8
- 데이터베이스
- http
- 알고리즘
- 운영체제
- 개발자면접
- Application
- 공유락
- 자바면접
- 스프링
- 배타락
- 백엔드
- 면접준비
- java
- 스트림
- 기술면접
- jpa
- 백엔드면접
Archives
- Today
- Total
IT인으로 살아남기
[SpringBoot] application.yml 데이터베이스 연결 정보 방법에 대해서 본문
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"
- Linux/macOS:
- 장점: 코드에 비밀번호가 직접 저장되지 않음
- 단점: 운영 환경별로 환경 변수를 설정해야 함
방법 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 예제
- AWS Secrets Manager에서 mydatabase-secret이라는 비밀을 생성
- 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>
- 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
'Spring' 카테고리의 다른 글
[스프링/JPA] JPA에서 ID 생성 전략에 대해 (0) | 2025.02.06 |
---|---|
[Spring/스프링/면접] JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요? (1) | 2025.01.28 |
[Spring/스프링/면접] JPA의 N + 1 문제에 대해서 (0) | 2025.01.27 |
[Spring/스프링/면접] 엔티티 매니저에 대해서 (0) | 2025.01.26 |
[Spring/스프링/면접] Spring Data JPA에서 새로운 Entity인지 판단하는 방법은? (0) | 2025.01.25 |