800===Dev Concepts and License/Web Security

Jasypt 스프링 암호화 - 애플리케이션 보안의 첫걸음 🔐

블로글러 2025. 5. 29. 08:41

안녕하세요! 혹시 스프링 프로젝트에서 데이터베이스 비밀번호나 API 키를 그대로 노출시켜본 적 있으신가요? 😱 저도 처음엔 application.properties에 비밀번호를 그대로 적어놓고 깃허브에 올렸다가 식은땀을 흘린 기억이 있네요. 오늘은 이런 민감한 정보를 안전하게 관리할 수 있는 Jasypt에 대해 알아보겠습니다!

등장 배경

과거에는 애플리케이션 설정 파일에 민감한 정보를 평문으로 저장하는 것이 일반적이었습니다. 하지만 이는 심각한 보안 취약점이었죠.

초기 단계 (2000년대 초반):

  • 설정 파일에 DB 비밀번호, API 키 등을 평문으로 저장
  • 소스 코드 저장소에 그대로 업로드
  • 서버 접근 권한이 있는 누구나 민감 정보 확인 가능

변화의 시작 (2006년~):

  • Jasypt(Java Simplified Encryption) 등장
  • 스프링 프레임워크와의 완벽한 통합
  • 간단한 설정으로 강력한 암호화 제공

Jasypt가 해결하는 문제들:

  1. 평문 비밀번호 노출: 설정 파일에 DB 비밀번호가 그대로 보임
  2. 소스 코드 저장소 보안 위험: Git에 민감한 정보가 그대로 올라감
  3. 서버 접근자 보안 문제: 서버 접근 권한만 있으면 모든 비밀 정보 확인 가능

핵심 원리

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;
    }
}

주의사항 및 팁 💡

⚠️ 이것만은 주의하세요!

  1. 마스터 비밀번호 관리

    • 절대로 소스 코드에 하드코딩하지 마세요
    • 환경변수나 외부 설정 관리 시스템 사용
    • AWS Secrets Manager, HashiCorp Vault 등 활용 권장
  2. Gradle 특이사항

    • $ 문자 사용 시 이스케이프 필요: \$
    • processResources 태스크 실패 시 확인
  3. 프로덕션 환경

    • 각 환경별로 다른 마스터 비밀번호 사용
    • 정기적인 비밀번호 변경 정책 수립

💡 꿀팁

  • 개발 환경에서는 간단한 비밀번호 사용 가능
  • CI/CD 파이프라인에서는 시크릿 관리 도구 연동
  • 암호화된 값의 prefix/suffix 커스터마이징 가능:
    jasypt:
      encryptor:
        property:
          prefix: "ENC@["
          suffix: "]"

마치며

지금까지 Jasypt를 통한 스프링 부트 애플리케이션의 설정 암호화에 대해 알아보았습니다. 처음에는 복잡해 보일 수 있지만, 한 번 설정해두면 민감한 정보를 안전하게 관리할 수 있어 꼭 필요한 기능입니다! 🔐

특히 팀 프로젝트나 오픈소스 프로젝트에서는 필수적이니 꼭 적용해보시길 바랍니다.

참고 자료 🔖


#Jasypt #SpringBoot #암호화

728x90
반응형