Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

HTTP/1.1 (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.12 06:25

HTTP/1.1

공식 명칭

Hypertext Transfer Protocol -- HTTP/1.1

발표 연도

1997년 (RFC 2068), 1999년 (RFC 2616)

상태

현재는 HTTP/2와 HTTP/3로 대체되는 추세

기반 기술

TCP/IP

주요 특징

텍스트 기반 프로토콜, Connection 지속, Chunked Transfer Encoding

표준 문서

RFC 7230, RFC 7231, RFC 7232, RFC 7233, RFC 7234, RFC 7235 (2014년 개정)

기술 상세

개발 배경

HTTP/1.0의 단점(연결 비효율성 등)을 보완하기 위해 개발

핵심 개선사항

지속 연결(Persistent Connection), 파이프라이닝(HTTP pipelining), 호스트 헤더, 청크 전송 인코딩

요청 메서드

GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, CONNECT 등

상태 코드 클래스

1xx(정보), 2xx(성공), 3xx(리다이렉션), 4xx(클라이언트 오류), 5xx(서버 오류)

헤더(Header)

요청/응답 메타데이터를 정의 (예: Content-Type, Cache-Control, User-Agent)

단점

Head-of-line blocking 문제, 텍스트 기반의 오버헤드, 복잡한 헤더 구조

파이프라이닝

여러 요청을 응답 대기 없이 연속 전송 (실제 구현 및 활용도는 제한적)

캐싱 메커니즘

캐시 제어 헤더(예: Expires, Cache-Control, ETag)를 통한 효율성 향상

보안

자체 보안 기능 없음, HTTPS는 HTTP/1.1에 TLS/SSL을 적용

후속 버전

HTTP/2 (바이너리, 멀티플렉싱), HTTP/3 (QUIC 프로토콜 기반)

주요 RFC 문서

RFC 7230-7235 (2014, HTTP/1.1 명세 개정판), 이전 RFC 2616 (1999)은 폐기

1. 개요

HTTP/1.1은 월드 와이드 웹에서 데이터 통신을 위한 핵심 애플리케이션 계층 프로토콜이다. 이는 HTTP/1.0의 단점을 보완하고, 인터넷의 급속한 성장에 대응하기 위해 1997년에 표준으로 제정되었다. 주요 목표는 연결 효율성을 높이고, 대역폭 사용을 최적화하며, 가상 호스팅과 같은 새로운 웹 기능을 지원하는 것이었다.

이 프로토콜은 클라이언트(예: 웹 브라우저)와 서버 간에 텍스트 기반의 요청과 응답을 교환하는 방식으로 동작한다. 클라이언트는 URL로 식별되는 자원을 요청하면, 서버는 해당 자원과 함께 성공 또는 오류를 나타내는 상태 코드를 응답한다. HTTP/1.1은 TCP/IP 위에서 동작하며, 기본 포트는 80번이다.

항목

설명

표준 문서

RFC 2068 (1997), RFC 2616 (1999)

주요 개선사항

지속 연결, 파이프라이닝, 호스트 헤더

기본 포트

80

전송 계층

TCP

HTTP/1.1은 20년 이상 인터넷의 근간을 이루는 프로토콜로 자리 잡았으며, 이후 HTTP/2와 HTTP/3의 기반이 되었다. 텍스트 기반의 단순한 설계 덕분에 디버깅이 용이하지만, 현대의 복잡한 웹 페이지를 효율적으로 처리하는 데는 한계를 보이기도 한다.

2. 역사와 배경

HTTP/1.0은 초기 웹의 성장에 기여했지만, 여러 실용적인 제약을 가지고 있었다. 각 요청마다 새로운 TCP 연결을 열고 닫아야 했기 때문에 지연 시간과 서버 부하가 컸다. 또한, 가상 호스팅을 공식적으로 지원하지 않아 하나의 IP 주소로 여러 도메인을 운영하는 데 어려움이 있었다. 이러한 한계를 극복하고 웹의 보다 효율적이고 확장 가능한 기반을 마련하기 위해 HTTP/1.1 표준화 작업이 시작되었다.

HTTP/1.1은 1997년 1월 RFC 2068로 처음 공개되었다. 이후 피드백과 개선을 거쳐 1999년 6월 RFC 2616이 발표되며 공식 표준으로 자리 잡았다. 이 표준은 월드 와이드 웹 컨소시엄(W3C)과 인터넷 엔지니어링 태스크 포스(IETF)의 협력 하에 개발되었다. 주요 목표는 연결 효율성 향상, 캐싱 메커니즘 강화, 필수 호스트 헤더 도입을 통한 가상 호스팅 지원, 그리고 새로운 데이터 전송 방식 추가 등이었다.

표준화 과정에서 몇 가지 핵심 기능이 도입되거나 명확해졌다. 가장 중요한 변화는 기본 연결 모델이었다. HTTP/1.0에서는 연결 지속이 선택 사항이었으나, HTTP/1.1에서는 이를 표준 동작으로 삼아 지속 연결을 기본 가정으로 했다. 또한, 이론적으로는 여러 요청을 연속적으로 보내 응답을 기다리지 않는 파이프라이닝 개념도 명시적으로 정의했다. 이러한 변화들은 웹 페이지가 점점 더 많은 리소스(이미지, 스타일시트, 스크립트)를 포함하게 되면서 발생한 성능 문제를 해결하려는 시도의 결과물이었다.

2.1. HTTP/1.0에서의 발전

HTTP/1.0은 각 요청-응답 사이클마다 새로운 TCP 연결을 열고 닫는 비지속 연결 방식을 사용했다. 이 방식은 매번 3-way 핸드셰이크와 TCP 느린 시작을 반복해야 하므로, 웹 페이지에 여러 리소스(이미지, 스타일시트, 스크립트 등)가 포함된 경우 심각한 지연과 네트워크 오버헤드를 초래했다.

HTTP/1.1의 가장 중요한 발전은 지속 연결의 도입이다. 기본적으로 단일 TCP 연결을 통해 여러 개의 요청과 응답을 순차적으로 교환할 수 있게 되어, 연결 설정 및 해제에 따른 반복적인 오버헤드를 크게 줄였다. 이는 특히 여러 작은 리소스를 로드하는 현대적인 웹 페이지의 성능을 획기적으로 향상시켰다.

또한, 호스트 헤더가 필수화되어 가상 호스팅이 가능해졌다. HTTP/1.0에서는 하나의 IP 주소가 하나의 도메인에만 매핑되었지만, HTTP/1.1에서는 요청 헤더에 호스트명을 명시함으로써 동일한 서버와 IP 주소에서 여러 웹사이트를 호스팅할 수 있게 되었다. 이는 인터넷 인프라의 효율성을 극대화하는 핵심 변화였다.

다음 표는 HTTP/1.0과 HTTP/1.1의 주요 차이점을 요약한다.

특징

HTTP/1.0

HTTP/1.1

연결 방식

기본 비지속 연결

기본 지속 연결

호스트 헤더

선택 사항

필수 사항

캐싱 메커니즘

제한적 (Pragma 등)

강화됨 (Cache-Control, ETag 등)

상태 코드

상대적으로 적음

확장됨

전송 방식

주로 전체 콘텐츠

청크 전송 인코딩 지원

이 외에도 청크 전송 인코딩을 통한 스트리밍 응답 지원, 보다 풍부한 캐시 제어 헤더, 그리고 새로운 HTTP 메서드와 상태 코드의 추가 등이 HTTP/1.1의 핵심 발전 사항이다.

2.2. 표준화 과정 (RFC 2068, RFC 2616)

HTTP/1.0의 제한을 극복하고 웹의 폭발적 성장을 지원하기 위한 공식 표준으로, HTTP/1.1은 IETF의 HTTP 워킹 그룹에 의해 표준화되었다. 첫 번째 표준안은 1997년 1월에 RFC 2068로 공개되었다. 이 초안은 지속 연결, 호스트 헤더, 청크 전송 인코딩과 같은 핵심 기능을 정의했으나, 일부 모호한 점과 구현상의 문제가 지적되었다.

이를 수정하고 보완한 최종 표준안은 1999년 6월에 RFC 2616으로 공개되었다. 이 문서는 "Hypertext Transfer Protocol -- HTTP/1.1"이라는 제목으로, 1990년대 후반 웹의 폭넓은 사용 사례를 반영한 명세가 되었다. RFC 2616은 다음 표와 같이 주요 개정 사항을 포함했다.

개정 분야

주요 내용

캐시 제어

Cache-Control 헤더를 도입하여 보다 세밀한 캐시 정책을 가능하게 했다.

범위 요청

Range와 Accept-Ranges 헤더를 명시하여 대용량 파일의 부분적 다운로드를 지원했다.

콘텐츠 협상

서버가 클라이언트의 언어, 인코딩, 문자집합 선호도에 따라 적절한 응답을 선택할 수 있는 메커니즘을 강화했다.

연결 관리

지속 연결의 동작과 타임아웃에 대한 보다 명확한 규칙을 제시했다.

RFC 2616은 이후 약 15년 동안 HTTP/1.1의 공식 표준 문서 역할을 했다. 그러나 시간이 지나면서 명세의 복잡성과 일부 모호한 표현이 문제로 지적되었다. 이에 따라 IETF는 2014년 6월에 단일 문서였던 RFC 2616을 여섯 개의 더 명확하고 집중된 문서로 분할하여 개정했다[1]. 이 개정판들은 기술적 내용을 크게 변경하지 않으면서 명세의 가독성과 구현 정확성을 높이는 데 목적을 두었다.

3. 핵심 특징과 개선사항

HTTP/1.0의 한계를 극복하고 웹의 효율성을 크게 향상시킨 HTTP/1.1은 몇 가지 핵심적인 특징과 개선사항을 도입했다. 이는 네트워크 자원 사용을 최적화하고, 하나의 웹 서버가 여러 도메인을 호스팅할 수 있게 하며, 동적 콘텐츠 전송을 유연하게 만드는 기반이 되었다.

가장 중요한 개선점은 지속 연결이다. HTTP/1.0에서는 기본적으로 각 요청-응답 쌍마다 새로운 TCP 연결을 열고 닫았는데, 이는 연결 설정과 해제에 따른 지연과 오버헤드를 유발했다. HTTP/1.1에서는 기본적으로 하나의 TCP 연결을 통해 여러 개의 요청과 응답을 순차적으로 교환할 수 있게 되어, 이러한 오버헤드를 줄이고 전반적인 성능을 향상시켰다. 이와 관련된 또 다른 기능이 파이프라이닝이다. 이는 클라이언트가 첫 번째 요청에 대한 응답을 기다리지 않고, 동일한 연결을 통해 여러 요청을 연속적으로 보낼 수 있게 하는 기술이었다. 그러나 응답은 반드시 요청이 보내진 순서대로 반환되어야 했으며, 이로 인해 HOL 블로킹 문제가 발생할 수 있었다.

또한, 호스트 헤더의 필수화는 웹 호스팅 환경을 혁신했다. HTTP/1.0에서는 하나의 IP 주소가 하나의 도메인에만 대응되었다. 그러나 HTTP/1.1에서는 모든 요청에 Host 헤더를 포함시켜야 했고, 이를 통해 서버는 하나의 IP 주소와 포트 조합으로 여러 개의 서로 다른 도메인(예: www.example.com과 www.anotherexample.com)을 구분하여 서비스할 수 있게 되었다. 이 기술을 가상 호스팅이라고 한다. 한편, 청크 전송 인코딩은 서버가 응답 콘텐츠의 전체 크기를 미리 알지 못하는 경우에도 데이터 전송을 시작할 수 있게 해주었다. 서버는 콘텐츠를 일련의 "청크"로 나누어 보내고, 마지막에 크기가 0인 청크를 보내 전송이 완료되었음을 알린다. 이는 동적으로 생성되는 페이지나 대용량의 스트리밍 데이터를 전송할 때 유용하다.

특징

설명

주요 이점

지속 연결

단일 TCP 연결을 통해 여러 요청/응답 교환

연결 설정/해제 오버헤드 감소, 지연 시간 단축

파이프라이닝

응답 대기 없이 여러 요청을 연속 전송

네트워크 대기 시간 활용도 향상 (실제 구현/효과는 제한적)

호스트 헤더

요청 헤더에 목적지 도메인 명시

하나의 서버로 여러 웹사이트 호스팅 가능 (가상 호스팅)

청크 전송 인코딩

데이터를 덩어리로 나누어 순차 전송

전체 크기를 모르는 동적 콘텐츠의 스트리밍 전송 가능

3.1. 지속 연결 (Persistent Connection)

HTTP/1.0에서는 각 HTTP 요청마다 새로운 TCP 연결을 열고, 응답을 받은 후 즉시 연결을 닫는 방식이 기본이었다. 이 방식은 단순하지만, 하나의 웹 페이지를 구성하는 HTML, CSS, 자바스크립트, 이미지 파일 등 여러 리소스를 각각 별도의 연결로 가져와야 하므로 매번 TCP 3방향 핸드셰이크와 느린 시작(Slow Start) 과정을 반복해야 했다. 이는 네트워크 지연과 서버 부하를 크게 증가시키는 원인이 되었다.

HTTP/1.1에서 도입된 지속 연결은 이러한 비효율성을 해결하기 위한 핵심 기능이다. 지속 연결은 하나의 TCP 연결을 열어 두고, 여러 개의 요청과 응답을 연속적으로 주고받을 수 있도록 한다. 기본적으로 연결은 일정 시간 동안 유지되며, Connection: keep-alive 헤더를 명시적으로 사용하여 관리할 수도 있다. 이를 통해 연결 설정과 해제에 드는 오버헤드를 줄이고, 네트워크 대역폭을 더 효율적으로 사용할 수 있게 되었다.

지속 연결의 동작은 클라이언트와 서버의 협력에 의해 이루어진다. 클라이언트가 지속 연결을 지원하고자 할 경우 요청에 Connection: keep-alive 헤더를 포함시킬 수 있다. 서버도 이를 지원하면 응답에 동일한 헤더를 포함시켜 연결을 유지하겠다는 의사를 표시한다. 연결이 유지되는 시간은 서버 설정에 따라 다르며, 일정 시간 동안 새로운 요청이 없으면 서버 측에서 연결을 닫게 된다. 이 기능은 HTTP/1.1의 기본 동작이므로, 명시적으로 연결을 종료하려면 Connection: close 헤더를 사용해야 한다.

지속 연결의 도입은 웹 성능에 지대한 영향을 미쳤다. 특히 여러 개의 작은 리소스(예: 아이콘, 스크립트 조각)를 많이 요청하는 현대적인 웹 페이지의 로딩 시간을 획기적으로 단축시켰다. 그러나 지속 연결은 연결을 장시간 유지한다는 특성상 서버의 동시 연결 수 제한과 결합될 경우 새로운 형태의 병목 현상을 만들기도 했다. 또한, 잘못 구현된 클라이언트나 서버로 인해 연결이 제때 닫히지 않아 리소스가 낭비되는 문제도 발생할 수 있었다.

3.2. 파이프라이닝 (Pipelining)

파이프라이닝은 HTTP/1.1에서 도입된 성능 최적화 기법이다. 이 기술은 클라이언트가 첫 번째 요청에 대한 응답을 기다리지 않고, 동일한 TCP 연결 상에서 여러 개의 HTTP 요청을 연속적으로 보낼 수 있게 한다. 이론적으로는 지속 연결만 사용하는 경우보다 네트워크 지연 시간을 더욱 줄이고 처리량을 향상시킬 수 있다.

작동 방식은 다음과 같다. 클라이언트는 서버에 첫 번째 요청을 보낸 후, 해당 요청에 대한 응답이 도착하기 전에 두 번째, 세 번째 요청을 바로 이어서 보낸다. 서버는 요청을 받은 순서대로 처리하여 응답을 생성하며, 이 응답들도 요청이 들어온 순서와 동일하게 클라이언트에게 반환해야 한다. 이는 FIFO 큐와 유사한 방식으로 관리된다.

그러나 파이프라이닝에는 심각한 실용적 한계가 존재한다. 가장 큰 문제는 HOL 블로킹이다. 파이프라인에서 먼저 보낸 요청의 처리가 지연되면, 그 뒤에 있는 모든 요청의 응답도 차단되는 현상이 발생한다. 또한, 프록시 서버나 오래된 서버 중에서 파이프라이닝을 제대로 지원하지 않는 경우가 많아 호환성 문제를 일으켰다.

이러한 복잡성과 구현상의 문제들로 인해, 대부분의 현대 웹 브라우저에서는 기본적으로 파이프라이닝 기능이 비활성화되어 있다. 결국 파이프라이닝은 이론상의 이점에도 불구하고 널리 채택되지 못했으며, 이러한 한계를 근본적으로 해결하기 위해 설계된 HTTP/2의 멀티플렉싱이 그 대안으로 자리 잡게 되었다.

3.3. 호스트 헤더 (Host Header)와 가상 호스팅

HTTP/1.0에서는 하나의 IP 주소가 하나의 도메인에만 매핑된다는 가정 하에 동작했다. 그러나 웹 호스팅 서비스의 발전으로, 단일 서버(하나의 IP 주소)에서 여러 개의 독립적인 웹사이트(예: site1.example.com, site2.example.com)를 운영하는 가상 호스팅이 보편화되었다. 이 경우, 클라이언트가 요청을 보낼 때 서버는 요청이 어느 도메인을 위한 것인지 구분할 방법이 없었다.

이 문제를 해결하기 위해 HTTP/1.1에서는 반드시 포함되어야 하는 필수 헤더인 Host 헤더를 도입했다. 클라이언트는 HTTP 요청을 보낼 때 Host: site1.example.com과 같이 목적지 도메인 이름을 헤더에 명시해야 한다. 서버는 이 헤더 값을 확인하여 동일한 IP 주소와 포트 번호로 들어오는 요청이라도, 각각 다른 웹사이트의 콘텐츠를 정확히 제공할 수 있게 된다.

Host 헤더의 도입은 웹 인프라의 효율성을 크게 높였다. 서버 자원을 더 효율적으로 공유할 수 있게 되었고, 이는 공유 호스팅 비즈니스 모델의 기반이 되었다. 또한, 이 헤더는 TLS/SSL 인증서를 통한 HTTPS 연결에서도 중요한 역할을 한다. 서버는 클라이언트가 초기 핸드셰이크 단계에서 보내는 SNI 정보와 Host 헤더를 통해, 하나의 IP 주소에서 여러 개의 서로 다른 보안 인증서를 사용하는 것이 가능해졌다.

헤더 예시

설명

Host: www.example.com

www.example.com 도메인에 대한 요청임을 나타낸다.

Host: api.example.com:8080

호스트명과 함께 특정 포트(8080)를 지정할 수도 있다.

Host 헤더는 HTTP/1.1 요청에서 유일하게 필수적인 헤더 필드이며, 이를 생략하면 서버는 대개 400 Bad Request 상태 코드로 응답한다. 이 메커니즘은 현대 웹의 기본 구조를 이루는 핵심 요소 중 하나이다.

3.4. 청크 전송 인코딩 (Chunked Transfer Encoding)

청크 전송 인코딩(Chunked Transfer Encoding)은 HTTP/1.1에서 도입된 데이터 전송 방식이다. 이 방식은 서버가 응답 본문의 전체 크기를 미리 알지 못하는 상황에서도 데이터를 스트리밍 방식으로 클라이언트에 점진적으로 전송할 수 있게 해준다. 이는 동적으로 생성되는 콘텐츠나 큰 파일을 전송할 때 특히 유용하다.

전송 과정은 각각의 "청크" 단위로 이루어진다. 각 청크는 자신의 크기(16진수 바이트 수)와 실제 데이터, 그리고 줄바꿈으로 구성된다. 마지막으로 크기가 0인 청크가 전송되어 응답의 종료를 알린다. 이 방식을 사용할 때는 응답 헤더에 Transfer-Encoding: chunked 필드가 포함되고, Content-Length 헤더는 생략된다.

청크 예시 (텍스트)

설명

`7\r

`

첫 번째 청크의 크기는 7바이트임을 나타냄

`Mozilla\r

`

실제 전송되는 7바이트 데이터

`9\r

`

두 번째 청크의 크기는 9바이트

`Developer\r

`

실제 전송되는 9바이트 데이터

`0\r

`

크기가 0인 청크로 본문 전송 종료 신호

`\r

`

본문 종료 후 트레일러 헤더[2]가 없음을 의미

이 방식의 주요 장점은 서버가 전체 응답을 생성하고 메모리에 버퍼링할 필요 없이 데이터를 생성하는 즉시 전송을 시작할 수 있다는 점이다. 이를 통해 대기 시간을 줄이고 서버의 메모리 사용량을 최적화할 수 있다. 또한, 전송 중간에 연결이 끊어져도 이미 수신된 청크까지의 데이터는 유효하게 처리될 수 있다.

4. 메시지 형식

HTTP/1.1 메시지는 클라이언트가 서버로 보내는 요청 메시지와 서버가 클라이언트로 보내는 응답 메시지로 구분된다. 두 메시지 모두 시작 줄, 헤더 필드, 빈 줄, 선택적인 메시지 본문으로 구성된다. 시작 줄은 요청의 경우 메서드, 요청 URI, HTTP 버전을 포함하고, 응답의 경우 HTTP 버전, 상태 코드, 상태 문구를 포함한다.

헤더 필드는 콜론(:)으로 구분된 이름-값 쌍의 집합이며, 요청과 응답에 대한 부가 정보를 제공한다. 주요 헤더 필드의 종류와 역할은 다음과 같다.

헤더 종류

주요 예시

역할

일반 헤더 (General Header)

Date, Connection, Cache-Control

요청과 응답 모두에 사용 가능한 메시지 전체에 대한 정보를 제공한다.

요청 헤더 (Request Header)

Host, User-Agent, Accept, Authorization

클라이언트가 서버에 보내는 요청의 성격, 클라이언트 정보, 선호하는 응답 형식 등을 서버에 알린다.

응답 헤더 (Response Header)

Server, Location, WWW-Authenticate

서버에 대한 정보와 클라이언트의 추가 동작을 유도하는 정보(예: 리디렉션 위치)를 제공한다.

엔터티 헤더 (Entity Header)

Content-Type, Content-Length, Last-Modified

메시지 본문(엔터티 본문)에 대한 설명으로, 미디어 타입, 길이, 최종 수정 시간 등을 나타낸다.

헤더 필드 이후에는 빈 줄(CRLF)이 오며, 그 뒤에 메시지 본문이 위치한다. 본문은 GET 요청처럼 반드시 필요하지 않은 경우도 있다. 본문이 존재할 때는 Content-Length나 청크 전송 인코딩 헤더를 통해 본문의 길이 또는 전송 방식을 명시한다. 이 구조화된 형식은 HTTP 통신의 기본 골격을 이루며, 확장 가능한 헤더 필드를 통해 다양한 기능을 지원하는 근간이 된다.

4.1. 요청 메시지 구조

HTTP 요청 메시지는 클라이언트가 서버에게 자원에 대한 동작을 지시하기 위해 보내는 메시지이다. 기본 구조는 시작 줄, 헤더, 빈 줄, 메시지 본문으로 구성된다. 시작 줄은 다시 HTTP 메서드, 요청 대상(URI), 사용 중인 HTTP 버전으로 이루어져 있으며, 각 요소는 공백으로 구분된다. 예를 들어, GET /index.html HTTP/1.1은 서버의 /index.html 자원을 가져오라는 요청이다.

헤더는 요청에 대한 부가 정보를 필드-이름: 값 형식의 줄로 제공한다. 필수 헤더는 Host 헤더로, HTTP/1.1의 가상 호스팅을 지원하기 위해 도입되어 하나의 서버 IP 주소가 여러 도메인을 서비스할 수 있게 한다. 그 외에도 클라이언트 정보(User-Agent), 선호하는 응답 형식(Accept), 쿠키(Cookie) 등 다양한 헤더가 사용된다. 헤더의 끝은 빈 줄(CRLF)로 표시한다.

메시지 본문은 선택 사항이며, POST나 PUT 메서드처럼 서버로 데이터를 전송할 때 사용된다. 본문이 있을 경우, Content-Type과 Content-Length 헤더를 통해 데이터의 형식과 크기를 명시하는 것이 일반적이다. 본문이 없는 GET이나 DELETE 요청에서는 빈 줄 이후에 아무 내용도 오지 않는다.

다음은 로그인을 시도하는 POST 요청 메시지의 예시이다.

구성 요소

예시 값

설명

시작 줄

POST /login HTTP/1.1

/login 경로로 HTTP/1.1 버전의 POST 요청

헤더

Host: www.example.com

요청 대상 서버

헤더

Content-Type: application/x-www-form-urlencoded

본문 데이터 형식

헤더

Content-Length: 29

본문 데이터의 바이트 길이

빈 줄

(CRLF)

헤더의 종료를 알림

메시지 본문

username=user&password=pass123

전송할 실제 데이터

4.2. 응답 메시지 구조

응답 메시지는 클라이언트가 보낸 HTTP 요청에 대한 서버의 처리 결과를 담은 구조이다. 기본적으로 상태 라인, 헤더, 빈 줄, 메시지 본문(엔티티 본문)의 순서로 구성된다. 상태 라인은 응답의 첫 번째 줄로, 사용 중인 HTTP 버전, 상태 코드, 그리고 해당 상태 코드를 설명하는 짧은 문구인 상태 텍스트로 이루어진다. 예를 들어 HTTP/1.1 200 OK는 요청이 성공했음을 의미한다.

헤더 부분은 응답에 대한 부가 정보를 키-값 쌍 형태로 제공한다. 중요한 헤더로는 콘텐츠의 유형을 나타내는 Content-Type(예: text/html; charset=UTF-8), 본문의 길이를 바이트 단위로 알려주는 Content-Length, 그리고 캐시 제어와 관련된 Cache-Control 등이 있다. 상태 라인과 모든 헤더는 캐리지 리턴과 라인 피드(CRLF)로 끝나야 한다.

헤더 이후에는 반드시 빈 줄(CRLF만 있는 줄)이 와야 하며, 이는 헤더의 끝과 메시지 본문의 시작을 구분하는 역할을 한다. 메시지 본문은 요청된 리소스의 실제 데이터를 포함한다. 예를 들어 HTML 문서, 이미지 파일, 또는 JSON 데이터 등이 여기에 해당한다. 본문의 존재 여부와 길이는 상태 코드와 요청 메서드에 따라 달라질 수 있다. 204 No Content와 같은 응답에는 본문이 존재하지 않는다.

구성 요소

설명

예시

상태 라인

프로토콜 버전, 상태 코드, 상태 텍스트

HTTP/1.1 404 Not Found

응답 헤더

응답에 대한 메타데이터

Content-Type: application/json

빈 줄

헤더의 종료를 표시

(CRLF만으로 구성된 줄)

메시지 본문

실제 전송되는 데이터(옵션)

{"error": "Resource not found"}

본문의 전송 방식은 Transfer-Encoding 헤더에 따라 달라질 수 있다. chunked 인코딩이 지정된 경우, 본문은 여러 개의 덩어리로 나누어져 전송된다[3]]이라고 한다]. 이는 동적으로 생성되는 콘텐츠를 스트리밍하거나 전체 콘텐츠 길이를 미리 알 수 없을 때 유용하다.

