- 요약
- KMS란
- 헷갈리면 안되는 점: KMS ARN은 암호화키가 아니다
- KMS 원리: HSM
- 암호화/복호화 원리: 봉투암호화
- AWS KMS 암호화/복호화 실습
- 부록A: AWS KMS를 오프라인에서 실행하는 방법(generate-data-key API)
- 부록B: 봉투암호화 시연 웹 페이지
- 참고자료
이 글은 KMS에서 어떻게 암호화 키를 관리하는지 설명합니다.
요약
- KMS(Key Management Service)는 암호화 키를 안전하게 생성, 저장, 관리하는 시스템이다
- AWS KMS 콘솔에 보이는 ARN과 key material ID는 암호화키가 아니다
- KMS의 핵심 원리는 HSM(하드웨어 보안 모듈)과 봉투암호화이다
- 봉투암호화는 data key를 root key로 한번 더 암호화하여 키를 보호하는 방식이다
KMS란
KMS(Key Management Service)는 암호화 키를 안전하게 생성, 저장, 관리하는 시스템입니다. AWS에서도 KMS를 제공하고, AWS 이외에 대표적인 KMS 오픈소스는 Hashicorp의 Vault입니다.
KMS가 별도로 필요한 이유는 암호화 키를 소스코드에 보관하면 보안사고가 발생하기 때문입니다. 그렇다고 암호화 키를 암호화해서 소스코드에 보관한다면, 그 암호화키를 또 별도로 보관하는 프로세스가 필요합니다. KMS는 이런 암호화키 관리의 불편한 점을 해결하기 위해 탄생했습니다.
또한, KMS는 암호화 키를 안전하게 관리할 뿐만 아니라 암호화/복호화 기능도 같이 제공합니다.
헷갈리는 점: AWS KMS ARN은 암호화키가 아니다
AWS KMS 콘솔에 가면 KMS ARN과 key material ID가 보입니다. 처음에 헷갈리는 점이 이 두 개의 값이 암호화에 사용되는 값이 아니라는 점입니다.

ARN은 AWS가 인식하는 AWS 리소스 ID입니다. 따라서 데이터 암호화와 관련이 없습니다.
데이터 암호화는 key material이 관여합니다. key material이 여러 개 있을 때 구분하기 위해 ID화 한 게 key material ID입니다. 따라서 KMS ARN과 key material ID는 유출되어도 상관이 없지만, IAM access key와 같이 유출된다면 위험합니다.
KMS 원리: HSM
AWS KMS처럼 키를 관리하는 KMS의 핵심 원리는 HSM(Hardware Security Modules, 하드웨어 보안 모듈)과 봉투암호화에 있습니다.
HSM은 하드웨어 보안 모듈로 KMS의 핵심 기능입니다. HSM은 보안 인증을 받아야 하며, AWS KMS는 FIPS 140-3 보안인증을 받았습니다.

HSM은 암호화 키 생성, 암호화, 복호화 연산 등 암호의 모든 작업을 수행합니다.
AWS KMS는 IAM policy로 KMS 리소스에 접근 가능한지 확인하고, 암호화/복호화 연산 권한을 검사합니다. 권한 검사가 끝난 후 사용자가 요청한 작업을 수행합니다.

암호화/복호화 원리: 봉투암호화
KMS에서 핵심 기능 중 하나는 어떻게 암호화키를 보관할 것인가입니다. AWS KMS는 봉투암호화를 사용하여 키를 관리합니다.
봉투암호화는 두 가지 키워드로 나눌 수 있습니다.
1. data key: 데이터 암호화에 사용되는 키
2. root key(또는 wrapper key): data key를 암호화하는 키
정리하면, data key로 데이터를 암호화하고, 그 data key를 root key로 한번 더 암호화하는 방식이 봉투암호화입니다. 마치 편지를 봉투에 넣는 것처럼 키를 한번 더 감싸는 것입니다.

KMS에서 관리하는 키는 외부에 공개되지 않는다
AWS KMS에서 관리되는 root key, data key는 절대 복호화된 상태로 외부에 제공되지 않습니다. 따라서 사용자는 root key, data key의 원본을 볼 수 없습니다. 그저 사용자는 KMS API를 사용해서 암호화/복호화를 요청할 뿐입니다.
반대로 AWS KMS에서 관리하지 않는 key는 외부에 공개될 수 있습니다. AWS KMS는 AWS KMS가 아니라 사용자가 직접 데이터 암호화/복호화할 수 있는 기능을 제공하는데, 이 방법을 사용하면 키들은 사용자가 직접 잘 관리해야 합니다.
AWS KMS 암호화/복호화 실습
- 실습 github: https://github.com/choisungwook/portfolio/blob/master/computer_science/kms/examples/aws-cli.md
portfolio/computer_science/kms/examples/aws-cli.md at master · choisungwook/portfolio
portfolio. Contribute to choisungwook/portfolio development by creating an account on GitHub.
github.com
부록A: AWS KMS를 오프라인에서 실행하는 방법(generate-data-key API)
대용량 데이터를 암호화/복호화할 때는 네트워크 제약이 있을 수 있습니다. 이런 상황을 위해 AWS KMS는 generate-data-key API를 제공합니다.
generate-data-key API를 사용하면, 사용자는 평문 data key와 암호화된 data key를 얻을 수 있습니다. 이 key를 사용해서 오프라인으로 암호화/복호화를 수행할 수 있습니다. 암호화/복호화는 AWS Encryption SDK를 사용해도 되고, 다른 암호화 알고리즘을 사용해도 됩니다.

generate-data-key를 사용한 순간 key 관리에 대한 책임은 사용자에게 있으니 주의가 필요합니다.
실습 자료는 저의 github에 있습니다.
- 실습 github: https://github.com/choisungwook/portfolio/blob/master/computer_science/kms/examples/aws-cli.md
portfolio/computer_science/kms/examples/aws-cli.md at master · choisungwook/portfolio
portfolio. Contribute to choisungwook/portfolio development by creating an account on GitHub.
github.com
부록B: 봉투암호화 시연 웹 페이지
봉투암호화를 간단히 시연할 수 있는 웹 페이지를 만들었습니다. claude code와 codex가 만들었고, astro 프레임워크를 사용했습니다.
- 시연 페이지: https://envelopelab.akbun.com/

참고자료
'전공영역 공부 기록' 카테고리의 다른 글
| 리눅스에서 tmp 디렉터리가 메모리 사용률을 올리는 이유 (0) | 2026.03.01 |
|---|---|
| Claude Code 첫 프로젝트 후기 - SLO 계산기와 배포방법 고민 (0) | 2026.02.22 |
| Claude Code 동작 원리 정리 - Harness, Context, Memory까지 (0) | 2026.02.18 |
| 단순한 온프레미스 리다이렉트 서버를, AWS로 옮기는 방법들은 뭐가 있을까?(ALB vs CloudFront) (0) | 2026.02.17 |
| 내가 사용하는 Ghostty 설정 - 테마, 단축키, 분할화면 (macOS) (0) | 2026.02.16 |