HTTP

SSL/TLS 프로토콜

RubyRabbit 2022. 8. 8. 15:50

SSL / TLS 프로토콜

  • Secure Socket Layer / Transport Layer Security
  • 데이터를 암호화하여 전송하기 위한 보안 전송 계층의 프로토콜
  • 과거에는 SSL 을 사용했으나 현대에는 보완된 TLS 를 사용함

 

디지털 인증서와 CA

  • 서버는 디지털 인증서를 발급하는 CA 를 통해 인증서를 발급받는다.
  • 서버는 발급받은 인증서를 클라이언트에게 제공하여 인증을 처리한다.

 

SSL Handshake

Pre Master Secret 값은 서버가 인증서를 통해 전달한 공개키로 암호화하여 전송되며 서버는 해당 값을 공개키에 매칭되는 개인키로 복호화한다.

  • 암호화된 HTTP 데이터를 전송하기 위 정보를 교환하는 과정
    1. Client Hello
      • Pre Master Secret 을 생성하기 위한 클라이언트 랜덤 데이터와 클라이언트가 지원하는 암호화 방식 목록, 세션 ID를 전송
    2. Server Hello
      • Pre Master Secret 을 생성하기 위한 서버 랜덤 데이터와 인증서, Client Hello 단계에서 받은 암호화 방식 목록 중에서 사용 가능한 암호화 방식을 선택해서 전송. 
    3. Pre Master Secret 전송
      • 인증서를 수신한 클라이언트는 내장된 CA의 공개키를 이용해서 인증서를 복호화(브라우저는 CA 리스트를 가지고 있음)
      • 클라이언트는 서버 랜덤데이터와 클라이언트 랜덤데이터를 조합하여 Pre Master Secret 를 생성한 후 해당 값을 인증서에 포함된 서버의 공개키로 암호화하여 서버에 전송. 서버에서는 공개키에 매칭되는 개인키로 복호화한 Pre Master Secret 값을 통해 Session Key 를 얻어낸다.
    4. SSL Handshake 종료

 

전송 데이터의 암호화 / 수신 데이터의 복호화

데이터를 동일한 Session Key 를 통해 암호화 및 복호화

  • 클라이언트는 전송할 데이터를 Pre Master Secret 를 통해 얻은 Session Key 를 통해 암호화하여 전송
  • 서버는 Pre Master Secret 를 통해 얻은 Session Key 를 통해 수신한 데이터를 복호화하여 처리