DevOps

AWS KMS로 민감 정보 암호화: 콘솔 키 생성부터 CLI 실습까지

zyin 2025. 5. 1. 10:00

들어가며

개발을 하다 보면 환경 변수나 설정 파일에 비밀번호, API 키, DB 접속 정보 같은 민감한 데이터를 넣어야 할 때가 자주 있다. 초기에는 .env 파일에 그대로 두거나, Git에 커밋되지 않게만 조심하면 된다고 생각하기 쉽다.

하지만 운영 환경에 배포하거나 여러 명이 협업하는 상황에서는 그 접근이 너무 위험할 수 있다. 나는 이 문제를 보다 안전하게 해결하기 위해 AWS의 Key Management Service(KMS) 를 활용해보기로 했다.

이번 글에서는 다음 내용을 중점적으로 정리한다:

  • AWS 콘솔에서 KMS 키를 생성하는 방법
  • 로컬에서 AWS CLI로 암복호화를 테스트하는 절차
  • KMS 과금 정책과 주의할 점

실습을 위한 단계부터 실제 운영 적용까지 이어질 수 있는 기반을 마련하는 것이 목표다.


KMS란 무엇인가?

KMS(Key Management Service)는 AWS가 제공하는 완전관리형 키 관리 서비스로, 주요 특징은 다음과 같다:

기능 설명
대칭/비대칭 키 관리 대칭키로 암복호화, 비대칭키로 서명/검증 가능
권한 제어 IAM 및 자체 키 정책으로 정교한 권한 관리
통합 보안 S3, RDS, Lambda 등 여러 AWS 서비스와 통합 사용
감사 로그 AWS CloudTrail과 통합하여 키 사용 내역 추적 가능

우리가 실습에 사용할 것은 대칭키(Symmetric Key) 기반 암복호화다.


KMS 비용 정책 (2025년 4월 기준)

KMS는 프리티어(free tier)가 제공되긴 하지만, 장기적으로 사용 시 과금 구조를 정확히 이해하는 게 매우 중요하다. 주요 과금 항목은 다음과 같다:

항목 설명 비용
KMS 키 생성 및 보관 고객 관리 키(CMK)를 생성하면 매달 보관 비용 발생 $1.00/키/월
암호화 요청 encrypt, decrypt, generateDataKey 요청 시 $0.03/1,000건
AWS 서비스 내 통합 사용 예: S3 암호화 등에 자동 적용 별도 과금 없음, 단 사용량에 따라 추가 가능

예를 들어, 한 달에 키 1개를 만들고, 암복호화를 10,000회 수행했다면:

  • 키 보관: $1.00
  • 암복호화: (10,000 / 1,000) × $0.03 = $0.30
    총 $1.30/월 수준

프리티어: 매월 2,000건의 Encrypt, Decrypt, ReEncrypt, GenerateDataKey, GenerateDataKeyWithoutPlaintext, DecryptWithContext 요청이 무료로 제공된다.


실습 시작: 콘솔에서 KMS 키 만들기

1. AWS 콘솔 진입

  • 서비스 검색에서 KMS 또는 Key Management Service 입력
  • 좌측 메뉴 → 키 → 키 생성

2. 키 구성

항목 선택 내용
키 유형 대칭 키
사용 목적 암호화 및 복호화
키 별칭 alias/my-cli-key (직접 지정)
키 관리자 본인 IAM 사용자 선택
키 정책 기본 정책 사용 (추후 수정 가능)

 

 

생성 후에는 다음과 같은 ARN을 얻게 된다:

arn:aws:kms:ap-northeast-2:123456789012:key/abc12345-xxxx-yyyy-zzzz-0123456789ab

이 ARN은 이후 AWS CLI에서 암복호화 테스트 시 사용한다.


AWS CLI에서 프로파일 기반 KMS 암복호화 실습

1. AWS CLI 설치 (macOS)

brew install awscli

버전 확인:

aws --version

2. 프로파일 설정

aws configure --profile sdv-market

입력 항목:

AWS Access Key ID: AKIA...
AWS Secret Access Key: wJalrX...
Default region name: ap-northeast-2
Default output format: json

 

이제 --profile sdv-market 으로 명령어를 실행할 수 있다.


3. 암호화 테스트

echo -n "hello kms world" | aws kms encrypt \
  --key-id arn:aws:kms:ap-northeast-2:123456789012:key/abc12345-xxxx-yyyy-zzzz-0123456789ab \
  --plaintext fileb:///dev/stdin \
  --query CiphertextBlob \
  --output text \
  --profile sdv-market \
  --region ap-northeast-2

결과 예시:

AQICAHg4OLQagAQGtWQsmA+IKIoF... (base64 암호문)

4. 복호화 테스트

echo "위에서 받은 암호문" | base64 --decode | \
aws kms decrypt \
  --ciphertext-blob fileb:///dev/stdin \
  --query Plaintext \
  --output text \
  --profile sdv-market \
  --region ap-northeast-2 | base64 --decode

출력:

hello kms world

🧠 시행착오 정리

🔸 AccessDeniedException

KMS 키에 접근할 권한이 없는 경우 발생

해결: 아래와 같은 IAM 정책을 sdv-market 프로파일에 연결된 사용자/역할에 부여

{
  "Effect": "Allow",
  "Action": ["kms:Encrypt", "kms:Decrypt"],
  "Resource": "arn:aws:kms:ap-northeast-2:123456789012:key/abc12345-xxxx-yyyy-zzzz-0123456789ab"
}

 


마치며

이번 실습은 AWS KMS를 가장 기본적인 형태로 체험해본 사례였다. 키를 직접 만들고, 암복호화를 CLI에서 테스트해보면서 KMS의 핵심 동작 원리를 직접 느낄 수 있었다.

하지만 이건 시작일 뿐이다. 이 키는 Spring Cloud Config, SSM Parameter Store, Secrets Manager, 또는 CI/CD 환경변수 암호화 등 다양한 곳에 응용될 수 있다.

다음 글에서는 Spring Cloud Config Server에 직접 이 KMS를 연동해서 /encrypt, /decrypt API를 확장해보는 과정을 다룰 예정이다.