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에서 환경 변수를 추가해야 합니다.
설정 방법
- Run/Debug Configurations 창을 엽니다.
- 실행할 애플리케이션을 선택한 후 Edit Configurations... 클릭
- Environment Variables 섹션에서 JASYPT_ENCRYPTOR_PASSWORD=your-secret-key 추가
- Apply → OK → 애플리케이션 실행
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를 활용하면 민감한 정보를 안전하게 관리할 수 있습니다.