본문 바로가기

네트워크

[네트워크] HTTPS란 무엇인가?

이 글은 생활코딩-HTTPS를 참고하여 작성된 글입니다.

🤝 HTTPS (Hyper Text Transfer Protocol) + Over Secure Socket Layer

이전 글에서 HTTP를 공부했었는데, 이 규약은 평문 텍스트로 데이터를 주고받기 때문에 보안에 매우 취약하다는 문제점이 있었다. HTTPS는 이를 해결하기 위해 Over Secure Socket Layer라는 개념을 도입하여 보안을 강화한 프로토콜이다.

 

HTTP는 TCP와 직접 통신했는데, HTTPS에서 HTTP는 SSL과 통신하게 되고, SSL이 TCP와 통신하게 된다.

🤔 우선, 용어 정리가 필요하다. 

HTTPS와 SSL

HTTP는 응용 계층에서 사용되는 프로토콜이다. 이 HTTP를 표현계층에서 사용되는 SSL(Secure Socket Layer)로 덮어쓴 것이 바로 HTTPS이다. 즉, HTTPS는 새로운 프로토콜이 아닌, HTTP를 통신하는 소켓 부분을 SSL 프로토콜로 대체하여 사용하는 것이다.

SSL과 TLS

SSL은 네스케이프에 의해 발명되었다. 이것이 점차 널리 사용되다가, 표준화 기구인 IETF의 관리로 변경되면서 TLS라는 이름으로 바뀌었다. 즉, 두 명칭은 동일한 것이다.

공개키와 비밀키

공개 키는 누구나 볼 수 있는 키를 말하며, 비밀 키는 소유자만이 가질 수 있는 키로 서로 암호화/복호화를 한다. 즉, 공개 키로 암호화된 정보를 비밀 키로 복호화한다.

대칭키

하나의 키를 통해 서버와 클라이언트가 암호화, 복호화를 한다. 키를 공유하는 데 어려움이 있으나, 속도가 빠르다.

인증기관(Certificate Authority, CA)

클라이언트가 접속한 서버가 의도한 서버가 맞는지 제삼자로서 보증해주는 역할을 하는 기업들이다.

 

💁‍♂️ HTTPS의 동작 방식

[Client Hello] 우선, 3-way handshake를 통해 연결이 완료되었다면, 클라이언트는 서버에 접속하여 말을 건다. 이때 브라우저가 사용하는 SSL혹은 TLS 버전 정보, 브라우저가 지원하는 암호화 방식, 브라우저가 생성한 임의의 난수 등을 전송한다.

 

[Server Hello] 서버 또한 클라이언트의 인사에 응답하면서, 다음 정보를 클라이언트에게 말은 건다. 이때 브라우저가 지원하는 암호화 방식 중에서 서버가 선택한 암호화 방식, 서버의 공개키가 담긴 제 3자(CA)로 부터 전달받은 SSL 인증서, 서버가 생성한 임의의 난수를 전송한다.

 

[Verify server certificate]클라이언트는 CA로부터 전달받은 공개키를 통해 SSL 인증서를 복호화하여 신뢰할만한 인증서인지 검증한다. 암호화에 사용된 비밀 키는 CA로부터 전달받은 공개키로만 복호화가 가능하기 때문에 온전히 SSL 인증서가 복호화되었다면, 이는 신뢰할 수 있는 SSL 인증서이다.

 

[Client key exchange]클라이언트는 자신이 생성한 난수와 서버로부터 전달받은 난수를 사용하여 데이터를 주고 받을 때 사용할 대칭키를 생성하고, SSL 인증서에 포함되어 있는 서버의 공개키로 대칭키를 암호화하여 서버에게 전송한다.

 

[Client finished] 클라이언트는 handshake과정에서 자신의 역할이 마무리되었다는 의미로 'Finished' 메세지를 보낸다. 

 

[Server finished] 서버 또한 handshake과정에서 자신의 역할이 마무리되었다는 의미로 'Finished' 메세지를 보낸다. 

 

[Exchange message] 서버는 자신의 비밀키로 클라이언트가 전송한 암호화된 대칭키를 복호화한 후, 대칭키를 통해 데이터를 주고받는다. 위에서 언급했듯이, 대칭키는 서버와 클라이언트가 서로 공유하는 데 어려움이 있으나, 속도가 매우 빠르기 때문에 대칭키를 통해 데이터를 주고받는 것이다.