AWS KMS로 민감 정보 암호화: 콘솔 키 생성부터 CLI 실습까지
들어가며
개발을 하다 보면 환경 변수나 설정 파일에 비밀번호, 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를 확장해보는 과정을 다룰 예정이다.