티스토리 뷰

properties 파일을 구성할때 암호화가 필요한 부분들이 존재한다. 가장 대표적인 예가 datasource의 username, password 부분이다. 이것들은 정말 다양한 방법을 통해서 암호화가 되고 있지만 요즘 추세는 datasource의 설정을 ApplicationContext가 아닌 properties(yml) 파일에서 하므로 여기에서 암호화를 하는 방법에 대해서 알아보자.

 

properties 파일에서 암호화를 쉽게 할수 있도록 도와주는 Jasypt (Java Simplified Encryption) 라는 것이 있다. 이것을 사용해서 암호화를 해보자. 


Springboot에서 Jasypt를 사용하여 properties 파일 암호화

 

pom.xml

<dependency>
  <groupId>com.github.ulisesbocchio</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>1.18</version>
</dependency>

jasypt-spring-boot-starter dependency를 추가해주면 된다. springboot의 여느 기능이 그러듯이 jasypt 도 springboot 측에서 편리하게 사용할 수 있도록 바뀌었다. 

 

Config class

@Configuration
public class JasyptConfig {

   @Bean("jasyptStringEncryptor")
   public StringEncryptor stringEncryptor() {
      PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
      SimpleStringPBEConfig config = new SimpleStringPBEConfig();
      config.setPassword("oingdaddy");
      encryptor.setConfig(config);
      return encryptor;
    }
}

 

클래스 이름에서도 알수 있듯이 Jasypt 설정을 하는 Config class 이다. 여기서 주의해야 할곳은 setPassword() 부분이다. 다른 설정항목들은 비록 코드에는 없지만 다 기본값이 있고 설정하지 않으면 기본값이 설정되지만 password는 아니다. password는 암호화를 할 key 값을 의미하기 때문에 꼭 내가 지정을 해줘야하는 값이다. 기본값은 어디에서 설정이 되는가? Jasypt 내부 클래스인 JasyptEncryptorConfigurationProperties 안에서 기본값을 정해놓고 있다. 

 

JasyptEncryptorConfigurationProperties (주석은 지움) 작성 안해도 됨

package com.ulisesbocchio.jasyptspringboot.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

@ConfigurationProperties(prefix = "jasypt.encryptor", ignoreUnknownFields = true)
@Data
public class JasyptEncryptorConfigurationProperties {

    private Boolean proxyPropertySources = false;
    private String bean = "jasyptStringEncryptor";
    private String password;
    private String algorithm = "PBEWithMD5AndDES";
    private String keyObtentionIterations = "1000";
    private String poolSize = "1";
    private String providerName = null;
    private String saltGeneratorClassname = "org.jasypt.salt.RandomSaltGenerator";
    private String stringOutputType = "base64";
    
    @NestedConfigurationProperty
    private PropertyConfigurationProperties property = new PropertyConfigurationProperties();
    
    @Data
    public static class PropertyConfigurationProperties {
        private String detectorBean = "encryptablePropertyDetector";
        private String resolverBean = "encryptablePropertyResolver";       
        private String prefix = "ENC(";
        private String suffix = ")";
    }
}

 

이런 기본값들이 여기 다 들어가있다. 위에서 설명한대로 password는 미리 설정되어 있는 값이 없다. 즉 이 항목은 내가 직접 기재를 해줘야 한다. 기본 설정값을 사용하기 싫다면 JsayptConfig 에서 값을 추가를 해주던지 아니면 application.properties 파일에서 재정의를 하면 된다. 재정의를 하는 방법은 application.properties에서 

jasypt.encryptor.bean=commonEncryptor

 

 

이와 같은 방식으로 JasyptEncryptorConfigurationProperties 의 내용을 조합해서 재정의를 하면 된다. 하지만 properties 파일을 암호화를 하는것이 목적인데 properties 에 암호화 관련된 설정을 넣는것은 적절하지 않으므로 웬만하면 Config class에 옵션을 추가해주는 방식으로 진행하자. config.setPassword() 처럼 다른 옵션들도 설정할 수 있다. 

 

이제 설정이 끝났다면 암호화할 값에 대한 encoding 작업이 필요하다. 이것은 testcase를 만들어서 추출할수도 있고 Java를 직접 실행해서 추출할 수도 있지만 springboot 환경에서 가장 간단하게 테스트 환경을 구성할 수 있는 CommandLineRunner를 impl 해서 하는 방식으로 진행을 했다. 

 

Application.java (springboot 실행클래스)

@SpringBootApplication
public class JasyptsampleApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(JasyptsampleApplication.class, args);
    }
	
    public void run(String... args) throws Exception {
        StandardPBEStringEncryptor spe = new StandardPBEStringEncryptor();
        spe.setAlgorithm("PBEWithMD5AndDES");
        spe.setPassword("ogingdaddy");
        System.out.println("db username = " + spe.encrypt("db username")); 
        System.out.println("db password = " + spe.encrypt("db password")); 
    }
}

 

StandardPBEStringEncryptor 를 사용해서 필요한 값들에 대해 암호화를 하고 app을 기동한다. 기동이 완료되면 마지막에 다음과 같은 문장이 출력이 될것이다. 

 

이렇게 암호화할 값에 대해 encoded string을 구했다면 이값을 properties 파일의 암호화를 적용할 부분에 JasyptEncryptorConfigurationProperties 에서 정의한대로 다음과 같은 형식으로 넣어준다. 

 

application.properties

spring.datasource.username=ENC(p+f0c4embQUEdhl7k7PVNMoDN6D87XS2)
spring.datasource.password=ENC(9T5kaIIovBpCQnnyJ+uHWode4mipQnvv)

 

ENC(encoded string) 형식으로 넣어주면 된다.

 

끝!

 

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30