앞 편에서 이름을 숫자 주소로 바꾸는 조회 과정을 다루었다. 숫자 주소를 손에 쥐었으니 이제 실제로 그 서버와 대화를 시작할 차례다. 이번 편은 브라우저가 서버와 통신할 통로를 여는 과정과, 그 통로를 안전하게 만드는 신뢰 확인 절차를 다룬다. 이 단계는 눈에 보이지 않게 순식간에 지나가지만, 부실하면 사이트 전체가 접속 불가에 빠지는 급소이기도 하다.
연결을 여는 일은 전화를 거는 것과 비슷하다. 서로 상대가 준비됐는지 확인하고, 어떤 방식으로 대화할지 약속을 맞춘 뒤에야 본론으로 들어간다. 여기에 더해 요즘은 대부분 암호화된 대화를 나누므로, 서로가 진짜인지 확인하고 아무도 엿듣지 못할 통로를 만드는 절차가 붙는다. 이 모든 과정이 사용자가 첫 글자를 보기도 전에 끝나지만, 그 안에는 정교한 약속이 촘촘히 담겨 있다.
연결을 맺는다는 것
브라우저가 서버와 데이터를 주고받으려면 먼저 둘 사이에 안정적인 통로가 있어야 한다. 이 통로를 만드는 과정에서 브라우저와 서버는 몇 번의 신호를 주고받으며 서로 준비가 됐음을 확인한다. 이 짧은 인사말 같은 절차가 끝나야 비로소 실제 데이터가 오갈 수 있는 상태가 된다. 겉으로는 순식간이지만 이 안에도 여러 번의 오고 감이 숨어 있다.
이 오고 감 한 번에 걸리는 시간이 연결 성능의 핵심 변수다. 서버가 지구 반대편에 있으면 신호가 오가는 데만 해도 무시할 수 없는 시간이 쌓인다. 그래서 연결을 여는 과정에서 오고 감의 횟수를 줄이는 것이 속도 개선의 큰 축이 된다. 최신 통신 방식들이 이 횟수를 줄이는 데 집중하는 이유도 여기에 있다.
한번 열린 통로는 곧바로 닫지 않고 잠시 유지하면서 여러 요청에 재사용하는 것이 보통이다. 매번 새로 통로를 여는 것은 비용이 크므로, 이미 열어 둔 길로 계속 데이터를 흘려보내는 편이 훨씬 효율적이다. 이 재사용이 제대로 이뤄지지 않으면 요청마다 인사말을 반복하느라 속도가 떨어진다.
최근에는 통로를 만드는 방식 자체가 진화하고 있다. 전통적인 방식은 한 통로에서 문제가 생기면 그 통로로 오가던 모든 데이터가 함께 멈추는 약점이 있었는데, 새로운 방식은 여러 흐름을 서로 독립적으로 다뤄 하나가 막혀도 나머지는 계속 흐르게 만들었다. 이 차이는 불안정한 통신망에서 특히 큰 체감 차이를 낸다. 새 방식은 연결을 여는 오고 감도 줄여 첫 응답을 더 빨리 받게 하고, 한 번 대화했던 상대와 다시 연결할 때는 인사말을 대폭 생략하기도 한다.
대화를 암호로 감싸는 까닭
브라우저와 서버가 아무런 보호 없이 대화한다면, 그 사이 통신망을 지켜보는 누군가가 오가는 내용을 그대로 엿볼 수 있다. 로그인 정보나 개인 메시지 같은 민감한 내용이 훤히 드러나는 것은 물론이고, 심하면 중간에서 내용을 몰래 바꿔치기할 수도 있다. 그래서 오늘날의 웹은 대화를 암호로 감싸는 것을 기본으로 삼는다.
암호화된 통로 안에서는 누군가 신호를 가로채도 그 내용을 알아볼 수 없고, 내용을 몰래 바꾸려는 시도도 곧바로 들통난다. 암호화가 지켜 주는 것은 크게 세 가지다. 오가는 내용이 새어 나가지 않게 하는 비밀 유지, 중간에서 내용이 바뀌지 않았음을 보장하는 무결성, 그리고 대화하는 상대가 진짜임을 확인하는 신원 증명이다.
이 셋 중 신원 증명이 가장 자주 간과된다. 내용을 아무리 잘 숨겨도 상대가 가짜라면 그 가짜에게 비밀을 고스란히 넘겨주는 셈이 되기 때문이다. 그래서 뒤에서 다룰 신뢰 확인 절차가 암호화만큼이나 중요하다. 세 가지가 함께 지켜져야 비로소 안전한 대화라 할 수 있다.
암호화된 통로를 여는 과정에서 브라우저와 서버는 서로만 아는 비밀 열쇠를 즉석에서 만들어 낸다. 이 열쇠는 오직 그 대화에서만 쓰이고, 통신망을 통해 직접 주고받지 않는 방식으로 안전하게 합의된다. 과거에는 이런 암호화가 무겁고 느리다는 인식이 있었으나, 지금은 부담이 크게 줄었고 오히려 암호화된 연결에서만 쓸 수 있는 빠른 통신 방식이 생겨 안 쓰는 것이 손해인 상황이 됐다.
상대가 진짜임을 확인하기
암호화된 연결을 열 때 서버는 자신이 진짜라는 것을 증명하는 증서를 브라우저에 제시한다. 이 증서에는 서버의 신원 정보와, 믿을 만한 발급 기관이 그 정보를 보증한다는 서명이 담겨 있다. 브라우저는 이 증서를 받아 여러 각도에서 진위를 따진다.
가장 먼저 확인하는 것은 이 증서가 브라우저가 신뢰하는 발급 기관에서 나왔는가다. 세상에는 신원을 보증해 주는 공인된 기관들이 있고, 브라우저는 이들의 목록을 미리 가지고 있다. 증서가 이 신뢰의 사슬을 따라 공인 기관까지 이어지지 않으면 브라우저는 경고를 띄우고 연결을 거부한다. 서버가 자기 증서만 내밀고 그것을 보증하는 중간 단계의 증서를 함께 제시하지 않으면, 일부 환경에서 이 사슬이 끊어져 검증에 실패한다.
다음으로 브라우저는 그 증서가 아직 유효 기간 안에 있는지 확인한다. 증서에는 언제부터 언제까지 유효한지가 적혀 있는데, 이 기간이 지났다면 정상적으로 발급된 증서라도 더 이상 믿지 않는다. 만료된 증서는 사이트 전체를 접속 불가로 만드는 흔한 사고 원인이다. 또한 브라우저는 그 증서가 지금 접속하려는 바로 그 주소를 위한 것인지도 대조한다. 다른 주소를 위해 발급된 증서를 엉뚱한 곳에 쓰면 신원이 일치하지 않아 거부된다.
마지막으로 그 증서가 도중에 폐기되지는 않았는지도 살핀다. 발급 후에 열쇠가 유출되는 사고로 증서를 무효화해야 하는 경우가 있는데, 브라우저는 폐기 목록을 참고해 이미 무효가 된 증서를 걸러 낸다. 이 여러 겹의 확인을 모두 통과해야 비로소 대화가 시작된다. 안전이란 결국 여러 겹의 확인이 쌓여 만들어지며, 이 겹겹의 확인이 사용자가 자물쇠 표시를 믿고 정보를 맡길 수 있게 하는 근거다.
인사말의 흐름과 속도
안전한 연결을 여는 이 일련의 인사말은 몇 번의 오고 감으로 이뤄진다. 브라우저가 대화를 청하면 서버가 자기 증서와 함께 응답하고, 브라우저가 이를 검증한 뒤 둘이 함께 비밀 열쇠를 합의하면 준비가 끝난다. 이 과정을 얼마나 적은 오고 감으로 끝내느냐가 첫 응답 속도를 좌우한다.
최신 방식은 이 인사말을 예전보다 크게 간소화해서, 한 번의 오고 감만으로 안전한 연결을 열 수 있게 됐다. 예전에는 여러 차례 신호를 주고받아야 했던 것을 크게 줄인 것이다. 이 개선은 특히 먼 거리의 사용자에게 큰 이득이 된다. 신호가 오가는 물리적 시간은 줄일 수 없지만, 오가는 횟수 자체를 줄이면 그만큼 지연이 사라진다.
여기서 한 걸음 더 나아가, 이전에 대화한 적 있는 상대와 다시 연결할 때는 인사말을 거의 생략하고 곧바로 데이터를 보내기 시작하는 방법도 있다. 서로 지난 대화의 흔적을 기억해 두었다가 그것을 근거로 빠르게 신뢰를 복원하는 것이다. 이렇게 하면 재방문의 첫 응답이 놀라울 만큼 빨라진다.
다만 이렇게 인사말을 생략하는 빠른 재개에는 조심할 점이 있다. 어떤 요청은 실수로 두 번 처리되면 곤란한데, 인사말을 생략한 채 미리 보낸 데이터는 드물게 중복될 여지가 있어 상태를 바꾸는 요청에는 신중해야 한다. 새로운 통신 방식을 쓰고, 연결을 재사용하고, 미리 준비하고, 재방문 시 인사말을 생략하는 네 가지가 어우러지면 안전하면서도 빠른 연결이 완성된다.
안전한 페이지에 섞인 위험
페이지 전체를 암호화된 연결로 받아 왔더라도, 그 페이지가 불러오는 개별 자원까지 모두 안전하다는 보장은 없다. 문서는 암호화된 경로로 왔는데 그 안의 이미지나 스크립트가 암호화되지 않은 경로로 섞여 들어오면, 그 자원을 오가는 동안은 보호가 뚫린다. 이렇게 안전한 문서에 안전하지 않은 자원이 섞이는 상황을 혼합 상태라 부른다.
이 혼합이 위험한 이유는 보호의 사슬이 가장 약한 고리에서 끊어지기 때문이다. 문서 본문이 아무리 잘 보호되어도, 그 안에서 동작을 좌우하는 스크립트가 보호 없이 실려 오면 중간에서 그 스크립트를 바꿔치기해 페이지 전체를 장악할 수 있다. 그래서 브라우저는 이런 위험한 혼합을 발견하면 해당 자원을 아예 차단한다. 화면 일부가 빈 채로 뜨는 원인이 여기에 있을 때가 많다.
덜 위험한 혼합은 차단 대신 승격으로 다룬다. 이미지처럼 페이지를 장악할 위험이 낮은 자원이 안전하지 않은 경로로 지정되어 있으면, 브라우저는 그것을 차단하는 대신 조용히 안전한 경로로 바꿔 다시 시도한다. 이 자동 승격은 옛 주소가 섞인 페이지를 큰 탈 없이 지켜 주지만, 그 자원이 안전한 경로로 제공되지 않으면 결국 실패한다.
이 문제를 예방하는 원칙은 페이지가 불러오는 모든 자원의 경로를 처음부터 안전한 방식으로 통일하는 것이다. 자원의 주소를 특정 방식에 못 박아 두기보다, 페이지가 열린 방식을 그대로 따르게 만들면 혼합이 생길 여지가 사라진다. 안전한 연결은 문서 하나를 지키는 것이 아니라 그 문서가 끌어오는 모든 조각을 함께 지켜야 완성된다.
브라우저는 이 안전의 상태를 사용자에게 간단한 표시로 알린다. 주소창 옆의 자물쇠 같은 표시가 그것인데, 연결이 안전하게 맺어지고 증서 검증을 모두 통과했을 때에만 나타난다. 사용자는 이 표시를 보고 정보를 입력해도 되는지를 판단한다. 그래서 이 표시가 뜨지 않거나 경고로 바뀌면, 사용자는 그 페이지를 신뢰하지 않고 떠난다.
경고에도 단계가 있다. 증서가 조금 미심쩍은 수준이면 부드러운 알림에 그치지만, 신뢰의 사슬이 끊어졌거나 만료된 증서처럼 명백한 문제가 있으면 브라우저는 화면 전체를 가리는 강한 경고로 접근을 막는다. 이 강한 경고는 사용자를 보호하려는 장치이지만, 서비스 입장에서는 방문자를 통째로 잃는 사고가 된다. 그래서 안전한 연결을 관리하는 일은 곧 이 경고가 뜨지 않게 하는 일이기도 하다.
실무의 함정과 꾸준한 관리
안전한 연결에서 가장 자주 발생하는 사고는 단연 증서 만료다. 증서에는 유효 기간이 있어 때가 되면 반드시 갱신해야 하는데, 이를 놓치면 어느 날 갑자기 사이트 전체가 접속 불가가 되고 사용자에게는 무시무시한 경고 화면이 뜬다. 서버는 멀쩡히 돌아가는데도 그렇다.
더 곤란한 점은 최근 들어 증서의 유효 기간이 점점 짧아지는 흐름이라는 것이다. 짧은 수명은 사고가 났을 때 위험이 노출되는 기간을 줄이는 장점이 있지만, 그만큼 갱신을 더 자주 해야 한다는 부담을 안긴다. 사람이 손으로 챙기기에는 놓칠 위험이 너무 커졌다. 그래서 오늘날의 정답은 갱신을 자동화하는 것이다. 정해진 절차에 따라 증서를 자동으로 발급받고 만료 전에 알아서 갱신하도록 해 두면, 날짜를 잊어도 사고가 나지 않는다.
증서의 신뢰 사슬이 완전한지도 새 서버를 열 때마다 확인해야 하는 항목이다. 앞서 말했듯 중간 단계의 증서를 빠뜨리면 일부 환경에서 검증에 실패하는데, 이런 문제는 특정 환경에서만 나타나 재현이 까다롭다. 연결 재사용이 제대로 되고 있는지도 중요한 점검 항목이다. 설정이 잘못되면 매 요청마다 통로를 새로 여느라 불필요한 인사말이 반복되어 속도가 떨어진다.
안전한 연결은 한 번 잘 세팅했다고 끝나는 것이 아니라 꾸준히 돌봐야 하는 살아 있는 부분이다. 자동 갱신을 걸어 두고, 신뢰 사슬을 챙기고, 재사용을 확인하는 습관이 사고를 막는다. 다음 편에서는 이렇게 안전하게 받아온 문서를 브라우저가 어떻게 구조로 바꾸는지, 문서 해석의 과정으로 넘어간다.