https://withbundo.blogspot.com/2017/08/http-20-http-ii-transfer-encoding.html
위 글에서 소개하는 4가지의 헤더중 Transfer Encoding 에 대해 공부한 내용입니다.
Transfer-Encoding
Transfer-Encoding 헤더를 이해하려면, HTTP의 데이터 전송방식을 이해해야합니다.
HTTP 1.0 에서 클라이언트는 자신이 요청한 컨텐츠의 사이즈를 어떻게 알 수 있을까요?
HTTP 1.0은 연결유지 기능이 없기 때문에 TCP 커넥션이 끊어지는 것이 곧 데이터 전송의 완료라고 볼 수 있습니다.
(HTTP 1.0 에서는 하나의 TCP 커넥션에 하나의 요청만 처리되기 때문에 데이터 전송이 완료되면 커넥션이 끊어집니다.)
따라서, HTTP 1.0 에서는 웹서버가 따로 전달하려는 데이터의 사이즈를 알려줄 필요가 없을뿐만아니라 클라이언트 역시 데이터를 전달받기 전에 미리 사이즈를 알아야 할 이유가 없습니다.
하지만 HTTP 1.1 에서는 연결 유지(persist connection)로 인해 다른점이 생깁니다.
HTTP 1.1 에서는 기본적으로 keep alive (연결 유지 기능)이 활성화 되어있습니다. 하나의 TCP 커넥션에 여러개의 요청이 가능하기 때문에 클라이언트는 요청마다 전달될 컨텐츠의 데이터 사이즈를 미리 알고 있어야합니다. 웹서버가 전달해 주는 컨텐츠의 시작과 끝을 알아야만 해당 요청에 대한 처리가 올바르게 되기 때문입니다.
그래서 HTTP 1.1 에서는 Content-Length 라는 헤더로 전달하고자 하는 컨텐츠의 사이즈를 표시합니다.
다음은 인기 그룹 트와이스의 이미지를 요청했을 때 서버의 응답헤더 부분입니다.
응답헤더에서 볼 수 있듯이 웹 서버는 클라이언트의 요청 컨텐츠를 전달하기 앞서 Content-Length 헤더를 통해 이미지 사이즈를 먼저 알려준 후 데이터를 전달합니다.
- 웹 서버가 클라이언트의 요청을 받는다.
- 웹 서버는 클라이언트에게 전달해 줄 컨텐츠의 사이즈를 먼저 계산한다.
- 계산된 컨텐츠의 전체 사이즈와 함께 데이터를 전달한다.
만약 컨텐츠의 사이즈가 엄청 큰 경우 2번 과정에서 문제가 발생할 수 있습니다.
전체 사이즈를 계산하는 과정이 오래 걸리게 되므로 클라이언트가 느끼는 지연시간에 반영될 수 있습니다.
컨텐츠 사이즈가 큰 경우에는 위와 같은 방식 보다는 좀 더 효율적인 다른 방식이 필요합니다.
그것이 바로 Chunked 전송 방식 입니다.
Chunked 전송 방식의 개념은 간단합니다.
전체 덩어리를 한번에 주지 않고, 조금씩 떼어 주는 방식입니다.
웹 서버는 Chunked 방식으로 데이터를 전송하는 경우에는 전체 사이즈를 한번에 계산할 필요가 없습니다.
위 그림 처럼 클라이언트가 트와이스 이미지를 요청하면, 웹 서버는 전체 이미지의 부분만 떼어서 전달해 주는 방식입니다. 떼어 주는 부분의 사이즈만 알려주면 되기 때문에 전체 사이즈를 계산하지 않아도 되어 기존의 전송방식의 단점을 극복한 방식이라고 할 수 있습니다.
컨텐츠의 마지막 부분을 전송하고 나서는 "0" 을 보내어 데이터가 모두 전송되었음을 알립니다.
따라서 Chunked 전송방식에는 Content-Length 헤더가 존재하지 않습니다.
아래 Chunked 방식의 HTTP 헤더 내용을 살펴봅시다.
- Transfer-Encoding: Chunked 를 통해 Chunked 전송방식으로 데이터를 전송할 것을 알린다.
- 이후 데이터 전송시 전송하려는 데이터의 부분적인 사이즈를 16진수로 표시하여 알린 후 실제 데이터를 사이즈 만큼 보낸다.
- 위 2번 과정을 반복한다.
- 데이터의 마지막 끝 부분에 "0" 을 표시하여 데이터 전송이 완료되었음을 알린다.
정리하면 Chunked 방식은 전달하려는 컨텐츠의 사이즈가 큰 경우 서버의 처리 지연을 보완할 수 있는 방법입니다.
Transfer-Encoding 헤더는 Chunked 전송방식으로 데이터를 전달하려 할때 주로 사용되는 헤더이며, 값으로는 위 헤더 내용처럼 "Chunked"를 가지게 됩니다.
'CS > 네트워크 & 웹' 카테고리의 다른 글
반사형(Reflected) XSS(Cross-Site Scripting) 공격과 방어 (2) | 2023.04.13 |
---|---|
토큰을 어디에 저장해야할까요? (4) | 2023.04.13 |
REST란? REST API 와 RESTful API (0) | 2023.04.11 |
HTTP Cache (0) | 2023.04.10 |
전자서명과 CA (0) | 2023.04.07 |