Operation/Network

HTTP - 청크 인코딩(Transfer-encoding: chunked) [Size가 큰 테이블, 이미지 등 내려주기]

JaeHoney 2022. 3. 28. 23:13

Transfer-encoding: chunked

Chunked 인코딩 전송방식은 HTTP 1.1에서 사용가능한 스트리밍 데이터 전송 방식입니다.

 

청크 전송 방식의 특징은 아래와 같습니다.

  • 데이터를 여러 개의 청크 단위로 쪼개서 순차적으로 전송
  • 각 청크는 독립적으로 송수신 됨
  • 각 청크의 앞에는 해당 청크의 Size(16진수)를 설정해서 보냄
  • 길이가 0인 청크가 수신되면 전송이 종료됨

 

청크 전송 방식의 장점

  • 큰 데이터 전송에도 HTTP 연결이 중간에 끊어지지 않게 유지할 수 있음.
  • Content-Length가 필요 없음 -> 크기가 가변적인 데이터 전송에 유리
  • 전체 컨텐츠를 생성할 때까지 대기하지 않음

 

HTTP 1.1부터는 기본적으로 연결 유지(Connection: keep-alive)가 활성화되어있습니다.

 

문제는 지속 커넥션에서 클라이언트가 Content-Length를 반드시 알아야된다는 점입니다. HTTP 1.0에서는 커넥션이 닫히면 HTTP 메시지도 끝난걸로 간주했지만, 이제는 지속 커넥션에서 응답 메시지의 Response Body만큼을 가져와서 읽어야 하기 때문입니다.

 

전송할 컨텐츠의 크기를 계산할 때 사이즈가 크면 과정이 엄청 오래걸립니다. 계산 과정에서 문제가 생길 수도 있습니다.

 

청크 전송방식을 사용하면 이런 점을 보완할 수 있습니다. 주로 DB 쿼리의 결과가 되는 HTML 테이블 / 엑셀 / 이미지 등에 사용됩니다.

 

반면 단점은, 응답 데이터의 길이가 얼마나 되는지, 다운로드 완료 시간이 얼마인지 예측할 수 없습니다.

 

감사합니다.