HTTP 버전 별 차이는?

vvo_ter·2024년 7월 14일
0

daily-cs

목록 보기
2/6
post-custom-banner

HTTP는 웹 브라우저와 웹 서버 사이에 HTML 문서를 전송하기 위해 사용되는 프로토콜입니다. 웹 브라우저가 요청하면 웹 서버가 응답하며 통신이 이루어집니다.

HTTP/1.0

한 연결당 하나의 요청을 처리해서 요청을 처리하기 위해서 커넥션을 계속 생성합니다.

💥 RTT 증가

서버에 접근할 때마다 3 way handshake를 합니다.

  • RTT(Round Trip Time)란?
    syn을 보내고 syn+ack 받는 한 과정

해결 방법

  • 이미지 스플리팅: 한번에 다운 받고 위치 조정
  • 코드 압축 : 공백제거 등 용량을 줄임
  • 이미지 Base64 인코딩: 이미지 자체를 인코딩시켜 서버와의 연결을 줄임

HTTP/1.1

keep-alive 옵션으로 TCP 초기화를 한 번만 해도 커넥션을 재사용할 수 있습니다. 커넥션이 되면 순차적으로 데이터를 요청하고 응답합니다.

💥 HOL(Head Of Line) Blocking

앞서 전송된 요청이 오래 걸리면 그 다음 요청의 응답이 늦어지는 문제가 발생합니다.

HTTP/2.0

⭐️ 멀티플래싱

여러 스트림으로 데이터를 요청하고 응답해서 병렬적으로 동시에 처리 가능합니다.

  • HTTP의 HOLB 해결
  • TCP 자체의 HOLB 미해결: 패킷이 유실되거나 오류가 있을 때 재전송하는데 이 재전송한 패킷에 지연이 발생하면 HOLB 문제가 발생합니다.

헤더 압축

  • 허프만 코딩으로 HPACK 압축 형식
  • 빈도가 높은 건 적은 비트 수로 저장
  • header를 하나의 프레임으로 전송

서버 푸시

  • 클라이언트 요청 없이 서버 측에서 리소스를 보낸다
  • 예를 들어 html을 요청했을 때 html에다가 css 파일도 푸시

HTTPS

HTTP에 TLS 혹은 SSL을 사용하여 암호화된 버전입니다.

  • 제 3자가 메세지를 도청하거나 변조하지 못하도록 하여 보안성을 높였습니다
  • SEO(검색 엔진 최적화) 품질 증가에 도움이 됩니다

⭐️ 동작 방식

SSL 핸드쉐이크를 통해 대칭키를 생성합니다.

  1. Client - Client Hello
    아래의 정보를 서버에게 보낸다.
    • 브라우저가 사용하는 SSL 버전 정보
    • 브라우저가 지원하는 암호화 방식 모음(cipher suite)
    • 브라우저가 생성한 임의의 난수
  2. Server - Server Hello
    • 서버가 선택한 암호화 방식(cipher suite)
    • 서버의 공개키가 포함된 SSL 인증서(CA의 비밀키로 암호화되어 발급된다)
    • 서버가 생성한 임의의 난수
  3. Client - 서버의 SSL 인증서 확인
    • CA 공개키로 복호화하여 위조되지 않았는지 확인한다
  4. Client - Premaster Secret 생성
    클라이언트와 서버의 난수를 활용해서 Premaster Secret을 만들고 SSL 인증서에 있는 서버의 공개키로 암호화하여 이를 서버로 전송한다
  5. Server - Premaster Secret 복호화
    서버의 개인키(비밀키)를 활용하여 세션 키를 생성한다.
    여기서 세션키가 HTTPS에서 사용되는 대칭키이고 이 세션키를 통해서 브라우저와 서버 간 데이터를 암복호화하여 주고 받는다
  6. SSL Handshake 종료

HTTP/3

QUIC 기반 동작

TCP + TSL + HTTP 기능을 모두 구현한 프로토콜로 높은 성능과 신뢰성을 충족시킵니다.
UDP 위에서 빌드됩니다.

RTT 감소

TCP 연결(1-RTT)에 TLS(2-RTT)를 이용해서 통신을 하면 총 3-RTT가 발생하였습니다. QUIC으로 통신을 시작할 때는 1-RTT만 소요됩니다.
QUIC 내에 TLS 인증서를 내포하고 있기 때문에 최초 연결 과정에서 인증 정보와 데이터를 함께 전송하게 되기 때문입니다.

TCP의 HOLB 해결

스트림 자체를 독립적으로 여러개 나누어 처리하도록 하였습니다.

profile
's Coding Memory
post-custom-banner

0개의 댓글