본문으로 건너뛰기
김신건의 로그

[Network] HTTP/1.1: keep-alive, pipelining, chunked transfer

· 수정 · 📖 약 2분 · 588자/단어 #http #network #backend #protocol
HTTP/1.1, keep-alive, pipelining, chunked encoding, Content-Length, Connection: close

정의

HTTP/1.1 (1997, RFC 9112 으로 재정리) 는 텍스트 기반 stateless request/response 프로토콜. 2026 시점에도 대부분의 트래픽이 HTTP/1.1 + 일부 HTTP/2/3 분포.

핵심 진화 (HTTP/1.0 대비):

기능HTTP/1.0HTTP/1.1
기본 연결매 요청 새 TCPPersistent (keep-alive)
Host 헤더옵션필수 (가상호스팅)
Chunked transfer없음있음
캐시 제어ExpiresCache-Control
부분 요청없음Range / 206 Partial Content

메시지 구조

GET /api/users/42 HTTP/1.1
Host: api.example.com
User-Agent: curl/8.1
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42
Connection: keep-alive

{"id":42,"name":"koa","tier":"pro"}

Keep-Alive (Persistent Connection)

Connection: keep-alive 헤더로 TCP 연결 재사용. 한 연결에서 여러 요청/응답. TLS 핸드셰이크 비용 절감의 결정적 기능.

sequenceDiagram
    autonumber
    participant C as Client
    participant S as Server

    C->>S: TCP SYN / handshake (3-way)
    S-->>C: SYN-ACK
    C->>S: GET /a
    S-->>C: 200 OK (Connection: keep-alive)
    C->>S: GET /b (같은 TCP)
    S-->>C: 200 OK
    C->>S: GET /c (같은 TCP)
    S-->>C: 200 OK
    Note over C,S: idle timeout (예: 60s) 후 close
헤더 / 설정의미
Connection: keep-alive연결 재사용 (HTTP/1.1 기본)
Connection: close응답 후 즉시 close
Keep-Alive: timeout=60, max=100idle 60s, max 100 요청

TIP

서버 (nginx, ELB) 의 idle timeout 과 클라이언트 connection pool TTL 의 불일치가 간헐적 connection reset 의 가장 흔한 원인. 보통 클라이언트 < 서버 로 잡는다.

Pipelining (구현 함정)

같은 연결에서 응답을 기다리지 않고 여러 요청 동시 전송. Head-of-Line Blocking 문제 → 실전 거의 사용 안 됨.

요청: A → B → C → D (즉시 연속)
응답: A → B → C → D (반드시 순서대로)

문제: A 가 느리면 B/C/D 도 모두 대기

→ HTTP/2 의 multiplexing 이 이 문제를 프레임 인터리빙 으로 해결. 자세한 건 head-of-line-blocking / HTTP/2.

Content-Length vs Chunked

본문 끝을 알리는 두 가지 방법:

# 1. Content-Length (크기 미리 알 때)
HTTP/1.1 200 OK
Content-Length: 12345

<12345 bytes>

# 2. Transfer-Encoding: chunked (streaming)
HTTP/1.1 200 OK
Transfer-Encoding: chunked

7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
0\r\n
\r\n
방식동작사용
Content-Length정확한 바이트 수정적 파일, 작은 응답
chunked청크 단위 전송streaming (SSE, long-poll, 대용량 응답)

IMPORTANT

동일 응답에 두 방식 모두 설정 하면 RFC 위반. 일부 프록시는 chunked 우선, 일부는 Content-Length 우선 → HTTP Request Smuggling 공격의 토대. 항상 하나만.

상태 코드 카테고리

범위의미대표
1xxInformational100 Continue, 101 Switching Protocols
2xxSuccess200 OK, 201 Created, 204 No Content, 206 Partial Content
3xxRedirection301 Moved Permanently, 302 Found, 304 Not Modified, 307 Temporary Redirect, 308 Permanent Redirect
4xxClient Error400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable, 429 Too Many Requests
5xxServer Error500, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout

NOTE

307/308 vs 302/301 의 핵심 차이: 307/308 은 HTTP method 를 보존. POST → 302 → GET옛 클라이언트 동작307 에서는 POST → POST.

Cache 헤더 (HTTP/1.1 의 가장 큰 진화)

Cache-Control: public, max-age=3600, must-revalidate
ETag: "abc123"
Last-Modified: Wed, 25 Jun 2026 12:00:00 GMT
flowchart LR
    A[클라이언트<br/>If-None-Match: abc123] --> B[서버]
    B -->|ETag 일치| C[304 Not Modified<br/>body 없음]
    B -->|ETag 불일치| D[200 OK<br/>새 본문 + 새 ETag]

자세한 캐시 패턴은 network-http-caching 참고.

흔한 함정

WARNING

  1. Host 헤더 누락 = HTTP/1.1 에서 400 Bad Request. 가상호스팅 때문에 필수.
  2. Content-Length 거짓말 = 본문이 짧으면 클라이언트가 무한 대기, 길면 다음 요청과 섞임 (smuggling).
  3. Connection: close 남발 = TCP/TLS 비용 폭증. 명시적 이유 없으면 기본 keep-alive.
  4. Cache-Control: no-cacheno-store 혼동 = no-cache 는 재검증 필요, no-store 는 저장 자체 금지.

관련 위키

이 글의 용어 (8개)
[Network] HTTP Caching: Cache-Control, ETag, Last-Modifiednetwork
정의 HTTP Caching 은 HTTP 응답을 클라이언트 / 중간 proxy / CDN 이 보관해 같은 요청을 다시 처리하지 않게 하는 메커니즘. 성능 + 비용 절감의 핵심. …
[Network] HTTP/2: multiplexing, HPACK, server push의 종말network
정의 HTTP/2 (2015, RFC 9113) 는 HTTP/1.1 의 문법은 유지하되 전송을 바이너리 + 멀티플렉싱 으로 바꾼다. Head-of-Line Blocking (HT…
[Network] HTTP/3: QUIC 위의 HTTP, 0-RTT, connection migrationnetwork
정의 HTTP/3 (2022, RFC 9114) 는 HTTP 의 전송 레이어를 TCP → QUIC 으로 교체한 버전. UDP 위에 QUIC, QUIC 위에 HTTP. 핵심 동기:…
[Network] Load Balancer: L4 vs L7, 알고리즘, sticky sessionnetwork
정의 Load Balancer 는 트래픽을 여러 백엔드로 분산 하는 인프라. 수평 확장 + 가용성 + 무중단 배포 의 토대. L4 vs L7 | 구분 | L4 (Transport…
Head-of-Line Blockingnetwork
정의 Head-of-Line Blocking (HOLB) 은 처리 순서가 정해진 큐에서 맨 앞 항목의 지연이 그 뒤 항목 전체의 지연으로 전파되는 현상이다. 네트워크 프로토콜에서…
HPACKnetwork
정의 HPACK (RFC 7541)은 HTTP/2 에서 요청·응답 헤더를 압축하기 위해 설계된 방식. HTTP/1.1 의 헤더는 매 요청마다 텍스트로 반복 전송되었다 (한 페이지…
TCPnetwork
정의 TCP (Transmission Control Protocol)는 신뢰성 있는 연결 지향 전송 계층 프로토콜이다. RFC 9293 으로 정의되어 있다. HTTP/1.1·2,…
TLS / SSLnetwork
정의 TLS (Transport Layer Security)는 (또는 위 ) 위에서 동작하는 암호화·인증 프로토콜이다. SSL 은 TLS 의 전신 (Netscape 1995, 더…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기