크롬 주소창에 https://www.naver.com을 입력하면 무슨일이 발생할까?
한 때 면접 단골 질문으로 유명했던 질문이다.
이 질문에 좀 더 길게 답변할 수 있도록(?) https 통신 프로세스에 대하여 정리해 보았다.
HTTPS는 HyperText Transfer Protocol Secure의 약자로, 인터넷 상에서 데이터를 안전하게 전송하기 위해 HTTP에 데이터 암호화를 추가한 프로토콜이다.
HTTPS는 HTTP에 비해 보안적으로 강화된 통신 방식을 제공하는데, 두 가지 중요한 이점이 있다.
HTTPS는 데이터를 암호화하여 전송한다. 이는 만약 데이터가 도중 탈취되더라도, 탈취자가 그 내용을 읽을 수 없게 만든다. 이 암호화 과정에서 대칭키와 비대칭키가 사용된다.
대칭키: 하나의 키로 데이터를 암호화하고 동일한 키로 복호화한다. 이 키는 세션 동안 클라이언트와 서버만이 공유하며, 세션 키라고도 한다.
비대칭키: 한 쌍의 키를 사용한다. 하나는 공개키로 누구에게나 공개될 수 있고, 다른 하나는 개인키로 서버에만 저장되어 있다. 공개키로 암호화된 데이터는 개인키로만 복호화할 수 있다. (그 반대로 사용할 수 도 있음.)
HTTPS는 특정 웹 사이트가 진짜 그 조직의 정식 사이트인지 검증한다.
예를 들어, "신한은행" 사이트가 실제로 신한은행의 공식 사이트인지를 Certificate Authority(CA)라고 불리는 공인된 기관에서 검증해준다.
신한은행에서 만든 사이트는 자신이 신한은행임을 CA 기관에 증명하여 인증을 받아야한다.
이 과정을 통해 "신헌은행"과 같은 피싱 사이트는 HTTPS 통신을 사용할 수 없게 된다.
반대로, 만약 내가 만든 웹 사이트에서 HTTPS를 도입하고 싶다면, CA 기관의 보안 요건을 충족시켜야 한다.
Client와 Server간 통신시 HTTPS의 경우 암호화된 데이터를 전송하게 된다.
때문에 복호화를 위한 키를 주고 받아야 하는데, 이를 위해 조금 더 복잡한 hanshack 과정을 거치게 된다.
컴퓨터간(Client, Server간) 통신을 위해서는 상대 컴퓨터가 데이터를 받을 수 있는 환경인지 확인하는 절차가 필요하다.
Handshack란 이러한 확인 절차로서 TCP handshack의 경우 Target 컴퓨터에 "SYN" 메세지를 보내고 "SYN ACK" 신호를 받고, 마지막으로 "ACK" 신호를 보냄으로서 서로 데이터를 주고받을 수 있는 환경임을 검증한다.
HTTPS 통신의 경우 TLS Handshack란 조금 더 복잡한 과정을 거치게 되는데, 이 과정에서 데이터 암복호화에 사용되는 키를 공유하게 된다.
위 그림은 Client와 Server간의 TLS Handshack도중 키교환 프로세스만을 도식화 한 그림이다.
HTTPS 통신에서는 해당 과정을 통해 Client와 Server간에 동일한 대칭키를 공유하고 해당 키를 사용하여 암호화 통신을 한다.