4.3. 헤더 필드의 종류와 역할

HTTP 헤더 필드는 클라이언트와 서버 간에 교환되는 메타데이터를 전달하는 데 사용된다. 각 헤더 필드는 이름과 값으로 구성되며, 콜론(:)으로 구분된다. 헤더 필드는 요청과 응답 모두에 존재하며, 메시지의 본문(body)이 시작되기 전에 한 줄씩 나열된다.

헤더 필드는 그 목적과 사용처에 따라 크게 네 가지 범주로 나눌 수 있다.

* 일반 헤더(General Header): 요청과 응답 메시지 모두에서 사용될 수 있는 헤더이다. 메시지 전체에 적용되는 정보를 담는다. 대표적으로 메시지의 날짜와 시간을 나타내는 Date, 연결 관리를 위한 Connection 등이 있다.

* 요청 헤더(Request Header): 클라이언트가 서버에게 보내는 요청 메시지에서만 사용되는 헤더이다. 클라이언트의 정보, 선호하는 응답 형식, 조건부 요청 등을 서버에 알린다. 예를 들어 User-Agent는 클라이언트 소프트웨어(브라우저) 정보를, Accept는 클라이언트가 처리할 수 있는 콘텐츠 유형을 나타낸다.

* 응답 헤더(Response Header): 서버가 클라이언트에게 보내는 응답 메시지에서만 사용되는 헤더이다. 서버에 대한 정보와 요청된 리소스에 대한 추가 정보를 제공한다. Server 헤더는 서버 소프트웨어 정보를, Location은 리다이렉션할 URL을 나타낸다.

