암호화는 결국 키 관리 문제로 귀결된다. AES-256으로 데이터를 암호화하는 알고리즘은 1990년대에 이미 끝난 이야기고, 깨진 적도 없다. 사고는 알고리즘이 아니라 키에서 난다. 키를 코드에 하드코딩했다가 GitHub에 푸시하고, 키를 평문으로 S3에 올려두고, 키를 누가 언제 썼는지 추적하지 못하고, 떠난 직원의 노트북에 키 사본이 남아 있다. 보안 사고의 압도적 다수가 "키를 어디다 뒀는지"의 문제다.
KMS의 핵심 설계 철학은 단순하다. 사용자가 키 원본(key material)을 절대 보지 못하게 한다. 키를 만들 수도 있고, 회전시킬 수도 있고, 삭제 예약을 걸 수도 있지만, 평문 마스터 키 바이트를 다운로드하는 API는 존재하지 않는다. 이게 왜 그렇게 설계됐는지, HSM이라는 물리 장비가 어떻게 이걸 보장하는지, Envelope Encryption이 왜 필요한지, Key Policy가 왜 IAM보다 우선하는지 — 이 결정들의 이유를 따라가는 게 이 글이다.
AWS 초기에 암호화는 전적으로 고객 책임이었다. S3에 데이터를 올리려면 클라이언트에서 직접 암호화하고, 키는 알아서 보관해야 했다. 문제는 키 보관이 암호화 자체보다 훨씬 어렵다는 것이다. 키를 어디 두지? 환경 변수? 그럼 그 변수를 읽을 수 있는 모든 프로세스가 키를 본다. 파일? 그럼 디스크 이미지를 뜨면 키가 같이 딸려 나간다