
AX개발팀 인턴 정세현 — 민감 데이터 관리 리서치
"먼저 내가 이해하기 위한" 공부용 노트입니다. 발표 대본이 아니라, 각 개념을 스스로 설명할 수 있게 되는 걸 목표로 씀.
| 파일 | 발표 섹션 | 한 줄 목표 |
|---|---|---|
인트로 | 1. 인트로 | "왜 이 얘기를 하는지" 청중을 설득 |
키관리_난제 | 2. 왜 키 관리가 어려운가 | 순진한 방법들이 왜 다 깨지는지 |
암호화_기초 | 3. 암호화 기초 | 대칭/비대칭, SKM 데이터 3종 |
봉투암호화 | 4. 봉투 암호화 | DEK/KEK 구조와 그 이점 |
NHN_SKM | 5. NHN Cloud SKM 구현 | 3단 키 계층·인증·API |
실무적용 | 6. 실무 적용 관점 | 키 순환 + Spring 연동 |
정리_QnA | 7. 정리 & Q&A | 3줄 요약 + 예상 질문 방어 |
| 용어 | 풀이 | 한 줄 설명 |
|---|---|---|
| 평문 (Plaintext) | - | 암호화 안 된 원본 데이터 |
| 암호문 (Ciphertext) | - | 암호화된 데이터 |
| 대칭키 | Symmetric Key | 암호화·복호화에 같은 키 사용 (AES, ARIA) |
| 비대칭키 | Asymmetric Key | 공개키/개인키 쌍 사용 (RSA) |
| KMS | Key Management Service | 키 생성·보관·접근제어를 전담하는 시스템 |
| DEK | Data Encryption Key | 실제 데이터를 암호화하는 키 |
| KEK | Key Encryption Key | DEK를 암호화(보호)하는 키 |
| 봉투 암호화 | Envelope Encryption | DEK로 데이터 암호화 → KEK로 DEK 암호화 |
| 키 순환 | Key Rotation | 키를 주기적으로 새 버전으로 교체 |
| HSM | Hardware Security Module | 키를 하드웨어 안에서만 다루는 전용 장비 |
| 기밀 데이터 | Confidential Data | SKM이 보관하는 임의의 민감 텍스트(예: DB 접속정보) |
발표의 출발점은 겁을 주는 게 아니라 "어차피 뚫린다고 가정하면 그 다음이 갈린다" 는 관점입니다.
발표 멘트 예시:
"완벽하게 막는 건 불가능합니다. 그래서 질문을 바꿔야 합니다. DB가 통째로 유출돼도, 그 안의 데이터가 쓸모없는 상태로 있게 하려면? 그 답이 암호화이고, 오늘 이야기의 시작점입니다."
구체적인 사고명·피해 규모 숫자는 틀리면 신뢰가 깨지므로, 확실한 것만 말하세요.
안전하게 쓸 수 있는 사실 두 가지:
숫자·회사명을 꼭 넣고 싶으면 발표 전에 1차 출처(뉴스·보안기관 보고서)로 재확인하고 넣으세요.
간단하지만 강력한 대비 그림입니다.
[암호화 X] DB 유출 → 이름: 홍길동 / 주민번호: 900101-1... / 비밀번호: password123
→ 그대로 읽힘. 끝.
[암호화 O] DB 유출 → 이름: 8f3a9c... / 주민번호: b21e77... / 비밀번호: 5d41402a...
→ 키가 없으면 의미 없는 바이트 덩어리.
포인트: 암호화의 목적은 "유출을 막는 것"이 아니라 "유출됐을 때 무의미하게 만드는 것".
즉 최후의 방어선(last line of defense)입니다.
여기서 자연스럽게 역설이 등장합니다.
발표 전환 멘트:
"암호화는 문제를 푸는 동시에 새 문제를 만듭니다. 자물쇠는 채웠는데, 열쇠를 문 옆 화분 밑에 두면 아무 소용이 없죠. 그래서 오늘 진짜 주제는 암호화 자체가 아니라 '키를 어떻게, 어디에 둘 것인가' 입니다."
이 한 문장이 발표 전체를 관통하는 축입니다. 인트로의 마지막은 반드시 이 질문으로 닫으세요.
인트로에서 던진 질문 "키를 어디 두지?"에 대해, 사람들이 흔히 시도하는 방법들이 왜 하나씩 깨지는지를 보여주는 섹션입니다. 이 섹션의 목적은 "그래서 전용 시스템(KMS/SKM)이 필요하다"로 자연스럽게 몰아가는 것.
// 최악의 예시
String secretKey = "my-super-secret-key-1234";
한계:
application.yml, .properties 등db:
password: "P@ssw0rd!"
crypto:
key: "base64EncodedKey=="
한계:
export DB_KEY=...export CRYPTO_KEY="base64EncodedKey=="
한계:
/proc/<pid>/environ 로 같은 서버의 다른 프로세스/사용자가 조회 가능.정리 멘트:
"세 방법의 공통 문제는 결국 키가 애플리케이션과 같은 신뢰 경계 안에 평문으로 존재한다는 겁니다. 앱이 뚫리면 키도 같이 뚫립니다."
키를 아주 안전한 금고에 넣었다고 칩시다. 그래도 끝이 아닙니다.
이게 실무에서 진짜 골치 아픈 부분이고, 발표에서 짚으면 "깊이 있다"는 인상을 줍니다.
키는 언젠가 반드시 바꿔야 합니다. 왜?
그런데 키를 바꾸면 곧바로 딜레마가 생깁니다:
기존 데이터는 "옛날 키"로 암호화돼 있음.
새 데이터는 "새 키"로 암호화하고 싶음.
→ 그럼 옛날 데이터는 새 키로 못 푸는데?
순진한 해법의 한계:
좋은 KMS는 이 문제를:
하드코딩·설정파일·환경변수 전부 (1) 저장 안전성, (2) 접근 통제, (3) 키 교체
세 가지를 동시에 만족 못 시킨다.
→ 이 세 가지를 전담하는 시스템이 필요하다 = KMS / Secure Key Manager.