* 엔터티 헤더(Entity Header): 메시지 본문(엔터티)에 대한 메타데이터를 설명하는 헤더이다. 본문의 콘텐츠 유형, 길이, 마지막 수정 시간 등을 기술한다. Content-Type은 본문의 미디어 타입(예: text/html), Content-Length는 본문의 크기를 바이트 단위로 표시한다.

몇 가지 주요 헤더 필드의 역할을 구체적으로 살펴보면 다음과 같다.

헤더 필드 이름

범주

주요 역할

Host

요청 헤더

요청이 전송되는 서버의 호스트명과 포트 번호를 지정한다. 가상 호스팅을 가능하게 하는 필수 헤더이다.

Content-Type

엔터티 헤더

메시지 본문의 미디어 타입(MIME type)을 정의한다. (예: text/html; charset=UTF-8)

Cache-Control

일반 헤더

캐싱 정책을 지시한다. 캐시 가능 여부, 최대 유효 기간, 재검증 필요성 등을 제어한다.

Set-Cookie

응답 헤더

서버가 클라이언트에게 쿠키를 설정할 때 사용한다.

Authorization

요청 헤더

클라이언트를 서버에 인증하기 위한 자격 증명(예: 베어러 토큰)을 포함한다.

이러한 헤더 필드들을 조합하여 클라이언트와 서버는 통신의 세부 사항을 정교하게 제어할 수 있다. 예를 들어 If-Modified-Since 같은 조건부 요청 헤더를 사용하면 리소스가 변경되었을 때만 데이터를 전송받을 수 있어 대역폭을 절약한다.

