본문 바로가기

CS/Network

HTTP 버전별 차이점 정리 (0.9 ~ HTTP/3)

HTTP는 웹에서 클라이언트와 서버가 데이터를 주고받는 프로토콜이다. 1991년 처음 등장한 이후 꾸준히 발전해왔는데, 각 버전이 어떤 문제를 해결하기 위해 나왔는지를 흐름으로 이해하면 훨씬 쉽게 정리된다.

 


HTTP/0.9 (1991)

  • GET 메서드만 존재
  • 응답은 HTML 문서만 가능 (헤더 없음)
  • 요청 1건 처리 후 연결 즉시 종료

거의 원시적인 수준. 텍스트 한 줄 요청하고 HTML 한 줄 받는 게 전부였다.

 

HTTP/1.0 (1996)

  • 헤더(Header) 개념 도입 → 메타데이터 전송 가능
  • GET 외에 POST, HEAD 메서드 추가
  • 상태 코드(Status Code) 도입 (200, 404 등)
  • 요청마다 새 TCP 연결 생성 → 비효율적

헤더가 생기면서 쓸만해졌지만, 매번 새 TCP 연결을 만드는 게 큰 낭비였다.

 

HTTP/1.1 (1997) — 오랫동안 표준

  • Keep-Alive (지속 연결): 하나의 TCP 연결로 여러 요청 처리
  • 파이프라이닝(Pipelining): 응답 대기 없이 요청 연속 전송 (단, HOL Blocking 문제 존재)
  • 청크 전송 인코딩(Chunked Transfer): 데이터를 나눠서 전송 가능
  • Host 헤더 필수화 → 가상 호스팅 지원
  • PUT, DELETE, OPTIONS 등 메서드 추가

HOL Blocking: 앞선 요청이 막히면 뒤의 요청도 전부 대기하는 문제. 파이프라이닝의 치명적 한계였다.

지속 연결 덕분에 훨씬 효율적으로 바뀌었다. 약 20년간 웹의 기본 프로토콜로 사용됐다.

 

HTTP/2 (2015)

  • 바이너리 프레이밍(Binary Framing): 텍스트 대신 바이너리로 통신 → 파싱 효율 향상
  • 멀티플렉싱(Multiplexing): 하나의 TCP 연결에서 여러 요청/응답을 동시에 처리 → HTTP 레벨 HOL Blocking 해소
  • 헤더 압축(HPACK): 반복되는 헤더를 압축해 전송량 감소
  • 서버 푸시(Server Push): 클라이언트 요청 없이 서버가 리소스를 미리 전송
  • 스트림 우선순위 설정 가능

멀티플렉싱이 핵심. HTTP 레벨 HOL Blocking은 해결됐지만, TCP 레벨에서는 여전히 문제가 남아 있었다.

HTTP/3 (2022)

  • TCP 대신 QUIC 프로토콜 사용 (UDP 기반)
  • TCP 레벨 HOL Blocking 완전 해소: 패킷 손실이 다른 스트림에 영향 없음
  • 연결 수립 속도 향상: TLS 핸드셰이크를 QUIC과 통합 (0-RTT/1-RTT)
  • 연결 마이그레이션: Wi-Fi → LTE 전환 시에도 연결 유지

모바일 환경에서 특히 강력하다. 네트워크가 바뀌어도 연결이 끊기지 않는다는 게 체감상 크다.


한눈에 비교

항목 1.0 1.1 2 3
전송 방식 텍스트 텍스트 바이너리 바이너리
연결 방식 매번 새 연결 지속 연결 지속 연결 QUIC
멀티플렉싱
HOL Blocking 있음 TCP+HTTP TCP만 없음
헤더 압축 HPACK QPACK
기반 프로토콜 TCP TCP TCP UDP(QUIC)

 


정리하면서 느낀 점

각 버전은 이전 버전의 단점을 명확히 겨냥해서 나왔다.

1.1은 매번 TCP 연결을 새로 만드는 낭비를 없애고, 2는 HOL Blocking을, 3은 TCP 자체의 한계를 QUIC으로 대체했다.