Spring에서 설정파일(properties) 암호화 하기 (with jasypt)

주의

이 문건은 과거 Hexo 블로그 (2017-12-21) 에서 이동된 문서입니다.

시간이 지남에 따라 최신 기술과 다를 수 있으니 주의 바랍니다.



Spring에서 설정파일을 감추고 싶다…

Spring Framework를 이용하여 프로젝트를 진행할 때 데이터베이스 정보나 기타 민간함 정보를 설정파일에 작성하게 됩니다.
물론 Java Config를 사용하게 된다면 상관 없지만, 저는 주로 application.yml(또는 application.properties)을(를) 사용합니다.

문제는 이 설정파일의 경우 배포 시 노출이 되어 보안에 문제가 생길 수 있습니다. (물론 Java Config도 100% 안전한 것은 아니지만…)

그래서 이런 고민을 해결해 줄 라이브러리를 하나 소개하려 합니다.


Jsaypt(Java Simplified Encryption) 를 써보자

Jasypt는 위에서 언급했던 문제를 해결해주는 자바 라이브러리입니다.
좀 더 자세한 내용은 Jasypt 공식 문서를 확인해주세요.

그럼 이제 Jsaypt를 사용하는 법에 대하여 알아보도록 하겠습니다.
이번 예제에 사용하는 Spring은 Spring Boot 1.5.8.RELEASE 이고, gradle을 사용합니다.


1. Jsaypt를 gradle에 추가하기

Spring boot에서 jasypt를 사용하기 위해서는 아래의 의존성을 gradle을 추가해줍니다.

1.1 spring-boot-starter 용

compile "com.github.ulisesbocchio:jasypt-spring-boot-starter:1.17"

1.2 @SpringBootApplication 또는 @EnableAutoConfiguration 를 사용하지 않는 경우

compile "com.github.ulisesbocchio:jasypt-spring-boot:1.17"

1.2 항목에서는 위 gradle을 추가한 이후 Configuration클래스에 @EnableEncryptableProperties를 추가해줍니다.

좀 더 자세한 내용은 ulisesbocchio Github를 참고하세요.


2. Config 클래스 작성

@Configuration
public class JasyptConfig {

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("test"); //암호화에 사용할 키 -> 중요
        config.setAlgorithm("PBEWithMD5AndDES"); //사용할 알고리즘
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}

설정 클래스를 하나 만들고 위와 같이 작성을 하여 jasyptStringEncryptor 빈을 만들어줍니다.


3. 설정파일에 추가 [application.yml(또는 application.properties)]

jasypt:
  encryptor:
    bean: jasyptStringEncryptor

설정파일에 위 항목을 추가해줍니다. bean에는 2번에서 작성한 bean의 이름을 작성합니다.


4. 암호화 할 내용을 작성

이제 암호화 할 데이터를 암호화 해야 합니다.
다양한 방법이 있지만 일단 간편하게 빠르게 쓰기 위해서 ApplicationCommandLineRunner를 활용하는 방법을 사용하겠습니다.

jasypt에서 다운로드 후 java로 직접 실행하는 방법도 있습니다.

....(다른 설정 어노테이션)
@SpringBootApplication
public class Application implements CommandLineRunner {

	public static void main(String [] args) {
        SpringApplication.run(Application.class, args);
        System.out.println("=========== Server Start ===========");
	}

	@Override
   public void run(String... args) throws Exception {
		StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
		pbeEnc.setAlgorithm("PBEWithMD5AndDES");
		pbeEnc.setPassword("test"); //2번 설정의 암호화 키를 입력

		String enc = pbeEnc.encrypt("1234"); //암호화 할 내용
		System.out.println("enc = " + enc); //암호화 한 내용을 출력

		//테스트용 복호화
		String des = pbeEnc.decrypt(enc);
		System.out.println("des = " + des);
   }
}

위와 같이 진행할 경우 암호화 한다면 ENC(fncHYmDe1oSFNFV8FcAEDa==) 와 같은 값이 나오고 복호화 시 1234가 정상적으로 출력됩니다.

이렇게 암호화 할 내용을 만든 후 다음과 같이 설정파일에 작성을 해줍니다.

spring:
  datasource:
    sql-script-encoding: UTF-8
    driver-class-name: org.mariadb.jdbc.Driver
    url: ENC(fAcHYhDi1oSaAF8FcAEDQ==)
    username: ENC(fncHYmDe8oSFAFV8FcAEDQ==)
    password: ENC(Aqh1BctIkm9uBNolQ5xlSg==)

그리고 다시 서버를 실행해보면 정상적으로 실행됩니다.


Written by@MHLab
로또는 흑우집합소 🎲
와인관리, 시음노트, 셀러관리는 마와셀 🥂

🫥 My Service|  📜 Contact|  💻 GitHub