5. 상태 코드와 메서드

HTTP 메서드는 클라이언트가 서버에 요청하는 동작의 종류를 정의한다. 주요 메서드로는 자원의 조회를 요청하는 GET, 서버에 데이터를 제출하는 POST, 특정 자원을 완전히 대체하거나 생성하는 PUT, 자원을 삭제하는 DELETE가 있다. 이 외에도 자원의 메타데이터를 조회하는 HEAD, 대상 자원에 대한 통신 옵션을 설명하는 OPTIONS, 자원의 부분적인 수정을 지시하는 PATCH 메서드 등이 정의되어 있다[4].

HTTP 상태 코드는 세 자리 숫자로 구성되며, 요청의 처리 결과를 나타낸다. 코드는 첫 번째 숫자에 따라 다섯 개의 클래스로 분류된다.

코드 범위

클래스

설명

1xx

정보 응답

요청을 받았으며, 프로세스를 계속한다.

2xx

성공

요청이 성공적으로 수신, 이해, 수용되었다.

3xx

리다이렉션

요청을 완료하기 위해 추가 조치가 필요하다.

4xx

클라이언트 오류

요청에 문법 오류가 있거나 처리할 수 없다.

5xx

서버 오류

서버가 명백히 유효한 요청을 수행하지 못했다.

