Spring

SpringBoot 중요한 설정 숨기기

Andrew-Yun 2022. 1. 12. 14:44

스프링부트를 사용하여 개발하다 보면 여러 property들을 관리할 일이 생긴다. github와 같은 오픈된 저장소를 사용할 때 중요한 시크릿 키들을 같이 올리면 탈취당할 우려가 있다. 따라서 이러한 설정들을 숨기기 위해 내가 사용한 방법을 정리하고자 한다.

 

프로퍼티 우선 순위

1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties

2. 테스트에 있는 @TestPropertySource

3. @SpringBootTest 애노테이션의 properties 애트리뷰트

4. 커맨드 라인 아규먼트

5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는

프로퍼티

6. ServletConfig 파라미터

7. ServletContext 파라미터

8. java:comp/env JNDI 애트리뷰트

9. System.getProperties() 자바 시스템 프로퍼티

10. OS 환경 변수

11. RandomValuePropertySource

12. JAR 밖에 있는 특정 프로파일용 application properties

13. JAR 안에 있는 특정 프로파일용 application properties

14. JAR 밖에 있는 application properties

15. JAR 안에 있는 application properties

16. @PropertySource

17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

 

스프링부트는 위와 같은 우선순위로 프로퍼티들을 탐색한다. 커맨드라인 방법은 빌드 실행 스크립트가 길어져 불편하고, OS 환경 변수는 도커 컨테이너를 사용하면 간단하게 해결할 수 있다. 하지만 나의 경우 도커를 통한 배포는 아직 이루어지지 않아 패스했다.

쉬운 방법은 그냥 배포될 곳에 미리 파일을 만들어 빌드할 때, classpath에 포함시키면 된다. 다만 변경 이력을 관리할 수 없다는 단점이 있다. 

그렇기 때문에 중요한 시크릿 키들만 따로 빼서 yml 혹은 properties로 구성하는게 좋다.

실행 스크립트는 다음과 같다.

java -jar -Dspring.config.location=classpath:[추가할 설정파일 경로] \
-Dspring.profiles.active=[활성화할 프로필]

 

사실 이렇게 해도 끝나지만 편의를 위해 프로필을 여러 파일로 나눈 경우도 생각해볼 수 있다. 스프링부트 2.4 이상부터 profile group을 설정할 수 있다. 활성화 프로필에 다른 프로필들의 그룹을 묶어 한꺼번에 활성화 시킬 수 있다.

#application.yml
spring:
  profiles:
    group:
      local: local-db, local-secret
      prod: prod-db, prod-secret
#application-prod-db.yml
spring:
  config:
    activate:
      on-profile: prod-db #prod가 활성화되면 같이 활성화

-Dspring.active.profile = prod로 활성화하면 prod-db, prod-secret, prod가 모두 활성화된다.

이렇게 DB, JWT 시크릿 값 두 개를 분리했다. 간단하지 않은가?