목차
1. 시작하며
1.1 패스워드 및 인증 관리 서비스
1.2 글의 목적과 범위 소개
2. AWS 라이브러리 선택
2.1 org.springframework.cloud vs io.awspring.cloud
3. 의존성 추가하기
3.1 Spring Cloud AWS Dependencies와 Starter Secrets Manager 추가
4. AWS SecretsManager 사용 방법
4.1 비용
4.2 AWS Console에서 SecretManager 생성과 secret 값들 생성하기
4.3 SpringBoot 실행하는 곳에 권한 설정하기 (AWS Login, IAM Role, STS)
4.4 SpringBoot에서 SecretManager를 통한 secret 데이터 접근 및 관리 (코드)
5. 마치며
+) Reference
*환경 SpringBoot 3.2 / Java 21 / Gradle
1. 시작하며
1.1 패스워드 및 인증 관리 서비스
애플리케이션 개발에서, 패스워드 및 인증 관리는 중요한 보안 요소입니다. SpringBoot와 같은 프레임워크를 사용하는 마이크로서비스 아키텍처에서는 이러한 요소들이 핵심적인 역할을 합니다. SpringBoot 서비스에서 패스워드, API 키, 인증 토큰 등의 민감한 정보를 안전하게 관리하는 것은 보안 침해로부터 시스템을 보호할 수 있습니다.
application.yml 또는 기타 구성 파일에 이러한 민감한 정보를 직접 저장하는 것은 매우 위험합니다. 이러한 정보가 노출될 경우, 심각한 보안 문제로 이어질 수 있기 때문입니다. 따라서, 패스워드 및 인증 관리 서비스를 사용하여 이러한 데이터를 안전하게 중앙에서 관리하고, 필요에 따라 암호화하여 저장하는 것이 중요합니다.
이 분야의 주요 서비스로는 AWS SecretsManager, HashiCorp Vault, Azure Key Vault, Google Cloud Secret Manager 등이 있습니다. 각각은 클라우드 기반의 인프라에서 민감한 데이터를 안전하게 저장하고 관리하는 기능을 제공합니다. 하지만 이들 서비스는 특정 환경이나 요구 사항에 따라 각기 다른 장점을 가지고 있습니다.
1.2 글의 목적과 범위 소개
이번 글에서는 이러한 패스워드 및 인증 관리 서비스들 중에서 AWS SecretsManager를 SpringBoot 3.2와 함께 사용하는 방법에 대해 소개하고자 합니다.
(과거 글에서도 secret, config 파일을 관리하는 방법을 소개한 적이 있습니다.)
2022.07.01 - secret, config 파일 관리 방법 소개(feat. SpringBoot의 application.*)
2022.07.02 - Git Submodules를 활용한 secret, config 파일 관리, 배포 (feat. SpringBoot, GitHub Actions)
2. AWS 라이브러리 선택
2.1 org.springframework.cloud vs io.awspring.cloud
SpringBoot + AWS 사용을 위해 검색하면 org.springframework.cloud와 io.awspring.cloud 가 있습니다만,
org.springframework.cloud는 2020년 4월 17일 부로 업데이트 되지 않고 io.awspring.cloud을 사용하길 권장하고 있습니다. Spring Cloud AWS 최상위 라이브러리도 io.awspring.cloud 입니다. (org.springframework.cloud -> io.awspring.cloud)
따라서 io.awspring.cloud를 사용해야 합니다.
GitHub: spring-cloud-aws
공식 docs: spring-cloud-aws-v.3.1
3. 의존성 추가하기
3.1 Spring Cloud AWS Dependencies와 Starter Secrets Manager 추가
2가지 의존성을 추가하면 됩니다.
3.1.1 Spring Cloud AWS Dependencies:
- 이 의존성은 Spring Cloud 프로젝트의 AWS 모듈에 필요한 모든 의존성을 제공합니다.
- implementation platform을 통해 프로젝트에 추가되며, 이를 통해 AWS 서비스와의 통합을 위한 기본 설정을 관리할 수 있습니다.
# springCloudAwsVersion (*기준 24/1/6)
implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.1.0")
# implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:${springCloudAwsVersion}")
3.1.2 Starter Secrets Manager:
- Starter Secrets Manager는 AWS SecretsManager와의 통합을 용이하게 하는 스프링 부트 스타터 패키지입니다.
- 이 의존성을 추가함으로써, 애플리케이션에서 AWS SecretsManager를 통해 비밀번호, API 키 등을 안전하게 관리하고, 이를 필요에 따라 쉽게 접근할 수 있습니다.
implementation "io.awspring.cloud:spring-cloud-aws-starter-secrets-manager"
4. AWS SecretsManager 사용 방법
4.1 비용
AWS SecretsManager는 프리티어 1달 무료이고 그 외에는 비용이 발생합니다.
- 보안 암호당 $0.40/월
- API 호출 10,000건당 $0.05
자세한 내용은 secrets-manager/pricing 를 참고하세요
4.2 AWS Console에서 SecretManager 생성과 secret 값들 생성하기
4.3 SpringBoot 실행하는 곳에 권한 설정하기 (AWS Login, IAM Role, STS IAM Role)
SpringBoot에서 AWS 서비스에 접근하기 위해선 AWS credentials를 가져와야 합니다. 이전 글 2023.04.23 - AWS SDK for Java 1.x가 AWS credentials를 가져오는 5가지 방법 에서 소개했습니다. 현재 SpringBoot3.2에서는 AWS SDK for Java2.x를 사용하여 내부 로직이 다를 수 있겠지만 credentials를 가져오는 방법은 매우 유사합니다.
SpringBoot 서비스가 실행되는 환경에서, AWS access key, secret key를 확인하거나, application.yml 파일을 확인합니다. 만약 실행되는 환경이 ec2라면 엔드포인트로 assuem role을 하거나 k8s 환경이라면 STS으로 권한을 가져와야 합니다. 아래에서 간단한 예로 설명드리려 합니다.
4.3.1 로컬 환경에서 실행되는 SpringBoot 서비스에서 SecretsManager 접근
로컬에서 SpringBoot 서비스를 실행하여 접근할 때는 aws cli를 활용하여 AWS 로그인을하면 자동으로 환경 변수에 AWS access key, secret key가 설정되어 쉽게 접근할 수 있습니다.
aws cli 설치 -> aws 로그인
# aws cli 설치 / 로그인 후 access, secret key 확인
$ aws configure
AWS Access Key ID [****************XAXQ]:
AWS Secret Access Key [****************AW3F]:
Default region name [ap-northeast-2]:
Default output format [json]:
4.3.2 ec2 환경에서 실행되는 SpringBoot 서비스에서 SecretsManager 접근
ec2에 AWS access key, secret key 를 셋업하는 방법이 있고, 애초에 AWS SecretsManager에 리소스 접근 권한을 줄 수 있습니다. 그 방법은 다양하기에 사용하고자 하는 케이스에 맞춰 접근합니다.
4.3.3 k8s pod에서 실행되는 SpringBoot 서비스에서 SecretsManager 접근할 때 STS으로 권한을 얻는 경우
k8s pod에서 실행되는 SpringBoot 서비스에서 AWS 권한을 얻는 방법도 다양합니다. 만약 AWS Security Token Service(STS) 으로 설정이 되어있다면 SpringBoot 서비스에 아래 의존성을 추가하여 STS 으로 권한을 요청하도록 해야합니다.
implementation "software.amazon.awssdk:sts"
sts는 StsWebIdentityTokenFileCredentialsProvider 구현체를 사용합니다.
4.4 SpringBoot에서 SecretsManager를 통한 secret 데이터 접근 및 관리
3.1.2에서 추가한 의존성 Starter Secrets Manager와 4.3에서 AWS 접근 권한이 있다면 SpringBoot 3.2 서비스에서 매우 손쉽게 SecretsManager에 접근할 수 있습니다.
implementation "io.awspring.cloud:spring-cloud-aws-starter-secrets-manager"
4.4.1 application.yml 설정
# 예) application.yml
spring:
config:
# AWS SecretsManager에서 보안암호 값 kukim/project/springboot-service1
import: aws-secretsmanager:kukim/project/springboot-service1
위와 같이 application.yml 에 spring.config.import 에 추가만 해준다면 스프링 애플이케이션이 뜰 때 AWS SecretsManager에 요청하여 secrets 값들을 환경변수로 설정한 다음 애플리케이션을 구동합니다.
4.4.2 잘못된 AWS SecretsManager 설정한 경우와 optional 기능
잘못된 값을 입력한 경우 Spring Application이 실행되지 않습니다.
11:58:14.894 [restartedMain] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter --
***************************
APPLICATION FAILED TO START
***************************
Description:
Config data resource '[SecretsManagerConfigDataResource@61a97cb5 context = '잘못된값', optional = false]' via location 'aws-secretsmanager:잘못된값' does not exist
Action:
Check that the value 'aws-secretsmanager:잘못된값' at class path resource [application-aws-secrets-manager.yml] - 7:13 is correct, or prefix it with 'optional:'
Process finished with exit code 0
optional을 사용하여 해당 값이 존재하지 않는 경우 애플리케이션을 멈추지 않고 실행하는 방법도 있습니다.
# 예) application.yml
spring:
config:
# optional
import: optional:aws-secretsmanager:kukim/project/springboot-service1
4.4.3 예시
AWS SecretsManager key/value 값에 아래 설정 값들을 입력하고 application.yml 파일에 환경변수 값으로 두면 됩니다.
spring:
data:
redis:
host: ${redis.host}
port: ${redis.port}
lettuce:
pool:
max-active: ${redis.pool.max-size:8}
max-idle: ${redis.pool.max-idle:8}
min-idle: ${redis.pool.min-idle:0}
이제 SecretsManager를 사용하여 보다 안전하게 설정값, 패스워드, secrets들을 관리할 수 있게 되었습니다.
4.4.4 그외 기능
reload 기능
SecretsManager, config 값의 변경 사항을 감지하고 새 구성을 반영하도록 내부 상태를 업데이트해야 할 수도 있습니다. Spring Cloud AWS Secrets Manager의 reload 기능을 사용하여 관련 값이 변경될 때 애플리케이션 reload 트리거하는 방법도 있습니다. (spring.cloud.aws.secretsmanager.reload.strategy)
보다 자세한 내용은 공식 문서를 참고해주세요. (Spring-Cloud-AWS-9. Secrets Manager Integration)
5. 마치며
패스워드, API 키, 토큰 등의 민감한 데이터를 안전하게 저장하고 관리하는것은 중요합니다.
그 기술로 SpringBoot 3.2 환경에서 AWS SecretManager를 사용하는 방법을 소개했습니다.
- io.awspring.cloud 라이브러리 사용
- 두 가지 의존성으로 Spring Cloud AWS Dependencies / Starter Secrets Manager
- AWS Console에서 AWS SecretsManager 초기 설정 방법 소개
- SpringBoot Application이 실행되는 환경에 따라 AWS credentials 설정 방법(AWS CLI, IAM Role, STS)
- SpringBoot에서 AWS SecretsManager 사용하는 방법과 추가 기능 설명
꼭 AWS SecretsManager가 아니더라도
환경변수 / secrets 값들의 관리는 애플리케이션의 유연성과 확장성을 향상시키며, 민감한 데이터 관리에 있어서 효율적인 접근 방식을 제공할 수 있습니다.
감사합니다. :)
+) Reference
이전 글
2022.07.01 - secret, config 파일 관리 방법 소개(feat. SpringBoot의 application.*)
2022.07.02 - Git Submodules를 활용한 secret, config 파일 관리, 배포 (feat. SpringBoot, GitHub Actions)
2023.04.23 - AWS SDK for Java 1.x가 AWS credentials를 가져오는 5가지 방법
spring blog
org.springframework.cloud -> io.awspring.cloud
Spring-Cloud-AWS-9. Secrets Manager Integration
io.awspirng.cloud
GitHub: spring-cloud-aws
공식 docs: spring-cloud-aws-v.3.1
aws secret manager비용
k8s 환경에서 STS 으로 권한 얻기
StsWebIdentityTokenFileCredentialsProvider
'👾 Server > ☁️AWS' 카테고리의 다른 글
REST API Response(JSON)를 CDN을 활용하여 캐싱하기 (0) | 2023.05.05 |
---|---|
AWS SDK for Java 1.x가 AWS credentials를 가져오는 5가지 방법 (0) | 2023.04.23 |
서브 도메인과 AWS 서비스 연결하기 3. 로드 밸런서에 SubDomain 연결하여 HTTPS 통신하기 (2) | 2022.09.13 |
서브 도메인과 AWS 서비스 연결하기 2. CloudFront에 SubDomain 연결하여 HTTPS 통신하기 (1) | 2022.09.13 |
서브 도메인과 AWS 서비스 연결하기 1. Route 53에서 도메인 네임 구입 방법 (0) | 2022.09.13 |
댓글