목차
공개키 글은 “이 공개키가 진짜 그 사람 것인가”라는 구멍을 열어뒀다. 그 구멍을 메우는 두 도구, 서명과 인증서를 본다.
서명은 개인키로, 검증은 공개키로
공개키 글에선 공개키로 잠그고 개인키로 열었다(감추기). 서명은 그 방향을 뒤집는다.
- 서명 - 내 개인키로 만든다. 나만 할 수 있다.
- 검증 - 내 공개키로 아무나 확인한다.
개인키는 나만 가지니 그 서명을 만들 수 있는 건 나뿐이고, 공개키는 뿌려져 있으니 누구나 검증한다. “이 메시지는 개인키 주인이 만들었고, 그 뒤로 안 바뀌었다”가 증명된다.
봉인이지 잠금이 아니다
서명은 감추지 않는다. 메시지는 그대로 보이고, 서명값이 옆에 붙을 뿐이다. JWT 글의 표현 그대로 잠그는 게 아니라 봉인하는 것이다 - 내용은 읽혀도, 손대면 봉인이 깨져 티가 난다. 감추기(암호화)와 증명하기(서명)는 다른 일이라는 걸 여기서 다시 붙잡아 둔다.
실제로는 해시에 서명한다
메시지 전체에 공개키 연산을 걸면 느리다(공개키는 느리다). 그래서 실제로는 메시지를 해시해 짧은 지문을 만들고, 그 지문에 서명한다.
메시지 --해시--> 지문(짧다) --개인키로 서명--> 서명값검증하는 쪽은 받은 메시지를 똑같이 해시하고, 서명값을 공개키로 풀어 나온 지문과 맞춰본다. 같으면 통과다. 앞 글의 해시가 여기서 서명의 재료로 쓰인다 - 시리즈의 도구들이 포개진다.
HMAC과 뭐가 다른가
앞 글의 HMAC도 “안 바뀌었고 진짜 보낸 사람”을 증명했다. 서명은 뭐가 다를까. 누가 만들 수 있느냐가 다르다.
| 무엇으로 만드나 | 누가 만들 수 있나 | 부인 방지 | |
|---|---|---|---|
| HMAC | 둘이 공유한 비밀키 | 비밀키 아는 양쪽 다 | 못 함 |
| 서명 | 나만 가진 개인키 | 나만 | 함 |
HMAC은 둘이 같은 비밀키를 나눠 가지니 둘 중 누가 만들었는지 못 가린다 - 상대가 “네가 만들었잖아” 해도 발뺌할 수 있다. 서명은 개인키가 한 사람만의 것이라, “내가 안 했다”고 발뺌할 수 없다(부인 방지). 계약·인증서처럼 “네가 한 게 맞다”를 못 박아야 하는 자리엔 서명이 필요하다.
그런데 이 공개키가 진짜 그 사람 것인가
서명은 강력하지만 공개키가 진짜 그 사람 것일 때만 뜻이 있다. 공격자가 자기 공개키를 “영희 것”이라 내밀고 자기 개인키로 서명하면, 검증은 말끔히 통과한다 - 엉뚱한 사람의 것으로.
"이건 영희의 공개키야" ← 이 말을 누가 보증하나?공개키 글에서 열어둔 바로 그 구멍이다. 서명이 신원을 증명하려면, 그 공개키의 주인이 누구인지부터 믿을 수 있어야 한다.
인증서: 믿는 제3자가 보증한다
해법은 모두가 믿는 제3자(인증기관, CA)가 “이 공개키는 영희 것이다”라고 서명해주는 것이다. 그 보증서가 인증서다.
인증서 = [ 영희의 공개키 ] + [ 영희라는 신원 ] + [ CA의 서명 ]이제 철수는 영희의 공개키를 직접 안 믿어도 된다. CA의 서명을 검증해서, CA가 보증했으면 받아들인다. 신뢰의 대상이 “낯선 영희의 공개키”에서 “이미 믿는 CA”로 옮겨간다.
신뢰는 사슬을 탄다
그럼 “CA의 공개키”는 또 누가 보증하나? 여기서 사슬이 된다.
맨 위 루트 CA는 운영체제·브라우저에 미리 심겨 출하된다 - 이 뿌리는 “그냥 믿는다”고 정해둔 출발점이다(신뢰 앵커). 그 뿌리가 중간 CA를 서명으로 보증하고, 중간 CA가 서버 인증서를 보증한다. 검증하는 쪽은 이 사슬을 뿌리까지 타고 올라가 하나라도 서명이 안 맞으면 거부한다.
그래서 브라우저 주소창의 자물쇠는 “이 사이트의 공개키가, 미리 믿는 루트까지 이어지는 사슬로 보증됐다”는 뜻이다. HTTPS 글의 “신원은 인증서가 증명한다”가 정확히 이 사슬을 타는 이야기다.
실무에서: 인증서는 만료되고 폐기된다
- HTTPS 인증서가 가장 흔한 예다. Let’s Encrypt가 무료로 발급하면서 사실상 모든 사이트가 인증서를 갖게 됐다.
- 유효기간이 있다. 짧게(요즘은 90일 안팎) 두고 자동 갱신한다 - 개인키가 새도 피해 기간을 줄이려는 것이다.
- 폐기도 있다. 기간 전에 개인키가 털리면 인증서를 무효화한다(폐기 목록·OCSP). 다만 폐기 확인은 실무에서 완전하진 않아, 짧은 유효기간이 더 현실적인 방어로 쓰인다.
- 코드·문서에 붙는 서명(앱 서명, 패키지 서명)도 같은 원리다 - 개인키로 서명, 공개키(인증서)로 검증.
정리
- 서명은 개인키로 만들고 공개키로 검증한다(감추기의 반대 방향). 감추지 않고 봉인한다 - 손대면 티 난다.
- 효율을 위해 메시지의 해시에 서명한다. 시리즈의 해시가 여기 재료로 쓰인다.
- HMAC과 달리 개인키는 한 사람만의 것이라 부인 방지가 된다.
- “이 공개키가 진짜 그 사람 것”임은 CA가 서명한 인증서가 보증하고, 그 믿음은 미리 심긴 루트까지 사슬을 타고 이어진다.
다음 글은 이 시리즈를 실무에서 가장 자주 만나는 자리로 내린다 - 비밀번호는 왜 암호화하지 않고, 어떻게 저장하나.