대표적인 상태 코드로는 성공을 의미하는 200 OK, 새 리소스가 생성되었음을 알리는 201 Created, 클라이언트가 요청한 자원을 찾을 수 없을 때의 404 Not Found, 서버 내부 오류를 나타내는 500 Internal Server Error 등이 있다. 301 Moved Permanently나 302 Found와 같은 3xx 코드는 클라이언트를 새로운 URL로 리다이렉트하도록 지시한다.

상태 코드는 항상 응답 메시지의 시작 줄에 위치하며, 뒤이어 오는 헤더와 본문을 통해 추가적인 상황 설명을 제공할 수 있다. 이 체계는 클라이언트와 서버 간의 통신 상태를 명확하고 효율적으로 전달하는 데 핵심적인 역할을 한다.

5.1. 주요 HTTP 메서드 (GET, POST, PUT, DELETE 등)

HTTP 메서드는 클라이언트가 서버에 요청하는 동작의 종류를 지정하는 명령어이다. HTTP/1.1은 여러 메서드를 정의하며, 그 중 일부는 안전하거나 멱등성을 가진다. 안전 메서드는 서버의 상태를 변경하지 않는 읽기 전용 작업이며, 멱등 메서드는 동일한 요청을 여러 번 반복해도 한 번 실행한 효과와 동일한 결과를 보장한다.

가장 일반적으로 사용되는 메서드는 다음과 같다.

메서드

설명

안전성

멱등성

GET

지정된 리소스의 표현을 요청한다. 주로 데이터를 조회할 때 사용된다.

안전함

멱등함

POST

서버에 데이터를 제출한다. 주로 새 리소스를 생성하거나 데이터를 처리할 때 사용되며, 요청 본문에 데이터를 담는다.

안전하지 않음

멱등하지 않음

PUT

요청 페이로드를 사용하여 지정된 리소스를 전체 교체한다. 리소스가 없으면 생성할 수 있다.

안전하지 않음

멱등함

DELETE

지정된 리소스를 삭제한다.

안전하지 않음

멱등함

이 외에도 HTTP/1.1은 다른 메서드들을 정의한다. HEAD 메서드는 GET 요청과 동일한 응답을 요구하지만, 응답 본문을 반환하지 않고 헤더만 반환한다. 이는 리소스의 존재 유무나 메타데이터를 확인하는 데 유용하다. OPTIONS 메서드는 대상 리소스에 대해 지원되는 통신 옵션을 설명한다. PATCH 메서드는 리소스의 부분적인 수정을 위해 사용되지만, 원래 RFC 2616에는 포함되지 않았고 이후 별도 RFC로 표준화되었다[5]. TRACE 메서드는 요청의 루프백 테스트를 수행하며, CONNECT 메서드는 프록시 서버에 터널 연결을 설정하는 데 사용된다.

5.2. 상태 코드 분류 (1xx~5xx)

상태 코드는 세 자리 숫자로 구성되며, 응답의 첫 번째 줄에 위치합니다. 코드의 첫 번째 숫자는 응답의 클래스를 정의하며, 나머지 두 숫자는 구체적인 상황을 나타냅니다. 이 체계는 HTTP 클라이언트가 서버 응답의 성공, 실패, 추가 조치 필요 여부 등을 빠르게 이해할 수 있도록 합니다.

코드 범위

클래스

정의

설명

1xx

정보 응답 (Informational)

요청을 받았으며, 프로세스를 계속 진행함

임시 응답으로, 클라이언트는 요청을 계속하거나 서버의 응답을 기다려야 함

2xx

성공 (Success)

요청이 성공적으로 수신, 이해, 수용됨

클라이언트의 요청이 정상적으로 처리되었음

3xx

리다이렉션 (Redirection)

요청을 완료하기 위해 추가 조치가 필요함

클라이언트가 요청을 완료하려면 다른 위치(URI)로 재시도해야 함

4xx

클라이언트 오류 (Client Error)

요청에 문법 오류가 있거나 처리할 수 없음

클라이언트의 요청에 오류가 있어 서버가 요청을 이행할 수 없음

5xx

서버 오류 (Server Error)

서버가 유효한 요청을 수행하지 못함

서버 측에서 오류가 발생하여 요청을 처리할 수 없음

