Transfer-EncodingTransfer-Encoding은 메시지 본문을 네트워크로 안전하게 전송하기 위해 적용하는 인코딩을 지정하는 홉 단위(hop-by-hop) 헤더입니다. 대표 값은 본문을 크기가 붙은 조각으로 나눠 보내는 `chunked`로, 전체 크기를 미리 모를 때 스트리밍 전송을 가능하게 합니다.
`chunked`는 본문을 여러 청크로 나누며, 각 청크 앞에 16진수 크기를 붙이고 마지막에 크기 0인 청크로 끝을 알립니다. 덕분에 서버는 응답을 다 만들기 전에 스트리밍을 시작할 수 있고, 미리 계산할 수 없는 동적 콘텐츠에서 Content-Length 없이도 메시지 경계를 표현할 수 있습니다. 즉 chunked를 쓰면 Content-Length는 쓰지 않습니다(둘은 상호 배타적).
이것은 종단 간(end-to-end)인 Content-Encoding과 근본적으로 다릅니다. Transfer-Encoding은 인접한 두 노드 사이의 전송 형식일 뿐이라, 프록시가 청크를 재조립하고 다음 홉으로는 다른 형식으로 넘길 수 있습니다. 그래서 캐시·ETag는 Transfer-Encoding의 영향을 받지 않습니다.
HTTP/1.1에서 Content-Length와 Transfer-Encoding이 한 메시지에 동시에 오면, 어떤 것을 기준으로 본문 경계를 잡을지 서버·프록시마다 달라져 HTTP 요청 스머글링(request smuggling)의 고전적 취약점이 됩니다. HTTP/2·HTTP/3에서는 프레이밍 방식이 달라 chunked Transfer-Encoding 자체가 금지됩니다.
Transfer-Encoding: <coding>[, <coding>]* (chunked | gzip | ...)e.g. Transfer-Encoding: chunked
chunked | 본문을 크기가 붙은 청크로 나눠 전송. 스트리밍·미리 크기 모를 때 사용. 마지막 청크는 크기 0. |
gzip | 전송 구간에서 본문을 gzip 압축(홉 단위). |
compress | 구형 LZW 압축(거의 미사용). |