issue secret‐config - f-lab-edu/at_ticket GitHub Wiki

secret 정보 관리

개요

개발을 하다 보면 DB 접속 정보나 외부 서비스의 API_KEY, ID, PW 같이 외부에 노출되면 안되는 정보들이 있습니다.
소스가 private repository에서 관리 된다면 상관 없겠지만, public repository라면 소스에는 절대로 올라가서는 안됩니다.
결국 외부에서 이러한 정보가 주입 되어야 하는데, 외부에서 설정값을 주입할 수 있는 방법과 저희 서비스가 필요로 하는 조건들을 생각해 보았습니다.

방법

  • application.properties 방식 - application.properties(or application.yml)에 직접 secret 정보 등록

  • shell 환경변수 방식 - shell 환경변수에 secret 정보 등록

  • env 파일 방식 -env 파일에 secret 정보 등록

조건

1. 멀티 모듈 프로젝트이기 때문에 여러 모듈에서 동시에 사용할 수 있어야 한다.
2. docker-compose를 통해 application을 실행하기 때문에 docker-compose.yml 파일에서도 사용할 수 있어야 한다.
3. 어떤 환경(로컬,개발,상용)이든 동일하게 실행할 수 있어야 한다.

선택

  • application.properties

    • 만족
      • 3번 조건
    • 불만족
      • 1번 조건 (모든 모듈에 적어주어야 함)
      • 2번 조건 (docker-copomse.yml에서 사용할 수 없음)
  • shell 환경변수 방식

    • 만족
      • 1번 조건 (shell 변수를 java application에서 사용할 수 있음)
      • 2번 조건 (shell 변수를 docker-compose.yml에서 사용할 수 있음)
    • 불만족
      • 3번 조건 불만족 (로컬 환경은 각자 개발자들의 운영체제가 달라 shell 변수를 입력하는 방식이 다를 수 있어 동일하게 실행하기 어렵다.)
  • env 파일 방식

    • 만족
      • 1번 조건 (env 변수를 java application에서 사용할 수 있음)
      • 2번 조건 (env 변수를 docker-compose.yml에서 사용할 수 있음)
      • 3번 조건 부분 만족 (절대 경로가 아닌 공통 모듈 안에 넣어서 사용한다면 여러 환경에서 동일하게 사용할 수 있음)
    • 불만족
      • 없음

위에 제시한 3가지 방법들을 저희가 필요한 조건에 대입하여 비교해 보았을때 env 파일 방식이 모두 조건을 만족했기 때문에 env 파일 방식을 선택했습니다.

적용

현재 저희 프로젝트의 구조는 아래 사진과 같습니다.
image

at_ticket이라는 root 디렉토리 밑에 여러 모듈들이 존재하고 docker-compose.yml이 위치하고 있습니다.
여기서 만약 env 파일을 root 디렉토리 경로에 추가를 하게 된다면, 모듈들에서는 절대 경로로밖에 접근할 수 없게 됩니다.

@Configuration
@PropertySource("file:{{local secret config 경로}}/.env")
@Profile("local")
public class SecretConfig {
}

다른 개발자들과 동일한 서버 세팅을 사용하는 dev, prod Profile의 경우는 정해진 위치에 env 파일이 있을 것이지만, local의 경우 개발자마다 파일의 위치가 다르기 때문에 실행할 때 괄호 안의 코드를 자신의 경로에 맞게 수정해줄 필요가 있을 것입니다.

그래서 저희는 env 파일을 직관적이지는 않지만 common 공통 모듈 내에 위치 시킴으로써, classpath를 사용하여 모든 모듈에서 접근할 수 있도록 하였습니다.
이렇게 하면 local에서도 소스를 수정하지 않고 실행할 수 있습니다.

@Configuration
@PropertySource("classpath:secret-config/.env")
@Profile("local")
public class SecretConfig {
}

⚠️ **GitHub.com Fallback** ⚠️