Chunked Transfer Encoding이란? 개념과 동작 원리

Chunked Transfer Encoding이란?

HTTP 통신에서 서버가 응답 데이터를 클라이언트에게 보낼 때, 보통은 응답 본문의 전체 크기를 미리 알려줘야 합니다. 이때 사용하는 헤더가 Content-Length입니다. 하지만 서버가 응답을 만드는 시점에 전체 데이터 크기를 알 수 없는 경우도 많습니다. 예를 들어 실시간으로 생성되는 로그 스트림이나, 데이터베이스에서 대량의 결과를 순차적으로 조회해 전송하는 경우가 그렇습니다.

이런 상황을 위해 HTTP/1.1에서는 ‘Chunked Transfer Encoding’이라는 방식을 제공합니다. 응답 헤더에 Transfer-Encoding: 'chunked'를 명시하면, 서버는 전체 크기를 미리 알리지 않고 데이터를 작은 조각(chunk) 단위로 순차적으로 전송할 수 있습니다.

동작 원리와 예시

비유를 들면, 택배로 큰 짐을 한 번에 보내는 대신, 짐을 여러 개의 작은 상자로 나눠서 도착하는 대로 하나씩 보내는 것과 비슷합니다. 받는 사람은 상자가 몇 개나 올지 미리 몰라도, 상자마다 크기를 확인하고 마지막 상자(크기가 0인 상자)가 오면 배송이 끝났다는 것을 알 수 있습니다.

실제 HTTP 메시지에서는 각 청크 앞에 16진수로 표현된 데이터 크기가 붙고, 그 뒤에 실제 데이터가 이어집니다. 마지막에는 크기가 0인 청크를 보내 전송이 끝났음을 알립니다. 예를 들면 다음과 같은 형태입니다.

  • 7\r\nMozilla\r\n
  • 9\r\nDeveloper\r\n
  • 0\r\n\r\n

이 예시는 ‘Mozilla'(7바이트)와 ‘Developer'(9바이트)를 각각 청크로 나눠 보내고, 마지막에 0바이트 청크로 종료를 알리는 구조입니다.

실무에서 왜 쓰는지

Chunked Transfer Encoding은 다음과 같은 상황에서 유용하게 사용됩니다.

  • 스트리밍 서비스처럼 데이터가 실시간으로 생성되어 전체 크기를 미리 알 수 없는 경우
  • 대용량 파일이나 대량 데이터를 메모리에 모두 올리지 않고 조금씩 전송해 서버 부담을 줄이는 경우
  • 서버 사이드 렌더링(SSR)에서 페이지 일부를 먼저 그려서 사용자 체감 속도를 높이는 경우

다만 청크 단위로 전송하다 보면 약간의 오버헤드가 발생할 수 있고, 일부 프록시나 캐시 서버는 chunked 응답을 처리하는 방식이 다르기 때문에 상황에 맞게 적절히 사용하는 것이 중요합니다.

댓글 남기기