Spring의 application.yml(.properties)과 같은 설정 정보 파일에는 데이터 베이스 연결 정보나 API 키, 비밀번호와 같은 민감한 정보를 설정해야 하는 경우가 있다. 이러한 민감한 정보를 평문으로 설정하게 되면 간혹 정보가 노출되었을 때 심각한 문제를 초래 할 수 있다. Jasypt 라이브러리를 사용하여 어플리케이션의 설정 정보를 암호화하여 민감한 정보를 보호할 수 있다. 간단한 예제 코드와 함께 spring에서 Jasypt 라이브러리를 사용하는 방법에 대해서 기록한다.
Jasypt for Spring boot
Jasypt는 Spring boot 2.X 버전과 3.X 버전과 통합을 지원한다. 상세한 문서는 jasypt-spring-boot git을 참고하면 도움이 된다.
프로젝트에 jasypt-spring-boot을 통합하는 방법에는 3가지가 있다.
- @SpringbootApplication 혹은 @EnableAutoConfiguration 어노테이션을 지정하는 경우 jasypt-spring-boot-starter 디펜던시만 추가하면 전체 spring environment에서 암호화 가능한 속성을 활성화 할 수 있다.
- jasypt-spring-boot(jasypt-spring-boot-starter 아님) 디펜던시를 추가하고 @Configuration 클래스에 @EnableEncryptableProperties 어노테이션을 추가하여 전체 spring environment에서 암호화 가능한 속성을 활성화 할 수 있다.
- jasypt-spring-boot 디펜던시를 추가하고 개별 암호화 가능한 프로퍼티 소스를 @EncryptablePropertySource에 지정하여 특정 설정파일에 대해서 암호화 가능한 속성을 활성화 할 수 있다.
jasypt-spring-boot-starter 디펜던시를 추가하면 자동으로 jasypt-spring-boot 디펜던시가 추가된다.
dependency
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
@SpringBootApplication 혹은 @EnableAutoConfiguration 어노테이션을 사용하는 경우 위 디펜던시를 추가하면 모든 시스템 속성, 환경 속성, 명령줄 인수, application.properties, application-*.properties[.yml] 의 속성에 암호화된 속성을 포함할 수 있다.
@SpringBootApplication 혹은 @EnableAutoConfiguration 어노테이션을 사용하지 않는 경우 아래 디펜던시를 추가하고 @Configuration 클래스에 @EnableEncryptableProperties 어노테이션을 지정하여 모든 시스템 속성, 환경 속성, 명령줄 인수, application.properties, application-*.properties[.yml] 의 속성에 암호화된 속성을 포함할 수 있다.
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>3.0.5</version>
</dependency>
@Configuration
@EnableEncryptableProperties
public class MyApplication {
...
}
@SpringBootApplication 혹은 @EnableAutoConfiguration 어노테이션을 사용하지 않고 특정 속성 파일에 대해서만 암호화된 속성을 활성화 하려면 아래와 같이 설정한다.
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>3.0.5</version>
</dependency>
@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {
...
}
encrypted.properties 파일에 대해서만 암호화된 속성을 설정할 수 있도록 한다.
비밀번호 기반의 암호화 설정 구성
Jasypt는 비밀번호 기반의 암호화를 구성해야 한다. jasypt 암호화를 구성하기 위한 기본 설정은 아래와 같다.
Key | Required | Default Value |
jasypt.encryptor.password | True | - |
jasypt.encryptor.algorithm | False | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | False | 1000 |
jasypt.encryptor.pool-size | False | 1 |
jasypt.encryptor.provider-name | False | SunJCE |
jasypt.encryptor.provider-class-name | False | null |
jasypt.encryptor.salt-generator-classname | False | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generator-classname | False | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | False | base64 |
jasypt.encryptor.proxy-property-sources | False | false |
jasypt.encryptor.skip-property-sources | False | empty list |
jasypt.encryptor.password 항목만 필수이고 나머지 설정 항목은 모두 옵션이다. 설정 정보를 암호화하여 사용하기 위한 용도로는 password 항목만 설정하고 나머지는 그냥 디폴트로 사용해도 충분할 것 같다.
디폴트 encryptor 사용
@SpringBootApplication 어노테이션을 사용하는 경우 Auto Configuration 이 적용되어 StringEncryptor 빈을 자동 주입받아 사용할 수 있다. StringEncryptor 는 인터페이스이고 구현체 클래스는 아래와 같다.
디폴트 StringEncryptor는 DefaultLazyEncryptor 이고 jasypt.encryptor.password 가 설정되어 있어야 한다. 아래는 디폴트 StringEncryptor를 사용한 테스트 코드이다.
package com.example.jpa.jasypt;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.assertj.core.api.Assertions;
import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
//@EnableAutoConfiguration 을 사용하지 않는 경우
//@EnableEncryptableProperties annotation 을 통해서 default encryptor 를 주입받을 수 있다.
@EnableEncryptableProperties
//내부적으로 @ConfigurationProperties를 통해서 설정정보를 로드 하므로 테스트시에는
//아래 어노테이션을 지정해 줘야 한다.
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
public class DefaultJasyptTest {
@Autowired
private StringEncryptor stringEncryptor;
@Test
void default_jasypt_test() {
String encrypted = stringEncryptor.encrypt("test");
System.out.println("encrypted: " + encrypted);
String decrypted = stringEncryptor.decrypt(encrypted);
System.out.println("decrypted: " + decrypted);
Assertions.assertThat(decrypted).isEqualTo("test");
}
}
jasypt.encryptor.password 설정은 아래와 같다. (application.yml)
jasypt:
encryptor:
password: "test-password"
Custom Encryptor 사용
@Configuration 클래스에서 StringEncryptor 빈을 정의하여 생성할 수 있으며, 기본 Encryptor는 무시된다.
package com.example.jpa.config;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
@Bean("jasyptEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
//암복호화에 사용된 비밀번호 설정 (필수)
config.setPassword("test-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;
}
}
1.5 버전부터 Bean에 이름을 필수로 지정하고 jasypt.encryptor.bean=<빈이름>과 같이 설정해야 한다. @Bean 이름을 지정하지 않으면 default 로 빈 이름은 jasyptStringEncryptor로 설정된다. jasyptStringEncryptor 이름이 아닌 다른 이름을 지정한 경우에는 jasypt.encryptor.bean=<빈이름> 을 설정해야 한다.
application.yml 설정은 아래와 같다.
jasypt:
encryptor:
bean: jasyptEncryptor
위 샘플코드에 지정된 StringEncryptor 빈을 사용하는 테스트 코드를 작성하여 테스트 해보았다.
package com.example.jpa.jasypt;
import com.example.jpa.config.JasyptConfig;
import org.assertj.core.api.Assertions;
import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = JasyptConfig.class)
public class CustomEncryptorTest {
@Autowired
private StringEncryptor jasyptEncryptor;
@Test
void custom_jasypt_test() {
String encrypted = jasyptEncryptor.encrypt("test");
System.out.println("encrypted: " + encrypted);
String decrypted = jasyptEncryptor.decrypt(encrypted);
System.out.println("decrypted: " + decrypted);
Assertions.assertThat(decrypted).isEqualTo("test");
}
}
JasyptConfig에 정의된 StringEncryptor 빈은 PooledPBEStringEncryptor 객체를 생성한다. 위 테스트 코드에서 주입받은 StringEncryptor 클래스의 객체는 PooledPBEStringEncryptor 임을 확인할 수 있다.
위 테스트 코드에서 암호화된 결과는 아래와 같다.
encrypted: vwOUi946+YovW0IRw/O4ePs8JMpx/bhPGge+mnqVQP5W1VgNK9lCcE2s6YoWrdBv
복호화 처리 테스트
jasypt 를 사용하는 경우 암호화된 데이터를 설정하는데 사용되는 prefix와 suffix 는 각각 "ENC("와 ")" 이다.
즉, field: ENC(암호화데이터)와 같이 설정한다.
위 테스트 코드를 통해서 암호화된 데이터를 설정 후에 자동으로 복호화 처리가 되는지 확인해 보자.
우선 application.yml 파일에 암호화 데이터를 설정한다.
encrypted:
data: ENC(vwOUi946+YovW0IRw/O4ePs8JMpx/bhPGge+mnqVQP5W1VgNK9lCcE2s6YoWrdBv)
위 설정은 'test' 문자열을 암호화한 데이터를 설정한 것이다.
아래는 encrypted.data 설정을 @Value 어노테이션으로 decryptedData 변수에 할당하고 확인하는 테스트 코드이다.
package com.example.jpa.jasypt;
import com.example.jpa.config.JasyptConfig;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(
initializers = ConfigDataApplicationContextInitializer.class,
classes = JasyptConfig.class)
//@SpringBootApplication 혹은 @EnableAutoConfiguration을 사용하는
//production 코드에서는 아래 어노테이션을 지정할 필요는 없다.
@EnableEncryptableProperties
public class ReadJasyptConfigTest {
@Value("${encrypted.data}")
private String decryptedData;
@Test
void decryption_config_test() {
Assertions.assertThat(decryptedData).isEqualTo("test");
System.out.println("decrypted config: " + decryptedData);
}
}
위 테스트 코드에서 @SpringBootApplication 어노테이션 혹은 @EnableAutoConfiguration 어노테이션을 사용하는 production 코드에서는 @EnableEncryptableProperties 어노테이션을 지정할 필요는 없다.
위 테스트 코드의 수행 결과는 아래와 같다.
[main] INFO com.ulisesbocchio.jasyptspringboot.configuration.EnableEncryptablePropertiesBeanFactoryPostProcessor -- Post-processing PropertySource instances
[main] INFO com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter -- Skipping PropertySource configurationProperties [class org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource
[main] INFO com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter -- Converting PropertySource test [org.springframework.core.env.MapPropertySource] to EncryptableMapPropertySourceWrapper
[main] INFO com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter -- Converting PropertySource systemProperties [org.springframework.core.env.PropertiesPropertySource] to EncryptableMapPropertySourceWrapper
[main] INFO com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter -- Converting PropertySource systemEnvironment [org.springframework.core.env.SystemEnvironmentPropertySource] to EncryptableSystemEnvironmentPropertySourceWrapper
[main] INFO com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter -- Converting PropertySource random [org.springframework.boot.env.RandomValuePropertySource] to EncryptablePropertySourceWrapper
[main] INFO com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter -- Converting PropertySource Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper
[main] INFO com.ulisesbocchio.jasyptspringboot.filter.DefaultLazyPropertyFilter -- Property Filter custom Bean not found with name 'encryptablePropertyFilter'. Initializing Default Property Filter
[main] INFO com.ulisesbocchio.jasyptspringboot.resolver.DefaultLazyPropertyResolver -- Property Resolver custom Bean not found with name 'encryptablePropertyResolver'. Initializing Default Property Resolver
[main] INFO com.ulisesbocchio.jasyptspringboot.detector.DefaultLazyPropertyDetector -- Property Detector custom Bean not found with name 'encryptablePropertyDetector'. Initializing Default Property Detector
[main] INFO com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor -- Found Custom Encryptor Bean org.jasypt.encryption.pbe.PooledPBEStringEncryptor@22fba58c with name: jasyptEncryptor
decrypted config: test
암호화 설정 형식 변경하기
Jasypt에서 암호화 설정 형식은 'ENC(암호화데이터)' 이다. 이 형식을 custom 하게 변경할 수 있다.
설정으로 변경
jasypt.encryptor.property.prefix, jasypt.encryptor.property.suffix 설정을 통해서 암호화 설정 필드 값 형식을 정의할 수 있다.
jasypt:
encryptor:
property:
prefix: "ENC@["
suffix: "]"
bean: jasyptEncryptor
encrypted:
data: ENC@[vwOUi946+YovW0IRw/O4ePs8JMpx/bhPGge+mnqVQP5W1VgNK9lCcE2s6YoWrdBv]
위와 같이 설정 후 ReadJasyptConfigTest 를 수행하면 정상적으로 복호화 됨을 알 수 있다.
만약 설정을 아래와 같이 설정했다면
jasypt:
encryptor:
property:
prefix: "ENC@["
suffix: "]"
bean: jasyptEncryptor
encrypted:
data: ENC(vwOUi946+YovW0IRw/O4ePs8JMpx/bhPGge+mnqVQP5W1VgNK9lCcE2s6YoWrdBv)
ReadJasyptConfigTest 수행결과는 아래와 같이 오류가 발생하게 된다.
org.opentest4j.AssertionFailedError:
expected: "test"
but was: "ENC(vwOUi946+YovW0IRw/O4ePs8JMpx/bhPGge+mnqVQP5W1VgNK9lCcE2s6YoWrdBv)"
Expected :"test"
Actual :"ENC(vwOUi946+YovW0IRw/O4ePs8JMpx/bhPGge+mnqVQP5W1VgNK9lCcE2s6YoWrdBv)"
즉 encrypted.data 의 설정 값 ENC(...)를 암호화된 데이터로 제대로 인식하지 못하게 된다.
EncryptablePropertyDetector 빈 생성으로 변경
EncryptablePropertyDetector 를 구현한 빈을 정의하여 암호화 설정 형식을 변경할 수 있다. 이 때 Bean 이름은 encryptablePropertyDetector 로 지정하고, 만약 encryptablePropertyDetector가 아닌 다른 이름으로 지정하는 경우에는 jasypt.encryptor.property.detector-bean: <빈 이름> 와 같이 빈 이름을 설정해야 한다. StringEncryptor 빈을 생성하는 경우에도 jasypt.encryptor.bean을 설정해야 하는 것과 같은 방식인데 이는 아래 클래스와 관련이 있다.
@Configuration
public class EncryptablePropertyResolverConfiguration {
private static final String ENCRYPTOR_BEAN_PROPERTY = "jasypt.encryptor.bean";
private static final String ENCRYPTOR_BEAN_PLACEHOLDER = String.format("${%s:jasyptStringEncryptor}", ENCRYPTOR_BEAN_PROPERTY);
private static final String DETECTOR_BEAN_PROPERTY = "jasypt.encryptor.property.detector-bean";
private static final String DETECTOR_BEAN_PLACEHOLDER = String.format("${%s:encryptablePropertyDetector}", DETECTOR_BEAN_PROPERTY);
private static final String RESOLVER_BEAN_PROPERTY = "jasypt.encryptor.property.resolver-bean";
private static final String RESOLVER_BEAN_PLACEHOLDER = String.format("${%s:encryptablePropertyResolver}", RESOLVER_BEAN_PROPERTY);
private static final String FILTER_BEAN_PROPERTY = "jasypt.encryptor.property.filter-bean";
private static final String FILTER_BEAN_PLACEHOLDER = String.format("${%s:encryptablePropertyFilter}", FILTER_BEAN_PROPERTY);
private static final String ENCRYPTOR_BEAN_NAME = "lazyJasyptStringEncryptor";
private static final String DETECTOR_BEAN_NAME = "lazyEncryptablePropertyDetector";
private static final String CONFIG_SINGLETON = "configPropsSingleton";
/** Constant <code>RESOLVER_BEAN_NAME="lazyEncryptablePropertyResolver"</code> */
public static final String RESOLVER_BEAN_NAME = "lazyEncryptablePropertyResolver";
/** Constant <code>FILTER_BEAN_NAME="lazyEncryptablePropertyFilter"</code> */
public static final String FILTER_BEAN_NAME = "lazyEncryptablePropertyFilter";
...
...
...
}
EncryptablePropertyDetector를 implement 한 빈을 생성하는 코드는 아래와 같다.
package com.example.jpa.config;
import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyDetector;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Optional;
@Configuration
public class JasyptConfig {
@Bean("jasyptEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
//암복호화에 사용된 비밀번호 설정 (필수)
config.setPassword("test-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;
}
@Bean(name = "customDetector")
public EncryptablePropertyDetector customDetector() {
return new CustomEncryptablePropertyDetector();
}
private static class CustomEncryptablePropertyDetector implements EncryptablePropertyDetector {
private static final String prefix = "ENC@[";
private static final String suffix = "]";
@Override
public boolean isEncrypted(String property) {
if (property == null) {
return false;
}
final String trimmedValue = property.trim();
return (trimmedValue.startsWith(prefix) &&
trimmedValue.endsWith(suffix));
}
@Override
public String unwrapEncryptedValue(String property) {
return Optional.ofNullable(property)
.map(value -> value.substring(
prefix.length(),
(value.length() - suffix.length())))
.orElse("");
}
}
}
customDetector 이름의 빈을 정의하였다. customDetector 빈은 설정 필드의 암호화 형식인지 여부를 찾는데 사용되었던 DefaultPropertyDetector 를 대신하여 사용된다. isEncrypted 는 설정 값이 암호화 형식이 맞는지 여부를 체크하는 메소드이고 unwrapEncryptedValue 는 prefix, suffix 를 제외한 암호화된 데이터를 추출하여 리턴하는 메소드이다.
application.yml 설정은 아래와 같다.
jasypt:
encryptor:
property:
detector-bean: customDetector
bean: jasyptEncryptor
encrypted:
data: ENC@[vwOUi946+YovW0IRw/O4ePs8JMpx/bhPGge+mnqVQP5W1VgNK9lCcE2s6YoWrdBv]
Jasypt 프로퍼티 복호화 동작 방식
@EnableAutoConfiguration 어노테이션이 지정된 경우 자동으로 JasyptSpringBootAutoConfiguration 클래스가 주입되며 해당 Configuration은 @Import(EnableEncryptablePropertiesConfiguration.class) 를 Import 하는데 EnableEncryptablePropertiesConfiguration 클래스는 EncrytablePropertyResolverConfiguration 클래스를 Import 한다.
EncryptablePropertyResolverConfiguration 클래스는 EncryptablePropertySourceConverter 빈과 사용자 정의 StringEncryptor 빈과 관련된 빈을 생성한다. EncryptablePropertySourceConverter 빈은 BeanFactoryPostProcessor 를 구현한 EnableEncryptablePropertiesBeanFactoryPostProcessor 빈에 주입된다. EnableEncryptablePropertiesBeanFactoryPostProcessor 는 postProcessBeanFactory 메소드를 구현하며 해당 메소드 안에서 PropertySource 객체 타입을 EncryptableMapPropertySourceWrapper 타입으로 convert를 하고 EncryptableMapPropertySourceWrapper를 통해서 사용자가 생성한 StringEncryptor 빈 혹은 디폴트 StringEncryptor 빈을 통해서 복호화 처리가 이루어진다.
아래는 Jasypt 의 JasyptSpringBootAutoConfiguration 클래스 내용이다.
/**
* <p>JasyptSpringBootAutoConfiguration class.</p>
*
* @author Ulises Bocchio
* @version $Id: $Id
*/
@Configuration
@Import(EnableEncryptablePropertiesConfiguration.class)
public class JasyptSpringBootAutoConfiguration {
}
아래는 EnableEncryptablePropertiesConfiguration 클래스 내용이다.
@Configuration
@Import({EncryptablePropertyResolverConfiguration.class, CachingConfiguration.class})
@Slf4j
public class EnableEncryptablePropertiesConfiguration {
/**
* <p>enableEncryptablePropertySourcesPostProcessor.</p>
*
* @param environment a {@link org.springframework.core.env.ConfigurableEnvironment} object
* @param converter a {@link com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter} object
* @return a {@link com.ulisesbocchio.jasyptspringboot.configuration.EnableEncryptablePropertiesBeanFactoryPostProcessor} object
*/
@Bean
public static EnableEncryptablePropertiesBeanFactoryPostProcessor enableEncryptablePropertySourcesPostProcessor(final ConfigurableEnvironment environment, EncryptablePropertySourceConverter converter) {
return new EnableEncryptablePropertiesBeanFactoryPostProcessor(environment, converter);
}
}
위 Configuration 파일에서 BeanFactoryPostProcessor 를 구현한 EnableEncryptablePropertiesBeanFactoryPostProcessor 빈을 생성하는 것을 알 수 있다.
@EnableEncryptableProperties 어노테이션 역시 @Import(EnableEncryptablePropertiesConfiguration.class) 를 Import 하여 위 설명과 동일한 로직으로 암호화 된 설정 데이터를 복호화를 진행하게 된다. 이때 복호화에 사용되는 StringEncryptor 는 Configuration 으로 생성한 StringEncryptor 빈이 복호화를 수행하게 된다. 아래는 @EnableEncryptableProperties 어노테이션 파일 내용이다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import(EnableEncryptablePropertiesConfiguration.class)
public @interface EnableEncryptableProperties {
}
지금까지 Spring에서 jasypt-spring-boot을 이용하여 config 데이터를 암호화하여 사용하는 방법에 대해서 알아 보았다. jasypt-spring-boot 의 github 문서에는 더 많은 내용이 있지만 여기까지만 해도 충분하다고 생각한다.
참고링크
https://github.com/ulisesbocchio/jasypt-spring-boot
'스프링부트' 카테고리의 다른 글
spring boot application startup tracking (0) | 2023.09.17 |
---|---|
Spring boot embedded server 의 default 포트 변경 (0) | 2023.09.16 |
Spring SSE (Server Sent Event) 사용 방법 (0) | 2023.09.09 |
Spring Boot GraalVM Native Image 빌드 하기 (0) | 2023.09.04 |
spring boot resource 파일 access (0) | 2023.08.27 |
댓글