본문 바로가기

네트워크

[HTTP] HTTP, HTTPS, SSL Handshake

HTTP

HTTP는 HyperText Transfer Protocol의 약어로 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜입니다. 즉 클라이언트와 서버 사이에서 데이터를 주고 받을 수 있도록 정해진 규칙이며 HTML 문서와 같은 리소스들을 가져올 수 있도록 도와줍니다.

HTTP 특징

  • 클라이언트 서버 구조
  • 무상태 프로토콜(stateless)
  • 비연결성(connectionless)
  • HTTP 메시지
  • 단순함 확장가능

클라이언트 서버 구조

HTTP는 클라이언트 서버 구조로 되어있는데 클라이언트가 서버에 요청을 보내면 서버에서 요청에 대한 결과를 만들어서 응답해 줄 때까지 대기하는 구조입니다. 이렇게 클라이언트와 서버로 나누어져 있을 때 장점은 서비스 로직이나 데이터를 다루는 작업은 서버쪽에 구현을 하고 UI/UX 같은 유저가 직접 마주하는 영역은 클라이언트에 구현함으로써 각각 독립적으로 확장할 수 있습니다. 

 

무상태 프로토콜(stateless)

들어보신적이 있겠지만 HTTP는 stateless한 특징을 갖고 있습니다. stateless란 서버가 클라이언트의 상태를 보존하지 않는다는 것을 의미하는데 이럴 경우 갑자기 클라이언트의 요청이 증가해도 서버가 클라이언트의 상태를 몰라도 되기 때문에 쉽게 서버를 증설할 수 있습니다. 즉 수평적 확장(스케일 아웃)이 쉽습니다. 대신 클라이언트는 매 요청 시마다 필요한 추가 데이터를 전송해줘야하는 단점이 있고 로그인과 같은 상태가 유지되어야 하는 경우에는 사용할 수 없다는 단점이 있습니다.

 

비연결성(connectionless)

HTTP는 또한 connectionless한 특징도 갖고 있는데 만약 매 요청 시마다 맺었던 모든 연결이 유지된다면 사용하지 않는 연결도 계속 유지되어야하기 때문에 서버의 자원이 소모된다는 단점이 있습니다. 그래서 HTTP는 기본적으로 연결을 유지하지 않는 모델을 사용하며 매 요청시마다 TCP/IP 연결을 새로 맺었다가 끊어주어야 합니다.

HTTPS

HTTP 만으로는 중간에 패킷이 탈취될 위험이 있어 보안이 취약합니다. 그래서 중간에 암호화 과정을 거쳐 HTTP에 보안 계층을 추가한 것이 HTTPS 입니다. 암호화 과정은 SSL Handshake 과정을 통해서 이루어지는데 SSL Handshake란 TCP 3 way handshake 과정으로 클라이언트와 웹 서버가 연결된 직후 진행되며 서로 암호화 통신을 시작할 수 있도록 신분을 확인하고 검증하는 과정입니다.

SSL Handshake

SSL Handshake 과정은 제3자 인증, 공개키 암호화, 비밀키 암호화를 혼합해서 사용합니다.

제3자 인증이란 믿을 수 있는 인증기관에 등록된 인증서만 신뢰하는 것이고, 공개키 암호화는 비밀키를 공유하기 위해 사용합니다. 비밀키 암호화는 통신하는 데이터를 암호화하는데 사용합니다.

SSL Handshake 과정

  1. 사이트에서 인증기관에 사이트의 정보와 사이트 공개키를 보냅니다.
  2. 인증기관에서 인증기관의 개인키로 사이트의 정보와 공개키를 암호화하여 인증서를 생성한 뒤 사이트로 전달해 줍니다. 이때 인증기관의 개인키를 복호화 할 공개키가 클라이언트 브라우저 내장되어 있습니다.
  3. 클라이언트가 사이트에 접속을 시도하면 사이트에서 클라이언트로 인증서를 보냅니다.
  4. 클라이언트 브라우저에 내장되어 있는 인증기관의 공개키로 인증기관의 개인키로 암호화 되어있는 인증서를 복호화 한 뒤 인증서가 유효한지 검증하고 사이트 정보와 사이트의 공개키를 얻습니다.
  5. 클라이언트는 사이트로 전달할 데이터를 암호화 할 대칭 키를 만들고 이 대칭키를 인증서에서 얻은 사이트의 공개키로 암호화 합니다.
  6. 암호화된 데이터를 사이트로 보내면 사이트의 개인키로 데이터를 복호화 한 뒤 클라이언트의 대칭키를 얻고 이 대칭키로 통신을 주고 받습니다.