Understanding HTTP Versions: From 0.9 to 3.0
HTTP(HyperText Transfer Protocol)
HTTP(HyperText Transfer Protocol)는 웹 상에서 클라이언트와 서버 간에 데이터를 주고받기 위한 프로토콜이다. HTTP는 여러 버전을 거쳐 발전해왔으며, 각 버전은 성능 향상과 보안, 효율성 개선 등을 목적으로 다양한 변경 사항을 포함한다.
오늘날 쓰이고 있는 HTTP 프로토콜은 버전이 여러 가지다. 따라서 여러가지의 버전을 호환 가능하도록 애플리케이션을 잘 작성해야한다. 이를 위해서는 각 HTTP의 버전에 대한 특징 및 한계를 잘 파악해두는 것이 좋다. 아래는 HTTP 각 버전에 대한 상세 설명이다.
HTTP/0.9 (1991년)
1991년의 HTTP 프로토타입은 HTTP/0.9로 알려져 있다. 이 프로토콜은 심각한 디자인 결함이 다수 있다. GET 메서드만 지원하고, 멀티미디어 콘텐츠에 대한 MIME 타입이나, HTTP 헤처, 버전 번호는 지원하지 않는다. HTTP/0.9는 원래 간단한 HTML 객체를 받아오기 위해서 만들어진 것이다. 따라서 HTTP/0.9는 금방 HTTP/1.0으로 대체되었다.
특징
- 최초의 HTTP 버전.
- 매우 단순한 구조로, GET 메서드만 지원.
- 헤더 없음, 상태 코드 없음.
- HTML 문서만 전송 가능 (텍스트만).
- 요청 예시:
GET /index.html
제한점
- 이미지, 스타일시트, 스크립트 등을 전송할 수 없음.
- 응답에 메타 정보(콘텐츠 유형 등) 없음.
- 확장성 부족.
HTTP/1.0 (1996년)
1.0은 처음으로 널리 쓰이기 시작한 HTTP 버전이다. HTTP/1.0은 버전 번호, HTTP 헤더, 추가 메서드, 멀티미디어 객체 처리를 추가했다. HTTP/1.0은 시각적으로 매력적인(?) 웹페이지와 상호작용하는 폼을 실현했고, 이는 WWW(World Wide Web)을 대세로 만들었다.
특징
- 헤더와 상태 코드 도입 (예:
200 OK
,404 Not Found
). - 다양한 HTTP 메서드 지원:
GET
,POST
,HEAD
. - 콘텐츠 유형(MIME 타입) 지정 가능 (
Content-Type
헤더). - 각 요청마다 새로운 TCP 연결을 생성.
장점
- 비텍스트 데이터(이미지, 오디오 등)도 전송 가능.
- 기본적인 웹 기능 완성.
단점
- 비효율적인 연결 방식: 요청마다 TCP 연결을 맺고 끊어야 함 → 성능 저하
HTTP/1.0+ (1.0 with extensions)
1990년대 중반, 월드 와이드 웹이 급격히 팽창하고 상업적으로도 성공하면서 등장한 1.0의 확장이다. 표준화된 공식 HTTP 버전은 아니지만, HTTP/1.0에 일부 확장 기능이 추가된 비공식적인 과도기적 형태이다. 유명 웹 클라이언트와 서버들은 이러한 발전에 따른 요구를 만족시키기 위해 발 빠르게 HTTP에 기능을 추가해갔다. 오래 지속되는 “keep-alive” 커넥션, 가상 호스팅 지원, 프록시 연결 지원을 포함해 많은 기능이 공식적이지는 않지만 사실상의 표준으로 HTTP에 추가되었다.
HTTP/1.1 (1997년, 현재도 많이 사용됨)
HTTP/1.1은 HTTP 설계의 구조적 결함 교정, 두드러진 성능 최적화, 잘못된 기능 제거에 집중했다. 뿐만 아니라 HTTP/1.1은 더 복잡해진 웹 애플리케이션과 배포를 지원한다.
특징
- Persistent Connection (keep-alive): 여러 요청을 하나의 TCP 연결로 처리.
- 파이프라이닝(Pipelining) 지원: 요청을 순차적으로 보내고 응답을 기다림.
- Host 헤더 필수: 가상 호스팅 지원.
- 캐시 제어, 압축, 청크 전송 인코딩(Chunked Transfer-Encoding) 등 기능 추가.
장점
- 성능 개선 (TCP 연결 재활용).
- 다양한 기능 확장으로 유연성 향상.
단점
- 파이프라이닝은 순차 응답 방식 → 헤드 오브 라인 블로킹(Head-of-line blocking) 문제 존재.
- 하나의 커넥션에서 병렬 처리 어려움.
HTTP/2 (2015년, RFC 7540)
HTTP 2.0은 Hypertext Transfer Protocol version 2, 즉 HTTP의 두 번째 주요 버전으로, 웹 성능 향상과 효율적인 네트워크 통신을 위해 2015년에 표준화되었다. 기존 HTTP/1.1의 한계점을 해결하고, 웹 애플리케이션의 응답 속도를 높이는 데 목적이 있다.
주요 특징
- 바이너리 프로토콜: 텍스트 기반이 아닌 바이너리로 데이터 처리 → 파싱 성능 향상.
- 멀티플렉싱(Multiplexing): 하나의 연결로 여러 요청/응답을 병렬 처리 → HOLB 문제 해결.
- 헤더 압축 (HPACK): 중복된 헤더 정보를 효율적으로 압축.
- 서버 푸시(Server Push): 서버가 클라이언트의 요청 없이도 자원 전송 가능.
장점
- 페이지 로딩 속도 개선.
- 리소스 낭비 감소.
- 보안 측면에서 대부분 TLS(HTTPS)와 함께 사용됨.
단점
- 바이너리 포맷이라 디버깅이 어려움.
- HTTP/1.1과 하위 호환되지만 서버와 클라이언트 모두 업그레이드 필요.
HTTP/3 (2022년, RFC 9114)
HTTP/3.0은 최신의 HTTP 프로토콜 버전으로, 기존 HTTP/2의 근본적인 한계를 해결하기 위해 설계되었다. 특히 TCP 대신 UDP 기반의 새로운 전송 프로토콜인 QUIC(Quick UDP Internet Connections) 을 사용한다는 점에서 매우 혁신적이다. QUIC는 Google이 개발한 전송 계층 프로토콜로, UDP 기반에서 TCP + TLS 기능을 통합한 구조이다.
주요 특징
- TCP → QUIC(UDP 기반): 연결 성립 속도 빠름, 손실 복구 개선.
- 0-RTT 연결 가능: 이전 연결을 기반으로 즉시 데이터 전송 가능.
- 멀티플렉싱 개선: 패킷 손실 시에도 다른 스트림에 영향 없음.
- 기본적으로 TLS 1.3 내장 → 보안성과 성능 동시 확보.
장점
- 모바일 환경에 강함 (네트워크 변경 시도 빠른 복구).
- 전송 지연 감소, 스트리밍과 대용량 전송에 적합.
단점
- UDP 기반이라 네트워크 장비나 방화벽에서의 호환성 이슈 존재 가능.
- 상대적으로 구현 복잡도 높음.
버전 비교
버전 | 연결 방식 | 병렬 처리 | 주요 기능 | 전송 프로토콜 |
---|---|---|---|---|
HTTP/0.9 | 비연결형 | × | 단순 GET, HTML 전송만 | TCP |
HTTP/1.0 | 비연결형 | × | 상태 코드, 헤더, MIME 타입 | TCP |
HTTP/1.1 | 지속 연결 | 제한적 | Keep-alive, 캐시, Host, 파이프라이닝 | TCP |
HTTP/2 | 지속 연결 | ○ | 멀티플렉싱, 서버 푸시, 헤더 압축 | TCP (TLS 권장) |
HTTP/3 | 지속 연결 | ◎ | QUIC, 0-RTT, 빠른 재연결 | UDP (QUIC) |
결론
HTTP/1.1은 여전히 많이 사용되며, 기능은 풍부하나 성능 한계 존재한다. 현시점에서는 호환성이 가장 강력하므로 고성능이 요구되지 않은 일반적인 애플리케이션을 구현할 때는 HTTP/1.1로도 충분하다. HTTP/2는 병렬 처리와 성능 개선이 되었으며, 특히 웹 페이지 로딩 속도에 큰 도움을 줄 수 있다. HTTP/3은 고성능이 요구되는 서비스에 적합하다. 예를 들면, 모바일·스트리밍 환경에서 탁월하다. 최신 웹에서 점차 확대 중이다.