본문 바로가기
👾 Server/☁️AWS

SpringBoot 3.2에서 AWS SecretsManager 사용하여 패스워드 및 인증 관리하기

by kukim 2024. 1. 6.

목차

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 SecretsManagerSpringBoot 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.cloudio.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.2.1. AWS Secrets Manager -> 새 보안 암호 저장

 

4.2.2. 다른 유형의 보안 암호 -> 키/값 추가 (추후 추가 가능)
4.2.3. 보안 암호 이름 설정 (해당 이름으로 SpringBoot에서 AWS Secrets Manager으로 접근하기에 중요)

 

4.2.4. 생성 완료
4.2.5.1 편집 가능
4.2.5.2. 편집 가능
4.2.6. 리소스 접근 권한 설정 가능
4.2.7.1. 암호 삭제 가능
4.2.7.2. 바로 삭제는 안되고 예약 삭제
4.2.7.3. 삭제 취소 가능

 

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 값들을 환경변수로 설정한 다음 애플리케이션을 구동합니다.

SpringBoot Application 실행될 대 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비용

aws secrets-manager/pricing

 

k8s 환경에서 STS 으로 권한 얻기

StsWebIdentityTokenFileCredentialsProvider

 
 
 

댓글