각 클래스의 대표적인 상태 코드는 다음과 같습니다. 2xx 성공 클래스에서는 200 OK가 가장 일반적이며, 요청이 성공했음을 나타냅니다. 3xx 리다이렉션 클래스에서는 301 Moved Permanently (영구 이동)와 302 Found (임시 이동)가 자주 사용됩니다. 4xx 클라이언트 오류에서는 404 Not Found (리소스를 찾을 수 없음)와 400 Bad Request (잘못된 요청)가 흔합니다. 5xx 서버 오류에서는 500 Internal Server Error (내부 서버 오류)와 503 Service Unavailable (서비스를 사용할 수 없음)이 대표적입니다.

1xx 정보 응답은 상대적으로 덜 사용되지만, 100 Continue는 클라이언트가 요청 본문을 계속 보내도 된다는 신호로 활용됩니다. 이러한 상태 코드 체계는 HTTP/1.1의 명확성과 상호운용성을 크게 향상시킨 핵심 요소 중 하나입니다.

6. 성능과 한계

HTTP/1.1은 지속 연결과 파이프라이닝을 도입하여 성능을 개선했지만, 근본적인 설계 한계로 인해 병목 현상이 발생한다. 가장 큰 문제는 HOL 블로킹이다. 파이프라이닝을 사용하더라도, 응답은 요청이 보내진 순서대로 반드시 처리되어야 한다. 따라서 첫 번째 요청의 응답이 지연되면, 뒤따르는 모든 요청의 응답도 대기하게 되어 전체 처리 속도가 떨어진다.

또한, 브라우저당 동시에 열 수 있는 연결 수에 제한이 존재한다. 일반적으로 하나의 도메인에 대해 6~8개의 병렬 연결만 허용한다[6]. 현대 웹 페이지는 수십에서 수백 개의 리소스(이미지, CSS, 자바스크립트 등)로 구성되므로, 이 제한으로 인해 많은 리소스를 순차적으로 또는 제한된 병렬 처리로 다운로드해야 한다. 이는 페이지 로딩 시간을 증가시키는 주요 원인이다.

한계 요소

설명

영향

HOL 블로킹

요청-응답 순서가 고정되어 선행 응답 지연 시 후속 응답이 대기함

네트워크 대역폭 활용도 저하, 지연 시간 증가

연결 수 제한

브라우저가 단일 도메인에 대해 동시에 유지할 수 있는 연결 수가 제한됨

많은 리소스를 가진 페이지의 로딩 속도 저하

비효율적인 헤더

중복된 헤더 정보를 매 요청마다 평문으로 반복 전송함

불필요한 데이터 오버헤드 발생

응답 우선순위 부재

클라이언트가 중요한 리소스에 대한 응답 우선순위를 지정할 수 없음

사용자 경험에 중요한 리소스의 로딩이 지연될 수 있음

이러한 한계들은 HTTP/1.1이 텍스트 기반의 선형적 프로토콜이라는 근본적인 구조에서 비롯된다. 헤더 필드는 매 요청마다 반복되어 전송되며 압축되지 않아 오버헤드를 발생시킨다. 또한, 서버가 클라이언트에게 리소스를 능동적으로 푸시할 수 있는 메커니즘이 없어 효율성이 떨어진다. 이러한 성능 문제들을 해결하기 위해 이진 프레이밍, 멀티플렉싱, 헤더 압축 등을 도입한 HTTP/2가 개발되었다.

6.1. HOL 블로킹 (Head-of-Line Blocking)

HOL 블로킹은 HTTP/1.1의 핵심 성능 한계 중 하나로, 특히 파이프라이닝이 활성화된 상황에서 두드러지게 나타난다. 이 용어는 네트워크 큐에서 선두에 있는 패킷이 지연될 때 뒤따르는 모든 패킷이 대기해야 하는 현상을 가리킨다. HTTP/1.1의 파이프라이닝에서는 단일 TCP 연결을 통해 여러 HTTP 요청을 순차적으로 보낼 수 있지만, 응답은 반드시 요청이 보내진 순서대로 클라이언트에 도착해야 한다.

이로 인해 첫 번째 요청에 대한 응답이 느리게 생성되거나 대용량 데이터를 포함하면, 뒤이어 보낸 요청들의 응답은 첫 번째 응답이 완전히 전송될 때까지 대기열에서 차단된다. 예를 들어, 첫 번째 요청이 복잡한 데이터베이스 쿼리를 필요로 하는 동적 페이지를 요청하고, 두 번째 요청이 간단한 스타일시트 파일을 요청한 경우, 스타일시트 파일의 응답은 첫 번째 동적 페이지의 응답이 완전히 준비되어 전송되기 전까지 전달될 수 없다. 이는 네트워크 대역폭이 충분하더라도 발생하는 논리적 차단 현상이다.

특징

설명

발생 계층

애플리케이션 계층 (HTTP)에서 발생[7].

주요 원인

요청-응답의 순서 강제 (FIFO).

영향

페이지 로딩 지연, 자원 활용도 저하.

완화 방법

다수의 병렬 TCP 연결 생성 (브라우저별 도메인 당 6~8개).

이 문제를 완화하기 위해 현대 웹 브라우저는 단일 도메인에 대해 여러 개의 병렬 TCP 연결을 동시에 열어 요청을 분산시킨다. 그러나 이 방법은 연결 설정 및 종료에 따른 오버헤드를 증가시키고, 서버 부하를 가중시킬 수 있다. HTTP/1.1의 HOL 블로킅 문제는 프로토콜 설계의 근본적인 한계였으며, 이는 후속 버전인 HTTP/2에서 멀티플렉싱을 도입하여 해결하고자 하는 주요 동기가 되었다.

6.2. 연결 수 제한과 병목 현상

HTTP/1.1의 지속 연결은 매 요청마다 TCP 연결을 새로 설정하는 오버헤드를 줄였지만, 동시에 처리할 수 있는 연결 수에 제한이 생겼다. 대부분의 웹 브라우저는 동일한 도메인에 대해 동시에 유지할 수 있는 지속 연결의 최대 개수를 6개에서 8개 정도로 제한한다[8]. 이는 과도한 연결로 인해 클라이언트와 서버의 리소스가 고갈되는 것을 방지하기 위한 조치이다.

이 제한은 현대 웹 페이지가 수십 개에서 수백 개의 리소스(이미지, 스타일시트, 자바스크립트 파일 등)로 구성되는 경우에 심각한 병목 현상을 유발한다. 브라우저는 페이지를 빠르게 렌더링하기 위해 가능한 한 많은 리소스를 병렬로 다운로드하려 하지만, 연결 수 제한으로 인해 실제로는 대기열이 형성된다. 6개의 연결이 모두 사용 중이라면, 7번째 리소스에 대한 요청은 앞선 요청 중 하나가 완료되어 연결이 해제될 때까지 큐에서 대기해야 한다.

이 병목 현상은 HOL 블로킹 문제와 결합되어 성능 저상을 악화시킨다. 단일 연결 내에서 파이프라이닝이 활성화되더라도, 응답이 순차적으로 처리되어야 하므로 앞선 요청의 응답이 지연되면 뒤의 요청들도 함께 블로킹된다. 여러 연결을 사용하면 이 문제를 일부 완화할 수 있지만, 연결 수 제한이라는 새로운 한계에 부딪히게 된다. 결과적으로, 리소스가 많은 복잡한 웹 페이지를 로드할 때는 연결 풀이 가득 차 리소스 다운로드가 순차적으로 진행되는 것과 유사한 현상이 발생하여 전체 페이지 로드 시간이 길어지게 된다.

