공개 조각만 교환하고 공유 비밀은 각자 계산해요. 공개 조각을 전부 지켜봐도 비밀 조각 없이는 같은 값을 계산할 수 없어요.
05 · 내용을 암호로 보호하기
비밀을 보내지 않고 둘만의 열쇠를 만듭니다.
서로 공개 조각만 주고받고, 비밀 조각은 각자 보관합니다. 도청자가 모든 장면을 봐도 공유 비밀을 계산하지 못하는 이유를 따라가 보세요.
비밀은 각자 보관한다
매 장면의 도청자 칸만 보세요
공개 조각만 보고도 안전한 이유
- 1내 공개 조각
- 2서버 공개 조각
- 3같은 열쇠
- 4서버 확인
- 5연결 완료
- 6암호문 전송
아래 ‘보안 연결 시작’을 누르고, 매 장면의 도청자 칸을 함께 확인해 보세요.
비밀 세 가지만
도청자가 비밀과 평문을 얻지 못한 이유
인증서 사슬과 호스트 이름을 확인하고, CertificateVerify 서명으로 서버가 인증서의 개인키를 실제로 갖고 있는지도 확인해요.
연결이 완성되면 TLS 안의 비밀번호나 카드 번호는 잠긴 채로 이동해요. 다만 IP 주소, 통신 시각과 크기 같은 정보까지 숨기는 것은 아니에요.
이 데모에 대하여
도청자 시점을 같은 화면에 함께 띄웁니다
이 데모의 열세 단계에는 양쪽이 가진 열쇠 상태뿐 아니라 ‘도청자에게 지금 무엇이 보이는가’가 단계마다 함께 들어 있습니다. 암호화를 설명하는 자료 대부분이 통신하는 두 쪽만 그리는데, 중간에서 보는 사람의 시야가 어느 시점에 막히는지를 같이 보여주지 않으면 왜 안전한지가 설명되지 않기 때문입니다. 공개된 값만 오가는데도 둘만 아는 열쇠가 생긴다는 것이 이 화면에서 확인할 내용입니다.
- 첫 두 단계에서 도청자 칸에 모든 내용이 그대로 보이는 것을 확인합니다.
- 세 번째와 다섯 번째 단계에서 양쪽 열쇠 상태가 각각 준비 완료로 바뀌는 순간을 봅니다.
- 그 시점에 도청자 칸이 왜 실패로 바뀌는지 설명을 읽습니다.
- 여섯 번째 단계부터 오가는 메시지가 잠긴 상태로 표시되는지 확인합니다.
- 인증서를 확인하는 단계에서 무엇을 검사하는지 항목을 봅니다.
- 마지막 단계에서 도청자가 끝내 얻은 것과 얻지 못한 것을 정리합니다.
- 열쇠가 완성되는 두 단계에서 회선 위에 아무것도 없다는 점을 확인합니다.
- 메시지가 잠기는 시점과 연결이 보호되는 시점이 다르다는 것을 짚습니다.
열쇠가 만들어지는 순서
01
완성된 열쇠는 회선을 지나지 않습니다.
양쪽은 각자 비밀 조각을 하나씩 만들어 자기 쪽에 두고, 그것으로 계산한 공개 조각만 보냅니다. 그리고 상대의 공개 조각과 자기 비밀 조각을 합쳐 같은 결과를 얻습니다. 열쇠 자체가 한 번도 전송되지 않기 때문에, 회선을 전부 기록해 둔 사람도 열쇠를 주울 수 없습니다. 화면에서 열쇠 상태가 양쪽 모두 준비 완료로 바뀌는 순간에 회선 위에는 아무것도 지나가지 않는다는 점이 그 표현입니다.
02
공개 조각 두 개로는 부족합니다.
도청자는 양쪽의 공개 조각을 모두 봅니다. 그런데 열쇠를 만들려면 공개 조각 하나와 자기 비밀 조각이 함께 필요하고, 도청자는 어느 쪽 비밀도 갖고 있지 않습니다. 화면의 도청자 칸이 네 번째 단계에서 재료를 다 모았다고 했다가 다섯 번째 단계에서 실패로 바뀌는 것이 이 지점이며, 무엇을 모았느냐가 아니라 무엇이 없느냐가 결정적이라는 것을 보여줍니다.
03
암호화보다 신원 확인이 먼저 필요합니다.
열쇠가 생겼다고 안전한 것이 아닙니다. 중간에 있는 사람이 서버인 척하며 자기 공개 조각을 보냈다면 그 사람과 열쇠를 나눠 가진 것이 되기 때문입니다. 그래서 서버는 인증서를 보내고, 그 인증서의 개인키를 실제로 갖고 있다는 증명까지 함께 보냅니다. 이 데모가 열쇠 교환 뒤에 신분 확인 단계를 따로 둔 것은 순서 자체가 설명의 일부이기 때문입니다.
04
인증서는 여러 항목을 함께 봅니다.
화면에서 확인하는 것은 인증서가 있다는 사실 하나가 아니라, 신뢰할 수 있는 사슬로 이어지는지 · 접속하려던 호스트 이름과 맞는지 · 유효 기간 안인지 · 개인키 소유가 증명되는지입니다. 이 중 하나라도 어긋나면 연결을 중단해야 하며, 브라우저가 경고를 띄우는 경우 대부분이 이 항목들 중 하나가 맞지 않는 상황입니다.
05
마지막 확인값이 위조를 잡아냅니다.
양쪽은 지금까지 주고받은 내용 전체를 요약한 값을 서로 보내 맞춰 봅니다. 중간에서 누가 메시지를 하나라도 바꿨다면 이 요약값이 달라져 그 자리에서 걸립니다. 특히 첫 단계에서 오간 암호 방식 목록은 평문이라 누구나 고칠 수 있는데, 약한 방식으로 낮추려는 시도가 있었다면 이 단계에서 드러납니다.
06
비유로 바꾼 부분이 있습니다.
화면의 비밀 조각과 공개 조각은 실제 수학 연산을 그대로 옮긴 것이 아니라, 각자 가진 것과 주고받는 것을 구분해 보여주기 위한 비유입니다. 실제 계산은 특정한 수학 구조 위에서 이뤄지고 그 안전성은 계산이 어렵다는 성질에 기대고 있습니다. 이 화면이 보여주려는 것은 그 계산 방법이 아니라, 공개된 값만 오가는데 둘만 아는 값이 생긴다는 구조입니다.
07
일회용 값이 매번 다른 열쇠를 만듭니다.
양쪽이 보내는 메시지에는 그때그때 새로 만든 값이 하나씩 들어 있습니다. 이것이 없으면 같은 상대와 다시 연결할 때 같은 열쇠가 나올 수 있고, 예전에 기록해 둔 대화를 그대로 다시 보내는 공격이 통하게 됩니다. 매번 다른 열쇠를 쓰면 어느 한 번의 열쇠가 나중에 드러나도 다른 연결의 내용까지 함께 풀리지는 않습니다.
08
잠기는 시점이 두 번에 걸쳐 옵니다.
화면을 넘기다 보면 메시지가 잠긴 것으로 바뀌는 시점과 연결 전체가 보호되는 것으로 표시되는 시점이 다릅니다. 열쇠 재료가 생긴 직후부터 인증서 같은 절차용 메시지는 이미 보호되지만, 실제 데이터를 보내도 되는 상태는 양쪽이 확인값을 주고받은 뒤입니다. 이 두 시점을 구분해 표시한 것은, 암호화가 켜졌다는 것과 상대를 믿어도 된다는 것이 서로 다른 조건이기 때문입니다.
절차의 뼈대만 남기고 단순화했습니다.
실제 연결에서는 이 화면보다 훨씬 많은 것이 오갑니다. 여러 확장 항목, 세션을 다시 쓰는 방식, 서버가 클라이언트에게도 인증서를 요구하는 경우, 실패했을 때 협상을 다시 하는 절차는 모두 생략했습니다. 화면에 나오는 암호문과 검증값은 실제 계산 결과가 아니라 자리를 보여주기 위한 예시이고, 브라우저는 어떤 서버에도 접속하지 않습니다. 그리고 암호화가 모든 것을 가려 주지는 않습니다. 마지막 단계 설명에 적어 둔 것처럼 통신한 시각과 주고받은 양은 여전히 밖에서 관찰할 수 있고, 접속하려는 서버 이름이 노출되는 경우도 있습니다. 이 화면은 연결을 여는 절차만 다루므로 인증서를 발급하고 폐기하는 체계, 암호 방식의 선택 기준 같은 운영 측면은 별도의 주제입니다.
참고 자료RFC 9846 — TLS 1.3 (현행 규격, RFC 8446 대체) ↗RFC 9293 — Transport Control Protocol ↗
실험을 마쳤다면