application.yml 설정값 노출 관리하기

개요

 스프링 프로젝트에서 데이터베이스 연결정보, 서버 포트, 로깅수준 같은 어플리케이션에 관련된 다양한 설정값들을 저장하기 위해서 application.yml을 사용한다. 그런데 이러한 정보들 중에는 외부로 노출되어서는 안되는 값들이 많이 존재하기 때문에, 아무 생각없이 Github과 같은 public 저장소에 올렸다가는 정보가 다 털릴 수 있다.

 

이미 몇번 당한 적이 있다..ㅋㅋ

(백엔드에서 잘 처리해놨다고 생각해도 어떤식으로든(노션, 발표자료, organization 등등..) 노출될 수 있으니 항상 조심하자)

 

어쨌든 모든 git repository를 private로 닫아둘수는 없으므로, public으로 열어두려면 아예 configuration파일 자체의 노출을 막거나, 암호화하는 등의 처리를 해주어야 하는데, 그 방법들에 대해서 다루어보도록 하겠다.

 

 

 

1. .gitigore 사용하기

 제일 간단한 방법으로, .gitignore파일에 yml파일을 ignore설정해서 깃헙 레포에 올라가지 않도록만 해주면 된다. 하지만 빌드에 필요한 설정파일이 원격 저장소로 아예 올라가지 않기 때문에, 원격 레포에서도 설정파일을 필요로 하는 경우(CI를 위해 build를 거쳐야 하는 경우 등)는 사용할 수 없는 방법이라는 문제가 있다.

 

 

2. Override Configuration Properties

 

 인텔리제이에서 configuration property값들을 name-value형태로 저장해둘 수 있다. 저장해둔 값들은 yml에서 위와 같이 활용할 수 있다. 비슷하게 깃헙 원격 레포지토리에서는 Repository Secrets라는 이름으로, 그리고 ec2같은 원격 서버에서는 환경변수로 값들을 key-value형태로 관리할 수 있기 때문에 해당 방법으로 CI-CD 파이프라인까지 구축할 수 있다.

 

 

 

 기본적으로 test모듈의 설정파일의 경우 main의 설정파일을 그대로 받고, 차이가 있는 부분은 test모듈의 설정파일로 반영되기 때문에 테스트 환경에서만 필요한 구성정보를 test 모듈 내의 yml에 정의해놓고 사용하면 된다고 알고 있었다.

그런데 사용하다보니 내 문제인지는 몰라도, 테스트코드에서 property값이 정상적으로 주입되지 않는 문제가 발생했다. 

 

 

기존에는 테스트환경에서 항상 h2 database로 인메모리 db를 별도로 사용해서 몰랐는데, 테스트 프로젝트에서 우연히 main과 동일한 db를 사용하려다 보니 위와 같이 database access 오류가 떴고, main에 있는 application.yml을 configuration property를 사용하지 않고 하드코딩해주니 동작하는 것을 발견했다.

 

나는 인텔리제이에서 제공하는 "Override Configuration Properties" 설정을 이용했는데, 테스트 코드에서는 해당 설정을 이용할 수 없었다. test모듈에서는 아예 시스템 환경변수를 이용하거나, 하드코딩하거나, 보안이 걱정된다면 원격 저장소에 올라가지 않도록 ignore하는 방법을 이용해야 할 듯 싶다.

 

 

3. jasypt를 사용한 암호화