이 문제를 완화하기 위한 일반적인 방법은 도메인 샤딩이다. 이는 서브도메인을 여러 개 만들어 리소스를 분산시키는 기법으로, 브라우저의 도메인별 연결 제한을 우회하기 위한 것이다. 예를 들어, static1.example.com, static2.example.com과 같은 서브도메인에 리소스를 호스팅하면, 브라우저는 각 도메인에 대해 별도의 연결 풀을 할당하여 동시 연결 총수를 늘릴 수 있다. 그러나 이 방법은 추가적인 DNS 조회와 연결 설정 오버헤드를 유발하며, HTTP/2와 같은 후속 프로토콜에서는 오히려 성능을 해칠 수 있는 최적화로 간주된다.

7. 보안 고려사항

HTTP/1.1 자체는 암호화나 인증 메커니즘을 정의하지 않는다. 이 프로토콜의 보안은 주로 HTTPS를 통해 구현되며, 이는 HTTP/1.1 메시지를 TLS 또는 그 전신인 SSL 암호화 계층 위에서 전송하는 방식이다. HTTPS는 통신의 기밀성, 무결성, 그리고 서버 인증을 제공하여 중간자 공격과 같은 위협으로부터 보호한다.

HTTP/1.1을 사용할 때 주의해야 할 일반적인 보안 취약점이 존재한다. 예를 들어, 세션 하이재킹이나 크로스사이트 요청 위조 공격에 취약한 쿠키의 안전하지 않은 사용이 대표적이다. 또한, 민감한 정보를 URL의 질의 문자열에 포함시키거나, 기본 인증 방식을 사용하면 자격 증명이 쉽게 노출될 수 있다. 호스트 헤더 주입이나 응답 분할과 같은 공격도 특정 헤더 필드를 부적절하게 처리할 때 발생할 수 있다.

보안을 강화하기 위한 여러 지침과 확장이 개발되었다. HSTS는 브라우저가 강제로 HTTPS를 사용하도록 지시하는 정책이다. 콘텐츠 보안 정책은 크로스사이트 스크립팅 공격을 완화하는 데 도움을 준다. 또한, 모든 요청에 대해 안전한 방법(예: POST, PUT)을 사용하거나, SameSite 쿠키 속성을 설정하는 것이 권장된다.

7.1. HTTPS와의 관계

HTTPS는 HTTP/1.1 프로토콜에 보안 계층을 추가한 것이다. 정확히는, HTTP 메시지의 전송을 담당하는 전송 계층에 TLS(또는 그 전신인 SSL) 암호화 프로토콜을 적용한 형태이다. 이 조합은 HTTP over TLS, 또는 HTTP over SSL이라고 불린다. HTTPS를 사용하면 클라이언트와 서버 간에 교환되는 모든 HTTP 요청과 응답 메시지가 암호화되어, 네트워크 상에서 도청이나 중간자 공격으로부터 내용을 보호한다.

HTTP/1.1 명세 자체는 암호화 메커니즘을 정의하지 않는다. 대신, HTTPS는 별도의 표준(RFC 2818 등)으로 정의되며, 기본적으로 TCP 포트 443을 사용한다. 연결 설정 과정에서 TLS 핸드셰이크가 먼저 수행되어 암호화된 터널을 구축한 후, 그 안에서 평문 HTTP/1.1 프로토콜이 동작한다. 따라서 애플리케이션 관점에서의 메시지 형식, 메서드, 상태 코드는 HTTP/1.1과 완전히 동일하다.

특성

HTTP

HTTPS

기본 포트

80

443

전송 계층

평문 TCP

TLS로 암호화된 TCP

데이터 보안

없음. 평문 전송

종단 간 암호화

신원 확인

없음

서버 인증서를 통한 서버 신원 확인[9]

보안의 필요성이 증가하면서 HTTPS는 로그인, 결제, 개인정보 조회 등 민감한 트랜잭션을 넘어 웹 전반의 표준이 되었다. 현대의 웹 브라우저들은 HTTP 사이트에 대해 '안전하지 않음' 경고를 표시하며, 검색 엔진 또한 HTTPS 사용을 SEO 랭킹 요소로 삼는다. HTTP/1.1은 여전히 내부 프로토콜로 널리 사용되지만, 외부 네트워크를 통한 전송 시에는 거의 항상 HTTPS의 보호를 받는다.

7.2. 일반적인 보안 취약점

HTTP/1.1은 설계상의 특성과 텍스트 기반의 명확한 메시지 형식으로 인해 여러 보안 취약점에 노출될 수 있다. 가장 대표적인 문제는 메시지가 평문으로 전송된다는 점이다. 이로 인해 네트워크 상에서 패킷을 감청하는 중간자 공격이 가능해지며, 민감한 정보가 그대로 노출될 위험이 있다. 또한, 메시지의 무결성을 검증할 수 없어 전송 중 변조가 발생할 수도 있다.

특정 헤더를 악용한 공격도 빈번하게 발생한다. 예를 들어, Host 헤더를 조작하여 서버 측 라우팅 로직을 우회하거나, HTTP 요청 스머글링 공격을 통해 프론트엔드 서버와 백엔드 서버 간의 요청 해석 차이를 이용하는 경우가 있다. CRLF 인젝션은 헤더를 종료하는 캐리지 리턴과 라인 피드 문자를 삽입하여 응답을 분할하거나 악성 헤더를 추가하는 공격 방식이다.

연결 관리와 관련된 공격도 존재한다. Slowloris 공격은 매우 느린 속도로 요청 헤더를 조금씩 전송하여 서버의 연결 자원을 고의로 소진시키는 서비스 거부 공격의 일종이다. 또한, 메시지 본문의 크기를 나타내는 Content-Length 헤더와 청크 전송 인코딩을 혼용하거나 조작하여 서버의 요청 처리 로직을 혼란시키는 공격이 가능하다[10].

이러한 취약점들을 완화하기 위해 HTTPS를 사용하여 통신 구간을 암호화하는 것이 필수적이다. 또한, 웹 애플리케이션 방화벽을 도입하고, 서버 소프트웨어를 최신 상태로 유지하며, 불필요한 헤더를 제거하고 사용자 입력값을 철저히 검증하는 등의 보안 조치가 필요하다.

8. 후속 버전과의 비교

HTTP/2는 HTTP/1.1의 성능 한계를 해결하기 위해 설계되었다. 가장 큰 차이점은 HOL 블로킹 문제를 완화하기 위해 요청과 응답을 이진 프레이밍 계층을 통해 다중화한다는 점이다. HTTP/1.1에서는 단일 연결 내에서 순차적으로 요청을 처리해야 했지만, HTTP/2에서는 여러 요청과 응답이 병렬로 인터리빙되어 전송될 수 있다. 또한 헤더 압축 기술(HPACK)을 도입하여 반복되는 헤더의 오버헤드를 크게 줄였고, 서버 푸시 기능을 통해 클라이언트 요청 없이도 서버가 리소스를 사전에 전송할 수 있게 했다.

