http 헤더의 Chunked Transfer Encoding

손호준·2024년 9월 20일

http 응답이 아래와 같을 때

HTTP/1.1 200 OK
date: Fri, 20 Sep 2024 05:50:20 GMT
server: uvicorn
content-type: text/event-stream; charset=utf-8
transfer-encoding: chunked

즉, Transfer-Encoding: chunked가 사용된 경우 content-length 대신 청크 인코딩(chunked transfer encoding)을 사용해 데이터의 끝을 알린다. 청크 인코딩 방식에서는 전체 응답의 길이를 미리 알 수 없기 때문에 content-length가 포함되지 않는다.

Chunked Transfer Encoding

  • 청크 인코딩은 서버가 데이터를 일정한 크기(청크)로 나누어 전송하는 방식이다.
  • 각 청크는 다음과 같은 구조로 이루어져 있다:
    1. 청크의 크기(16진수로 표시) + \r\n
    2. 해당 청크의 데이터
    3. 각 청크 끝에는 \r\n이 추가됨
    4. 마지막 청크는 크기가 0\r\n으로 표시되며, 그 이후에 \r\n이 추가되어 전송이 완료되었음을 나타냄.

예시

HTTP/1.1 200 OK
Transfer-Encoding: chunked

5\r\n
Hello\r\n
7\r\n
 World!\r\n
0\r\n
\r\n
  • 첫 번째 청크: "Hello" (길이 5)
  • 두 번째 청크: " World!" (길이 7)
  • 마지막 청크는 0으로, 데이터의 끝을 나타냄.

청크 인코딩을 처리하는 방법

  1. 청크 크기 읽기: 각 청크는 크기 정보를 포함하고 있으므로, 먼저 청크의 크기를 읽는다. 이 값은 16진수로 인코딩되어 있다.
  2. 청크 데이터 읽기: 청크 크기를 읽은 후, 해당 크기만큼의 데이터를 읽는다.
  3. 마지막 청크 확인: 청크 크기가 0이면, 모든 데이터를 다 읽은 것이다.
profile
Rustacean🦀

0개의 댓글