티스토리 뷰
스프링으로 개발을 하다 보면 application.yml 또는 application.properties 설정 파일에 있는 리소스를 암호화해야 하는 경우가 있습니다. 이번에는 리소스의 내용을 암호화하여 노출시키지 않는 방법에 대해 알아보도록 하겠습니다.
1. Jasypt와 jasypt-spring-boot 라이브러리
[ Jasyp와 jasypt-spring-boot 라이브러리 ]
Jasypt 라이브러리는 암호화에 대한 깊은 지식이 없어도 최소한의 비용으로 암호화 기능을 제공할 수 있도록 도와주는 자바 라이브러리이다. 자바 애플리케이션에서는 Jasypt 라이브러리를 사용해 리소스를 손쉽게 암/복화를 구현할 수 있다.
하지만 일반적으로 자바는 스프링 애플리케이션에서 주로 사용된다. 스프링으로 개발을 하다 보면 application.yml 또는 application.properties에 있는 리소스를 암호화해야 하는 경우가 있다. 예를 들어 DB 비밀번호나 개인키 등이 프로퍼티 파일에 작성되는데, 이러한 경우에 Jasypt를 스프링에 손쉽게 통합할 수 있는 라이브러리인 jasypt-spring-boot 라이브러리를 사용하면 된다. 참고로 해당 라이브러리는 스프링 공식 라이브러리가 아닌 개인이 만든 오픈 소스 라이브러리이다.
[ jasypt-spring-boot 설정 방법 ]
jasypt-spring-boot를 이용하는 방법은 크게 3가지가 존재한다. 일반적으로 첫 번째 방법으로 사용하면 된다. 다른 방법들에 대한 내용은 해당 프로젝트의 README에 친절히 작성되어 있으니 필요하다면 참고하도록 하자.
- @SpringBootApplication or @EnableAutoConfiguration를 사용중인 경우에 jasypt-spring-boot-starter 의존성을 추가해주기만 하면 됨
- jasypt-spring-boot 의존성을 추가하고 @EnableEncryptableProperties을 설정 파일에 추가하면 됨
- jasypt-spring-boot 의존성을 추가하고 개별 프로퍼티 소스에 @EncrytablePropertySource를 붙여주면 됨
[ jasypt-spring-boot 적용 방법 ]
그러면 실제로 jasypt-spring-boot를 이용해 암호화된 리소스를 사용하도록 수정해보자.
- 의존성 추가
- 설정 클래스 작성
- 암호화된 리소스 값으로 설정값 수정하기
1. 의존성 추가
가장 먼저 해당 라이브버리에 대한 의존성을 추가해준다. 그러면 자동 설정(AutoConfig)이 동작하여 기본적인 설정은 끝이다.
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
2. 설정 클래스 작성
그 다음은 주어진 리소스를 암호화 및 복호화하기 위한 전용키와 이를 활용하는 설정 클래스를 작성해주어야 한다. 이러한 클래스를 작성하면 다음과 같다. 작성되지 않은 부분은 기본값이 있기 때문에 필요 시에 설정해주면 된다. 참고로 여기서 KEY 값 역시도 외부에서 전달해줄 수 있는데, 여기서는 간단하게 하드코딩해서 사용하도록 해두었다.
@Configuration
public class JasyptConfig {
final static String KEY = "default!23";
final static String ALGORITHM = "PBEWithMD5AndDES";
@Bean
public StringEncryptor jasyptStringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(KEY);
config.setAlgorithm(ALGORITHM);
encryptor.setConfig(config);
return encryptor;
}
}
3. 암호화된 리소스 값으로 설정값 수정하기
jasypt-spring-boot는 다음과 같이 값이 설정되어 있는 경우에 복호화를 시도한다.
ENC(암호화값)
그러므로 기존에 작성되어 있는 값을 암호화된 값으로 수정해주어야 하는데, 해당 부분은 아래의 테스트를 사용하면 편리하다. privateKey를 암호화해야 하는 경우라면 resources 하위에 privateKey.txt를 만들어주면 되고, 단순 String이라면 변수값을 수정해주면 된다. 테스트 실행 후에 출력된 결과인 ENC(암호화값)을 리소스에 작성해주면 된다.
class JasyptConfigTest {
@Test
void privateKey암호화() throws IOException {
ClassPathResource resource = new ClassPathResource("privatekey.txt");
String privateKey = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
standardPBEStringEncryptor.setAlgorithm(JasyptConfig.ALGORITHM);
standardPBEStringEncryptor.setPassword(JasyptConfig.KEY);
String enc = standardPBEStringEncryptor.encrypt(privateKey);
System.out.printf("enc = ENC(%s)\\n", enc);
System.out.printf("dec = %s\\n", standardPBEStringEncryptor.decrypt(enc));
}
@Test
void string암호화() {
String privateKey = "myKey";
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
standardPBEStringEncryptor.setAlgorithm(JasyptConfig.ALGORITHM);
standardPBEStringEncryptor.setPassword(JasyptConfig.KEY);
String enc = standardPBEStringEncryptor.encrypt(privateKey);
System.out.printf("enc = ENC(%s)\\n", enc);
System.out.printf("dec = %s\\n", standardPBEStringEncryptor.decrypt(enc));
}
}
개인적으로는 데이터베이스 비밀번호와 스프링 클라우드 설정(Spring Cloud Config)를 위한 privateKey 값을 암호화하는데 적용하였습니다. 이후에 다른 부분들에도 필요하면 추가 적용할 예정입니다. 감사합니다.
'Spring' 카테고리의 다른 글
[Spring] RestTemplate에 Resilence4J 서킷 브레이커 적용하는 방법과 예시 (0) | 2023.03.28 |
---|---|
[Spring] OpenFeign에 Resilence4J 서킷 브레이커 적용하는 방법과 예시 및 주의사항 (0) | 2023.03.21 |
[Spring] ObjectMapper의 동작 방식과 SpringBoot가 제공하는 추가 기능들 (16) | 2023.01.10 |
[Spring] POJO 프로그래밍과 스프링 프레임워크의 탄생 (8) | 2022.11.29 |
[Spring] OpenFeign 타임아웃(Timeout), 재시도(Retry), 로깅(Logging) 등 설정하기 (11) | 2022.11.22 |