HTTP/3는 전송 계층 프로토콜을 TCP에서 QUIC으로 전환한 근본적인 변화를 가져왔다. QUIC은 UDP 위에 구축되어 연결 설정 지연을 줄이고, 이동 중인 사용자의 네트워크 변경 시 연결 재설정 없이 이어지는 연결 마이그레이션을 지원한다. 가장 중요한 개선사항은 전송 계층에서 HOL 블로킹을 제거했다는 점이다. HTTP/2는 TCP 위에서 동작하기 때문에 패킷 손실 시 발생하는 TCP의 재전송 지연이 전체 스트림에 영향을 미쳤지만, HTTP/3의 QUIC은 각 스트림을 독립적으로 처리하여 패킷 손실이 다른 스트림의 전달을 차단하지 않는다.

아래 표는 세 버전의 주요 차이점을 요약한 것이다.

특성

HTTP/1.1

HTTP/2

HTTP/3

전송 프로토콜

TCP

TCP

QUIC (over UDP)

연결 다중화

제한적 (파이프라이닝)

이진 프레이밍을 통한 스트림 다중화

QUIC 스트림을 통한 네이티브 다중화

헤더 전송

일반 텍스트, 압축 없음

HPACK을 이용한 헤더 압축

QPACK을 이용한 헤더 압축

HOL 블로킹

적용 계층: 응용 계층

적용 계층: 전송 계층 (TCP)

전송 계층에서 제거됨

연결 설정

TCP 핸드셰이크 + TLS 핸드셰이크

TCP 핸드셰이크 + TLS 핸드셰이크

QUIC 핸드셰이크 (통합, 1-RTT 또는 0-RTT)

서버 푸시

지원하지 않음

지원함

지원함 (메커니즘 변경)

HTTP/1.1은 여전히 광범위하게 사용되지만, 성능과 효율성 면에서 HTTP/2와 HTTP/3가 상당한 진전을 이루었다. HTTP/2는 기존 TCP 인프라 위에서 헤더 압축과 다중화를 통해 성능을 향상시켰고, HTTP/3는 전송 계층 자체를 재설계하여 지연 시간을 더욱 줄이고 연결 안정성을 높였다. 이러한 진화는 웹의 점점 더 풍부해지는 콘텐츠와 실시간 상호작용에 대한 요구에 부응하기 위한 것이다.

8.1. HTTP/2와의 주요 차이점

HTTP/1.1은 텍스트 기반의 프로토콜로, 각 요청과 응답이 평문으로 구성되어 헤더가 반복되고 압축되지 않는다. 반면 HTTP/2는 바이너리 프로토콜을 채택하여 메시지를 바이너리 프레임으로 분할하고 전송 효율을 높였다. 이는 구문 분석을 빠르게 하고 오류 가능성을 줄인다.

HTTP/1.1에서는 단일 연결 내에서 여러 요청을 순차적으로 보낼 수 있는 파이프라이닝이 있지만, 응답은 요청 순서대로 반드시 도착해야 하는 HOL 블로킹 문제가 있다. HTTP/2는 멀티플렉싱을 도입하여 단일 TCP 연결 상에서 여러 요청과 응답을 병렬로 주고받을 수 있게 하여 이 문제를 해결했다. 또한 서버 푸시 기능을 통해 클라이언트의 추가 요청 없이도 필요한 리소스를 사전에 전송할 수 있다.

헤더 처리 방식에도 차이가 있다. HTTP/1.1은 매 요청마다 중복된 헤더 필드를 전송해야 한다. HTTP/2는 HPACK 압축 방식을 사용하여 헤더를 압축하고, 정적/동적 테이블을 통해 중복된 필드를 효율적으로 제거하여 대역폭을 절약한다.

비교 항목

HTTP/1.1

HTTP/2

프로토콜 형식

텍스트(평문)

바이너리

연결 방식

기본적으로 지속 연결, HOL 블로킹 존재

단일 연결 멀티플렉싱, HOL 블로킹 해결

헤더 전송

비압축, 반복 전송

HPACK 압축을 통한 효율적 전송

서버 주도 리소스 전송

불가능

서버 푸시 가능

스트림 의존성 및 우선순위

제한적

스트림별 가중치와 의존성 설정 가능

이러한 개선에도 불구하고 HTTP/2의 핵심 전송 계층은 여전히 TCP를 사용한다. 이로 인한 TCP의 핸드셰이크 지연과 혼잡 제어 메커니즘의 한계는 여전히 남아있었으며, 이는 이후 HTTP/3과 QUIC 프로토콜의 등장으로 이어지는 배경이 되었다.

8.2. HTTP/3 (QUIC)로의 진화

HTTP/2가 TCP 위에서 동작하며 멀티플렉싱과 헤더 압축으로 성능을 개선했다면, HTTP/3는 전송 계층 프로토콜 자체를 교체하는 근본적인 변화를 가져왔다. HTTP/3의 핵심은 QUIC(Quick UDP Internet Connections) 프로토콜을 사용한다는 점이다. QUIC는 UDP를 기반으로 설계되었으며, TCP의 신뢰성과 TLS의 보안 기능을 통합했다.

HTTP/3와 QUIC의 도입으로 해결된 가장 중요한 문제는 HOL 블로킹(Head-of-Line Blocking)이다. TCP에서는 패킷 하나가 손실되면 그 뒤의 모든 패킷의 전달이 지연되는 현상이 발생한다. 반면, QUIC는 독립적인 스트림을 통해 데이터를 전송하므로, 한 스트림에서의 패킷 손실이 다른 스트림에 영향을 미치지 않는다. 또한 연결 설정 시 TCP 핸드셰이크와 TLS 핸드셰이크를 결합하여 대기 시간을 크게 줄였으며, 연결 마이그레이션 기능으로 네트워크가 변경되어도(예: Wi-Fi에서 셀룰러로 전환) 기존 연결을 유지할 수 있다.

특징

HTTP/1.1 / HTTP/2 (TCP 기반)

HTTP/3 (QUIC/UDP 기반)

전송 계층

[[전송 제어 프로토콜

TCP]]

연결 설정

TCP 핸드셰이크 + TLS 핸드셰이크 (2~3 RTT)

통합 핸드셰이크 (0~1 RTT)

HOL 블로킹

전송 계층(TCP)에서 발생

스트림 수준에서 격리됨

보안

TLS 상위 계층에서 적용

암호화가 프로토콜에 기본 내장됨

연결 식별

IP 주소 + 포트 + 시퀀스 번호 조합

연결 ID (Connection ID)

HTTP/3의 표준화는 IETF에서 진행되었으며, 2022년 6월 RFC 9114로 공식 발표되었다[11]. 이 진화는 웹의 성능과 보안, 신뢰성을 한 단계 높이는 동시에, 수십 년간 인터넷의 근간을 이루었던 TCP 중심의 패러다임을 변화시키는 중요한 이정표가 되었다. 현재 많은 주요 CDN 제공업체와 웹 브라우저, 서버 소프트웨어가 HTTP/3를 지원하고 있다.

9. 관련 문서

  • Wikipedia - Hypertext Transfer Protocol

  • Wikipedia - HTTP/1.1

  • IETF RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing

  • IETF RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content

  • MDN Web Docs - HTTP/1.x의 연결 관리

  • HTTP/1.1 vs HTTP/2: What's the Difference?

  • HTTP/1.1 Specification (RFC 2616) - W3C

리비전 정보

버전r1
수정일2026.02.12 06:25
편집자unisquads
편집 요약AI 자동 생성