안녕하세요! 혹시 스프링 프로젝트에서 데이터베이스 비밀번호나 API 키를 그대로 노출시켜본 적 있으신가요? 😱 저도 처음엔 application.properties에 비밀번호를 그대로 적어놓고 깃허브에 올렸다가 식은땀을 흘린 기억이 있네요. 오늘은 이런 민감한 정보를 안전하게 관리할 수 있는 Jasypt에 대해 알아보겠습니다!
등장 배경
과거에는 애플리케이션 설정 파일에 민감한 정보를 평문으로 저장하는 것이 일반적이었습니다. 하지만 이는 심각한 보안 취약점이었죠.
초기 단계 (2000년대 초반):
- 설정 파일에 DB 비밀번호, API 키 등을 평문으로 저장
- 소스 코드 저장소에 그대로 업로드
- 서버 접근 권한이 있는 누구나 민감 정보 확인 가능
변화의 시작 (2006년~):
- Jasypt(Java Simplified Encryption) 등장
- 스프링 프레임워크와의 완벽한 통합
- 간단한 설정으로 강력한 암호화 제공
Jasypt가 해결하는 문제들:
- 평문 비밀번호 노출: 설정 파일에 DB 비밀번호가 그대로 보임
- 소스 코드 저장소 보안 위험: Git에 민감한 정보가 그대로 올라감
- 서버 접근자 보안 문제: 서버 접근 권한만 있으면 모든 비밀 정보 확인 가능
핵심 원리
Jasypt의 동작 원리를 시각적으로 표현하면 다음과 같습니다:
┌─────────────────────────────────────────────────────────────┐
│ Jasypt 암호화 프로세스 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 평문 비밀번호 2. 암호화 │
│ ┌────────────┐ ┌────────────┐ │
│ │ password123│ ─────────────> │ Jasypt │ │
│ └────────────┘ │ Encryptor │ │
│ └────────────┘ │
│ │ │
│ ▼ │
│ 3. 암호화된 값 │
│ ┌─────────────────┐ │
│ │ ENC(X6Gzk2....) │ │
│ └─────────────────┘ │
│ │ │
│ ▼ │
│ 4. application.yml에 저장 5. 런타임 복호화 │
│ ┌────────────────────┐ ┌─────────────────┐ │
│ │ db.password: │ │ Spring Boot │ │
│ │ ENC(X6Gzk2....) │ ───> │ 자동 복호화 │ │
│ └────────────────────┘ └─────────────────┘ │
│ │ │
│ ▼ │
│ 6. 실제 사용 │
│ ┌────────────┐ │
│ │ password123│ │
│ └────────────┘ │
└─────────────────────────────────────────────────────────────┘
암호화 알고리즘 옵션 비교
알고리즘 | 보안 수준 | 성능 | 용도 |
---|---|---|---|
PBEWITHHMACSHA512ANDAES_256 | ⭐⭐⭐⭐⭐ | 중간 | 기본값, 대부분의 경우 권장 |
PBEWithMD5AndDES | ⭐⭐ | 빠름 | 레거시 시스템 |
AES/GCM/NoPadding | ⭐⭐⭐⭐⭐ | 빠름 | 최신 암호화 (v3.0.5+) |
비대칭 키 암호화 | ⭐⭐⭐⭐⭐ | 느림 | 높은 보안 요구사항 |
Gradle 설정 방법 🛠️
1. 의존성 추가
dependencies {
// Spring Boot 3.x 사용 시
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
// Spring Boot 2.x 사용 시
// implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:2.1.2'
}
2. 암호화 설정
application.yml 예시:
# 데이터베이스 설정
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
# 암호화된 비밀번호
password: ENC(X6Gzk2DLqucBhFvvn0nPqQXCyLJxG0SX)
# Jasypt 설정
jasypt:
encryptor:
# 마스터 비밀번호는 환경변수로 주입
password: ${JASYPT_PASSWORD}
# 알고리즘 설정 (선택사항)
algorithm: PBEWITHHMACSHA512ANDAES_256
# 키 생성 반복 횟수
key-obtention-iterations: 1000
# 암호화 풀 크기
pool-size: 1
3. 값 암호화하기
방법 1: 온라인 도구 사용
# Jasypt 온라인 암호화 도구를 사용하거나
# 아래 Java 코드로 직접 암호화
방법 2: Java 코드로 암호화
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
public class JasyptEncryptor {
public static void main(String[] args) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("mySecretPassword"); // 마스터 비밀번호
encryptor.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
String plainText = "myDatabasePassword123";
String encryptedText = encryptor.encrypt(plainText);
System.out.println("암호화된 값: ENC(" + encryptedText + ")");
}
}
4. 애플리케이션 실행
# 환경변수로 마스터 비밀번호 전달
export JASYPT_PASSWORD=mySecretPassword
# 또는 JVM 시스템 프로퍼티로 전달
java -Djasypt.encryptor.password=mySecretPassword -jar myapp.jar
# 또는 커맨드라인 인자로 전달
java -jar myapp.jar --jasypt.encryptor.password=mySecretPassword
5. 커스텀 설정 (선택사항)
@Configuration
public class JasyptConfig {
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("mySecretPassword");
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
주의사항 및 팁 💡
⚠️ 이것만은 주의하세요!
마스터 비밀번호 관리
- 절대로 소스 코드에 하드코딩하지 마세요
- 환경변수나 외부 설정 관리 시스템 사용
- AWS Secrets Manager, HashiCorp Vault 등 활용 권장
Gradle 특이사항
$
문자 사용 시 이스케이프 필요:\$
- processResources 태스크 실패 시 확인
프로덕션 환경
- 각 환경별로 다른 마스터 비밀번호 사용
- 정기적인 비밀번호 변경 정책 수립
💡 꿀팁
- 개발 환경에서는 간단한 비밀번호 사용 가능
- CI/CD 파이프라인에서는 시크릿 관리 도구 연동
- 암호화된 값의 prefix/suffix 커스터마이징 가능:
jasypt: encryptor: property: prefix: "ENC@[" suffix: "]"
마치며
지금까지 Jasypt를 통한 스프링 부트 애플리케이션의 설정 암호화에 대해 알아보았습니다. 처음에는 복잡해 보일 수 있지만, 한 번 설정해두면 민감한 정보를 안전하게 관리할 수 있어 꼭 필요한 기능입니다! 🔐
특히 팀 프로젝트나 오픈소스 프로젝트에서는 필수적이니 꼭 적용해보시길 바랍니다.
참고 자료 🔖
#Jasypt #SpringBoot #암호화
728x90
반응형
'800===Dev Concepts and License > Web Security' 카테고리의 다른 글
🛡️ Malware Attack이 발생하는 이유: 사이버 공간의 숨겨진 위험 (3) | 2025.06.11 |
---|---|
DNS in Firewall - 방화벽에서 DNS가 하는 역할 완벽 이해하기 🔥 (0) | 2025.05.30 |
JWT 토큰 인증 - 안전한 웹 서비스를 위한 현대적 인증 방식 🔐 (0) | 2025.03.27 |
OAuth 2.0 - 현대적 접근 권한 관리의 핵심 🔐 (1) | 2025.03.27 |
대칭키 및 비대칭키 암호화 알고리즘 쉬운 설명 (0) | 2025.02.15 |