어떻게 엿보지 못하게 잠그기, HTTPS
엽서에 비밀번호를 적어 보낸다고 생각해 보자. 엽서가 거쳐 가는 우체국 사람이라면 누구든 슬쩍 읽을 수 있다. 보통 HTTP가 바로 그렇다. 주고받는 내용이 길 위에서 그대로 보여요. 그런데도 우리는 카드 번호를 인터넷으로 안심하고 보낸다. 그 비밀이 HTTPS예요.
중간에서 엿본다
앞에서 본 것처럼 HTTP는 요청과 응답을 주고받는 약속이다. 그런데 보통 HTTP로 오가는 내용은 글자 그대로 길 위를 지나간다.
패킷은 공유기와 여러 라우터를 거쳐 가는데, 그 가운데 누군가 들여다보면 비밀번호도 카드 번호도 그대로 읽힌다. 엽서를 부치는 것과 같아요. 거쳐 가는 사람마다 읽을 수 있다. 앞 레슨에서 걱정한 쿠키 번호도 마찬가지다.
평문 HTTP로 보낸 메시지를 길 위 '중간 사람'을 눌러 엿보자. 비밀이 그대로 읽혀요.
엿보면 그대로 읽힌다는 것을 확인했다. 내용이 길 위에 고스란히 드러나 있기 때문이다.
그렇다면 어떻게 막을까? 길을 막거나 중간에 있는 사람을 모두 없앨 수는 없다. 인터넷은 원래 여러 손을 거쳐 가게 만들어진 길이니까요. 그래서 생각을 바꾼다. 보이더라도 읽지 못하게 만들면 돼요. 내용을 자물쇠로 잠그는 것이다.
자물쇠로 잠근다
첫걸음은 잠그기다. 보내기 전에 정해진 규칙에 따라 내용을 뒤섞어 알아볼 수 없게 만든다. 이것을 암호화라고 하고, 뒤섞인 내용을 원래대로 되돌리는 것을 복호화라고 한다.
잠긴 내용은 글자가 뒤죽박죽이라 중간 사람이 봐도 뜻을 알 수 없어요. 푸는 열쇠를 가진 받는 쪽만 원래 글로 되돌린다. 엽서를 잠긴 상자에 넣어 보내는 셈이다. 상자는 보여도 안은 보이지 않는다.
메시지를 눌러 자물쇠로 잠가 보자(암호화). 잠그면 글자가 뒤죽박죽이라 중간 사람이 봐도 못 읽어요.
잠그고 나니 중간 사람이 봐도 읽지 못한다. 그런데 어려운 점이 하나 남는다. 잠근 것을 받는 쪽이 풀려면 푸는 열쇠가 있어야 한다.
처음 찾아가는 사이트와 열쇠를 미리 나눠 가졌을 리는 없으니, 열쇠도 길 위로 보내야 해요. 하지만 그러면 중간 사람이 열쇠까지 손에 넣는다. 상자를 잠가 놓고 열쇠를 함께 부치는 꼴이다. 이 문제를 어떻게 풀까?
자물쇠는 나눠 주고, 열쇠는 혼자 갖는다
기발한 해법이 있다. 잠그는 자물쇠와 여는 열쇠를 따로 만드는 것이다. 자물쇠는 누구나 가져가서 채울 수만 있고, 이것을 공개키라고 해요. 그 자물쇠로 잠근 것은 짝이 되는 비밀키로만 열린다.
그래서 자물쇠는 길 위에 뿌려도 괜찮아요. 잠글 수만 있지 열 수는 없기 때문이다. 받는 쪽이 건넨 자물쇠로 잠가 보내면, 그것은 받는 쪽이 혼자 가진 비밀키로만 풀린다.
받는 쪽이 공개키(자물쇠)를 건넨다. 그 자물쇠로 잠가 보내면 그 사람의 비밀키로만 열려요. 중간 사람의 열쇠로는 안 열린다.
이제 열쇠 문제가 풀렸다. 자물쇠는 마음껏 나눠 줘도 되고, 여는 비밀키는 받는 쪽 손에만 있으니까요.
실제 HTTPS는 이 방법을 처음에 한 번만 써서 둘이 함께 쓸 비밀 열쇠를 안전하게 정하고, 그다음부터는 그 열쇠로 빠르게 잠그고 푼다. 그런데 아직 한 가지가 남았다. 내게 자물쇠를 건넨 상대가 정말 내가 찾던 그 사이트일까? 가짜가 자기 자물쇠를 내밀었다면 어떻게 될까?
진짜인지 확인한다
마지막 조각은 신원 확인이다. 사이트는 자물쇠와 함께 인증서라는 신분증을 내민다. 인증서는 믿을 만한 기관이 '이 자물쇠는 정말 이 사이트의 것'이라고 보증해 준 증명서예요.
브라우저는 믿을 만한 기관의 목록을 미리 가지고 있어서, 인증서를 보고 진짜인지 확인한다. 가짜 사이트는 그런 보증을 받을 수 없다. 그래서 인증서가 맞지 않으면 경고가 떠서 우리를 멈춰 세운다.
두 사이트가 인증서를 내민다. 각각을 눌러 진짜인지 확인해 보자. 진짜는 통과하고, 가짜에는 경고가 떠요.
이제 다 갖추었다. 내용은 자물쇠로 잠가 읽지 못하게 하고, 여는 비밀키는 받는 쪽만 가지며, 상대가 진짜인지는 인증서로 확인한다. 이 셋이 모이면 중간에 누가 있어도 안심이에요. 봐도 읽지 못하고, 가짜는 들통나기 때문이다.
주소창의 자물쇠 표시가 바로 이 약속이 켜져 있다는 뜻이다. 다만 자물쇠 표시는 대화가 잠겨 있다는 뜻일 뿐, 그 사이트가 믿을 만한 곳이라는 보증은 아니에요.
정리
한 줄로 모으면 이렇다. 보통 HTTP는 내용이 그대로 드러나서 중간에서 다 보인다. HTTPS는 내용을 자물쇠로 잠근다(암호화).
자물쇠인 공개키는 누구에게나 나눠 주고, 그것으로 잠근 것은 짝이 되는 비밀키로만 열어요. 인증서로 상대가 진짜인지도 확인한다. 그래서 카드 번호도, 로그인 쿠키도 안심하고 보낼 수 있다.
핵심을 차례로 눌러 되짚어 보자. (평문은 엿보임 → 자물쇠로 잠금 → 자물쇠는 나눠 주고 비밀키는 혼자 → 인증서로 진짜 확인)
이제 네트워크에서 오가는 데이터를 어떻게 지키는지 알았다. 잠그고, 열쇠를 지키고, 상대를 확인하는 것이다.
지금까지 패킷, 주소, 길 찾기, 이름 찾기, 믿음직한 전달, 웹의 대화와 그것을 지키는 방법까지 하나씩 살펴보았어요. 다음 레슨에서는 이 조각들을 한데 모아, 주소창에 주소를 넣은 순간부터 화면에 페이지가 뜨기까지 무슨 일이 차례로 일어나는지 처음부터 끝까지 따라간다.