application.properties or application.yaml 파일과 같은 config 파일에 API 키 값 또는 DB 정보등과 같은 민감한 정보를 저장 하기도 하지만, 위와 같은 설정은 Git과 같은 저장소에 올리기에 보안적으로 부담이 되는 부분 이 있다.
따라서, 이번 사이드 프로젝트에서는 민감한 정보들은 AWS의 Secrets Manager에서 관리하여, 가져다 쓰는 방법을 채택하였다.
먼저, 아래 포스팅 내용으로 AWS Secrets Manager 보안 암호 키 등록은 완료 되었다고 전제한다.
SpringBoot에서 AWS Secrets Manager에 접근 할 수 있는 'SecretsManagerReadWrite' 권한을 가진 User의 Access-key와 Secret-key를 발급 한다.
그리고 따로 SpringBoot에서 접근(키)에 대해 관리 되지 않도록, 각 PC마다 CLI를 설치하여 Access-key 및 Secret-key를 등록한다.
CLI 설치 : https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
$ aws configure
AWS Access Key ID [None]: 발급 받은 Access Key
AWS Secret Access Key [None]: 발급 받은 Secret Access Key
Default region name [None]: ap-northeast-2
Default output format [None]: json
이제 SpringBoot에 대한 설정을 시작한다.
- build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap:3.0.3'
implementation 'org.springframework.cloud:spring-cloud-starter-aws-secrets-manager-config:2.2.6.RELEASE'
다음과 같이 의존성 추가를 해준다.
config에 대한 구조는 이전에 포스팅 했던 profile별 환경 분리 (application 분리) 를 참고하고, bootstrap.yml으로 변경 한다.
여기서, bootsrap.yml과 application.yml은 몇 가지 차이점이 있지만, 가장 큰 차이는 application.yml보다 bootsrap.yml이 먼저 load된다.
또, 위 사이트를 참고하면, "Instead of application.yml (or .properties), you can use bootsrap.yml"을 확인 할 수 있다. 따라서, 역할 분리를 위해서라면 application.yml과 bootstrap.yml을 나눠서 사용할 수 도 있지만, 여기에서는 application.yml에 있는 모든 설정을 bootstrap.yml로 대체 한다.
- bootstrap-common.yml
server:
port: 8080
servlet:
encoding:
charset: utf-8
tomcat:
uri-encoding: utf-8
spring:
config:
activate:
on-profile: common
import:
- classpath:/config/aws/secretsmanager.yml
- secretsmanager.yml
aws:
secretsmanager:
name: sample
bootstrap-common.yml에 spring.config.activate.import에 secretsmanager.yml파일을 정의하고, secretsmanager.yml에는 AWS Secrets Manager에 정의한 name을 가져와서 정의한다.
서버를 실행 시켜보면, 아래와 같이 정상 동작하는 것을 확인 할 수 있다.
여기서 눈여겨 볼 필요 있는 부분은 첫줄 PropertySourceBootstrapConfiguration에 대한 내용이다.
Located property source: [
BootstrapPropertySource {name='bootstrapProperties-/secret/sample_local'},
BootstrapPropertySource {name='bootstrapProperties-/secret/sample_common'},
BootstrapPropertySource {name='bootstrapProperties-/secret/sample'},
BootstrapPropertySource {name='bootstrapProperties-/secret/application_local'},
BootstrapPropertySource {name='bootstrapProperties-/secret/application_common'},
BootstrapPropertySource {name='bootstrapProperties-/secret/application'}
]
load 되면서 AWS Secrets Manager에 정의된 name을 위와 같은 방식으로 가져오는 것을 확인 할 수 있다.
따라서, 우리는 secretsmanager.yml에 정의된 하나의 name으로 local, dev, prod를 AWS에서 나누어서 사용 할 수 있게 되었다. 즉, springboot에서는 민감한 정보에 대한 내용을 환경에 맞게 분리해서 관리하지 않아도 된다.
참고 :
'SPRING' 카테고리의 다른 글
profile별 환경 분리 (application 분리) (0) | 2023.07.16 |
---|---|
Custom Annotation 기반으로 Session 정보 가져오기 (0) | 2023.05.02 |
Spring 웹 계층 (0) | 2023.04.24 |
JPA Annotation (0) | 2023.04.24 |
Lombok Annontation (0) | 2023.04.06 |