카테고리 없음

Jasypt를 활용한 Spring Boot 환경 변수 암호화

-JUNHEOK- 2025. 2. 5. 14:49

Spring Boot 프로젝트에서 환경 변수나 민감한 정보를 안전하게 관리하기 위해 Jasypt를 사용할 수 있습니다. Jasypt를 이용하면 application.yml에 있는 데이터베이스 연결 정보나 API 키 등을 암호화하여 보안성을 높일 수 있습니다.

1. Jasypt 의존성 추가

Spring Boot에서 Jasypt를 사용하려면 아래와 같이 build.gradle에 의존성을 추가해야 합니다.

// Jasypt 암호화
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'

 

 

2. Jasypt 설정 (JasyptConfig.java)

Jasypt의 암호화 설정을 위한 @Configuration 클래스를 생성합니다.

@Configuration
public class JasyptConfig {

    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();

        // 환경 변수에서 Jasypt 암호화 키 가져오기
        String password = System.getenv("JASYPT_ENCRYPTOR_PASSWORD");
        if (password == null || password.isEmpty()) {
            password = ""; // 기본값 제공 (운영 환경에서는 사용 지양)
            System.out.println("[WARNING] JASYPT_ENCRYPTOR_PASSWORD가 설정되지 않아 기본 키를 사용합니다.");
        }
        config.setPassword(password);
        
        // 암호화 알고리즘 설정
        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;
    }
}

 

 

3. Jasypt 암호화 테스트 (EncryptionTest.java)

Jasypt 암호화 및 복호화가 정상적으로 동작하는지 확인하는 JUnit 테스트 코드를 작성합니다.

@SpringBootTest
public class EncryptionTest {
    
    @BeforeAll
    static void setup() {
        System.setProperty("JASYPT_ENCRYPTOR_PASSWORD", "");
    }
    
    @Test
    public void testEncryption() {
        // 환경 변수에서 암호화 키를 가져옴
        String password = System.getenv("JASYPT_ENCRYPTOR_PASSWORD");
        if (password == null || password.isEmpty()) {
            password = "keystrom";
        }

        // 암호화기 설정
        StringEncryptor encryptor = new JasyptConfig().stringEncryptor();

        // 테스트할 데이터
        String dbUrl = "your-db-url";
        String dbUsername = "your-username";
        String dbPassword = "your-password";

        // 암호화
        String encryptedUrl = encryptor.encrypt(dbUrl);
        String encryptedUsername = encryptor.encrypt(dbUsername);
        String encryptedPassword = encryptor.encrypt(dbPassword);

        // 암호화된 결과 출력
        System.out.println("Encrypted URL: " + encryptedUrl);
        System.out.println("Encrypted Username: " + encryptedUsername);
        System.out.println("Encrypted Password: " + encryptedPassword);

        // 암호화된 값이 null이 아닌지 확인
        assertNotNull(encryptedUrl);
        assertNotNull(encryptedUsername);
        assertNotNull(encryptedPassword);
    }
}

 

 

4. IntelliJ 환경 변수 설정

로컬 개발 환경에서 JASYPT_ENCRYPTOR_PASSWORD를 설정하려면 IntelliJ Run/Debug Configurations에서 환경 변수를 추가해야 합니다.

설정 방법

  1. Run/Debug Configurations 창을 엽니다.
  2. 실행할 애플리케이션을 선택한 후 Edit Configurations... 클릭
  3. Environment Variables 섹션에서 JASYPT_ENCRYPTOR_PASSWORD=your-secret-key 추가
  4. ApplyOK → 애플리케이션 실행

5. Docker 환경에서 Jasypt 적용

서버에 배포할 때, 환경 변수를 올바르게 설정해야 합니다.

 

docker-compose.yml에서 설정

version: '3'
services:
  app:
    image: your-image-name
    environment:
      - JASYPT_ENCRYPTOR_PASSWORD=your-secure-password

 

 

6. application.yml에서 암호화된 값 사용하기

암호화된 데이터를 application.yml에 저장할 때는 ENC()로 감싸야 합니다.

spring:
  datasource:
    url: ENC(encrypted-db-url)
    username: ENC(encrypted-username)
    password: ENC(encrypted-password)

 

Jasypt를 활용하면 민감한 정보를 안전하게 관리할 수 있습니다.