🌱 해당 포스트는 한걸음 스터디에서 발표한 내용입니다. 발표 내용을 아래 영상에서 확인하실 수 있습니다!
🌱한걸음은 각자 학습한 내용을 토대로 블로그 글을 작성하고, 대면으로 모여서 발표하며, 녹화해 유튜브에 업로드하는 스터디입니다.
들어가며
인터넷은 HTTP 기반으로 동작합니다. 하지만 HTTP는 대학 및 연구소끼리의 문서를 교환하기 위해 제작된 것으로 이렇게 현재와 같이 많은 사람들이 사용할 것을 고려하지 않았습니다. 따라서, 보안 취약점이 있었습니다.
이를 보완하기 위해 여러 가지 방안들이 나왔는데 그중 현재 대중화된 것은 HTTP에 SSL/TLS 계층을 추가한 HTTPS입니다.
이 글에선 HTTPS에 대해 제가 공부했던 것을 정리해보았습니다.
간략하게 알아보는 HTTP
HTTP는 HyperText Transfer Protocol의 줄임말로 웹 서버와 클라이언트(브라우저) 간에 데이터를 전송하기 위한 프로토콜입니다.
예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 됩니다.
"들어가며"에서 언급했듯 HTTP는 아스키 문자를 이용한 평문으로 통신을 진행하기 때문에, 손쉽게 어떤 메시지가 오고 갔는지 그림 2와 같이 파악이 가능합니다.
이 프로토콜을 특정한 인증된 사용자만 이용이 가능하면 큰 문제는 없으나, 오늘날 인터넷으로 발전하면서 정말 수많은 호스트들이 인터넷에 접속하고 있습니다.
이에 특정한 서비스 및 상황에서 사용자가 급증함에 따라 인증된 사람만 메시지를 보도록 하는 "기밀성"과확보가 큰 문제로 대두되었습니다.
예를 들어, 만약 여러분이 네이버에서 로그인을 진행하기 위해 아이디와 비밀번호를 입력하실 겁니다. 하지만, 기존 HTTP는 이를 평문으로 보내서 중간에 해커가 가로채서 본다면 여러분의 아이디가 해킹을 당하게 됩니다. 또한, 지금 접속한 네이버 사이트가 개인이 만든 가짜 네이버 사이트인지, 진짜 네이버 사이트인지에 대한 확인도 필요하겠죠.
그렇게 만들어진 것이 HTTPS입니다.
HTTPS가 제공하는 보안 서비스
HTTPS가 제공하는 보안 서비스는 다음과 같습니다.
1. 접속한 사이트가 신뢰할만한 사이트인지 확인해야 한다. (인증)
2. 제삼자가 통신하는 메시지를 확인할 수 없어야 하고 변조가 되면 안 된다. (기밀성, 무결성)
위 두 서비스를 이해하기 위해선 공개키(비대칭키)에 대해 알아야 합니다.
대칭키와 비대칭키
대칭키와 비대칭키에 대한 기본 골자는 우리가 어떤 키를 통해 암호화했으면 그걸 어떻게 상대가 복호화하게 할 건지에 대한 이야기입니다.
1이라는 메시지를 편지를 담아 보내기 전에 멀리 있는 상대와 내가 +4를 해서 메시지를 주고받을 거라고 합의한 상황 있다고 해봅시다.
여기서 1은 평문이고 +4를 한다는 건 키이며, 1을 5로 변환하는 과정을 암호화, 그 결과로 만들어진 5는 암호문, 받은 상대가 -4 해서 원래 1을 받는 것을 복호화라고 합니다.
그러면 상대한테 내가 어떤 키를 사용해서 암호화를 했는지 알리는 방법이 뭐가 있을까요??
제일 쉬운 것은 상대에게 직접 키를 전달하여 나와 상대가 같은 키를 가지고 있는 겁니다.
이를 대칭 키라고 합니다.
그러면 대칭 키를 통해 인터넷상에선 이 키를 상대에게 어떻게 안전하게 전달할까요??
전달하는 동안 키가 평문이면 중간에 제삼자가 충분히 가로챌 수 있겠죠.
키를 또 다른 키로 암호화할까요??
정말 멀리 있는 상대에게 이 키를 전달하기 위해 직접 찾아가야 할까요??
이렇게 되면 정말 끝도 없어집니다.
그래서 수학자들이 고안한 방식이 비대칭 키입니다.
비대칭키는 기본적으로 공개 키와 개인 키로 나눠지고 두 개의 키값은 다릅니다.
다르지만, 공개 키로 암호화를 했으면 개인 키로 복호화가 가능하고 그 반대도 진행이 가능합니다.
https에선 이 두 가지 방식을 모두 사용하여 인증, 기밀성, 무결성 확보를 실현합니다.
비대칭 키를 이용하여 인증을 제공하는 HTTPS
어느 서버에 접속하기 위해 먼저, 이 서버가 인증된(우리가 가고자 하는) 서버인지 파악을 하기 위해 hand-shake 하는 과정을 거칩니다.
먼저, 임의의 메시지(이하 A 메시지)를 서버에 보냅니다.
서버는 인증서와 임의의 메시지(이하 B 메시지)를 클라이언트에게 전달합니다.
이 인증서는 신뢰할 만한 기관(CA, Certificate Authority)의 개인 키로 복호화가 가능한 인증서입니다.
따라서 클라이언트는 CA에게 이 인증서에 대한 검증을 요구합니다.
만약, 복호화가 정상적으로 된다면 이 서버는 인증된 서버가 되는 겁니다.
인증은 달성했으니 기밀성, 무결성 확보는 어떻게 되는 걸까요??
대칭 키를 이용하여 기밀성을 확보하는 HTTPS
대칭 키를 이용해서 HTTPS는 제삼자가 통신하는 메시지를 확인할 수 없도록 하는 기밀성을 확보합니다.
비대칭 키가 있는데 굳이 대칭 키를 사용하는 것은 대칭 키가 연산량이 비대칭 키에 비해 적어 성능 확보가 가능하기 때문입니다.
즉, 모든 메시지를 비대칭 키로 암호화하면 보안엔 좋지만, 수많은 데이터를 보내는 21세기 인터넷 상황엔 적합하지 않다는 것이지요.
근데 아까 대칭 키의 가장 문제가 통신할 상대와 자신이 공통된 키를 가지는 것이 문제라고 했습니다.
어떻게 이 키를 공유하는 것일까요??
아까 주고받았던 A와 B 메시지를 혼합하여 클라이언트에서 임시 키를 만듭니다.
이 임시 키를 세션 키(공유 비밀 키)라고 합니다.
세션 키를 A 메시지와 합쳐 서버의 공개 키를 사용해서 암호화를 진행한 뒤 서버로 보냅니다.
서버에선 수신된 데이터를 서버 개인 키를 사용해서 복호화를 진행한 뒤 세션 키를 추출합니다.
그리고 수신 완료됐다는 응답도 보냅니다.
클라이언트와 서버는 같은 키인 세션 키를 공유하게 됐으니, 이 세션 키를 대칭 키로 사용하여 암호화를 진행하면 됩니다.
최종적으로 기밀성 및 무결성을 확보한 메시지 통신이 가능하게 됩니다.
위에서 설명했던 로직들을 실현하는 주체 SSL/TLS
엄청 복잡한 과정들을 걸쳐 인증, 기밀성, 무결성을 확보했었습니다.
실제로 HTTPS에서 이런 암호화 통신 과정을 자동으로 처리해 주는 것이 바로 SSL: 보안 소켓 계층(Secure Sockets Layer)입니다.
SSL은 인터넷에서 안전한 데이터 통신을 보장하기 위한 프로토콜이라고 생각하시면 됩니다. 아까 설명드린 hand-shake 과정을 실제로 하는 겁니다.
SSL을 잘 쓰고 있던 와중 시간이 흘러 점점 컴퓨터 성능이 올라감에 따라 암호화 강도가 낮아지고, 새로운 공격 기법들이 등장하면서 한계성이 대두되었습니다.
그렇게 당시 최신이었던 SSL 3.0을 기반으로 새로운 프로토콜을 만들게 됐는데 이것이 TLS(Transport Layer Security)입니다.
최신 버전인 TLS만 알면 되겠지라고 생각하실 수도 있습니다.
하지만, SSL과 TLS는 혼용해서 단어를 많이 쓰기 때문에 둘 다 알아 두셔야 합니다.
요약을 하자면, HTTPS는 SSL/TLS 인증서 기법으로 구현이 되어있다고 생각하시면 됩니다.
참고자료
SI110: Asymmetric (Public Key) Cryptography
SSL, TLS, HTTPS는 무엇인가요? | DigiCert