스프링부트

Spring에서 Jasypt를 이용하여 설정 정보 암호화 하기

알쓸개잡 2023. 9. 9.

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가지가 있다.

  1. @SpringbootApplication 혹은 @EnableAutoConfiguration 어노테이션을 지정하는 경우 jasypt-spring-boot-starter 디펜던시만 추가하면 전체 spring environment에서 암호화 가능한 속성을 활성화 할 수 있다.
  2. jasypt-spring-boot(jasypt-spring-boot-starter 아님) 디펜던시를 추가하고 @Configuration 클래스에 @EnableEncryptableProperties 어노테이션을 추가하여 전체 spring environment에서 암호화 가능한 속성을 활성화 할 수 있다.
  3. 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

 

GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot

Jasypt integration for Spring boot. Contribute to ulisesbocchio/jasypt-spring-boot development by creating an account on GitHub.

github.com

http://www.jasypt.org/

 

Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Main

Jasypt 1.9.3 RELEASED! (May 25th, 2019) [DOWNLOAD and ChangeLogs] [WHAT'S NEW IN JASYPT 1.9] Java Simplified Encryption Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and wi

www.jasypt.org

 

댓글

💲 추천 글