오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-01 02:52
관리 메뉴

우노

[Network] HTTP, HTTPS 및 SSL/TLS 암호화 프로토콜 본문

Network & Security/Concept

[Network] HTTP, HTTPS 및 SSL/TLS 암호화 프로토콜

운호(Noah) 2024. 4. 8. 13:49

HTTP(Hyper Text Transfer Protocol)란?

  • HyperText 문서(ex. html)를 주고받는 프로토콜입니다.

    • ex) 클라이언트가 웹 브라우저에 URL을 입력하면, 웹 서버에 HyperText 문서를 요청하고 응답받는 과정이 진행됩니다.
  • HTTP 요청(Request) 예제

      GET /index.html HTTP/1.1
      Host: www.example.com
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    • GET : HTTP 메서드로 서버 리소스를 요청합니다.
    • /index.html : 요청하는 리소스의 경로입니다.
    • Host : 요청을 보내는 대상 서버의 도메인 이름입니다.
    • User-Agent : 요청을 보내는 클라이언트(브라우저)의 정보입니다.
    • Accept : 클라이언트가 받을 수 있는 콘텐츠 타입을 나열합니다.
  • HTTP 응답(Response) 예제

      HTTP/1.1 200 OK
      Date: Fri, 22 May 2015 06:07:21 GMT
      Content-Type: text/html
      Content-Length: 1256
    
      <!doctype html>
      <html>
      <head>
          <title>Example Domain</title>
          ... (응답 본문 생략)
      </html>
    • HTTP/1.1 200 OK : HTTP 버전과 상태 코드(200은 성공)입니다.
    • Date : 응답이 생성된 날짜와 시간입니다.
    • Content-Type : 응답 본문의 콘텐츠 타입(여기서는 HTML)입니다.
    • Content-Length : 응답 본문의 길이(바이트 단위)입니다.
    • (응답 본문) : 서버가 클라이언트에게 보내는 실제 콘텐츠입니다(예시에서는 HTML 코드).

HTTPS(Hyper Text Transfer Protocol Secure)란?

  • HTTPS는 SSL/TLS 암호화 프로토콜을 사용하여 클라이언트와 서버 간 통신 내용을 암호화하는 프로토콜입니다.
    • 일반 HTTP 통신에서는 평문 데이터를 그대로 전송하므로, 통신 내용이 제3자에게 노출될 수 있는 위험이 있습니다.
  • HTTPS에서 암호화되는 부분은 다음과 같습니다.
    • 요청 본문 (Request Body)
      • POST 또는 PUT 요청과 같이 요청 본문에 데이터가 포함된 경우, 해당 데이터는 암호화됩니다.
      • 예를 들어, 로그인 폼의 사용자 이름과 비밀번호와 같은 민감한 정보가 요청 본문에 포함될 수 있습니다.
    • 응답 본문 (Response Body)
      • 서버에서 클라이언트로 전송되는 응답의 내용은 암호화됩니다.
      • 응답 본문에는 HTML, JSON, 이미지 등의 데이터가 포함될 수 있습니다.
  • 나머지 정보들은 요청, 응답을 올바르게 처리하고 라우팅하는데 필요한 정보이기 때문에 암호화되지 않습니다.

SSL(Secure Sockets Layer) / TLS(Transport Layer Security) 암호화 프로토콜이란?

  • 위에서 언급했듯이, SSL/TLS 암호화 프로토콜은 HTTPS에서 클라이언트와 서버 간 통신 내용을 암호화할 때 사용되는 프로토콜입니다.
    • TLS는 SSL의 후속 버전이며, 현재는 TLS가 널리 사용되고 있습니다.
  • SSL/TLS 암호화 프로토콜은 다음 순서로 진행됩니다.
    • 암호화 통신 세션 연결 (SSL / TLS 핸드셰이크)
    • 암호화 통신
    • 암호화 통신 세션 연결 해제

암호화 통신 세션 연결 (SSL / TLS 핸드셰이크) 방법

  • 클라이언트에서 서버의 SSL/TLS 인증서를 확인해 신뢰 가능한 서버인지 검증하고 클라이언트와 서버간의 안전한 데이터 전송을 위해 대칭키를 공유합니다.
    • 클라이언트
      • HTTPS 통신을 시작하겠다는 요청(Client Hello)을 보냅니다.
        • 클라이언트가 지원하는 SSL/TLS 버전, 암호화 알고리즘, 압축 방식 등의 정보를 포함합니다.
    • 서버
      • 응답(Server Hello)을 보냅니다.
        • 클라이언트의 SSL/TLS 버전, 암호화 알고리즘 등을 선택합니다.
      • 서버의 SSL/TLS 인증서를 보냅니다.
        • SSL/TLS 인증서에는 서버 공개키, 서버 도메인, 인증기관 정보, 유효기간 등이 포함되어 있으며,
        • 인증기관(CA, Certificate Agent)의 개인키로 암호화(서명)되어 있습니다.
    • 클라이언트
      • 서버의 SSL/TLS 인증서 검증
        • 클라이언트는 신뢰할 수 있는 CA(인증기관)의 공개키를 사용해, 서버 인증서의 서명을 검증하고,
        • 인증서에 포함된 정보(서버 도메인, 유효기간 등)를 확인합니다.
      • 대칭키 전송
        • 인증서 검증에 성공하면 클라이언트는 데이터 암호화에 사용될 대칭키를 생성하고,
        • 서버의 공개키로, 대칭키를 암호화하여 전송합니다.
    • 서버
      • 서버의 개인키로, 암호화된 대칭키를 복호화합니다.

전체적인 HTTPS 통신 순서

  • TCP 연결 설정 (3-way Handshake)
    • 클라이언트가 서버에게 SYN 패킷을 보냅니다.
    • 서버는 SYN 패킷을 받고, 클라이언트에게 SYN+ACK 패킷을 보냅니다.
    • 클라이언트는 SYN+ACK 패킷을 받고, 서버에게 ACK 패킷을 보냅니다.
  • 암호화 통신 세션 연결 (SSL/TLS 핸드셰이크)
    • 클라이언트와 서버는 SSL/TLS 버전 및 암호화 알고리즘을 협상합니다.
    • 서버는 SSL/TLS 인증서를 클라이언트에게 전송합니다.
    • 클라이언트는 서버의 인증서를 검증하고, 안전한 데이터 전송을 위한 대칭키를 생성하여 서버의 공개키로 암호화한 후 전송합니다.
    • 서버는 개인키로 대칭키를 복호화합니다.
  • 암호화 통신
    • 클라이언트와 서버는 공유된 대칭키를 사용하여 데이터를 암호화하고 복호화하며 통신합니다.
  • 암호화 통신 세션 연결 해제
    • 클라이언트 또는 서버가 SSL/TLS 세션 종료를 알리는 "close_notify" 경고 메시지를 보냅니다.
    • 상대방은 "close_notify" 경고 메시지로 응답하여 SSL/TLS 세션 종료를 확인합니다.
    • 클라이언트와 서버는 공유된 대칭키를 폐기합니다.
  • TCP 연결 해제 (4-way handshake)
    • 클라이언트 또는 서버가 상대방에게 FIN 패킷을 보냅니다.
    • 상대방은 FIN 패킷을 받고, ACK 패킷을 보냅니다.
    • 상대방도 FIN 패킷을 보냅니다.
    • 클라이언트 또는 서버가 FIN 패킷을 받고, ACK 패킷을 보냅니다.

참고

Comments