206 Partial Content
사용법
206 Partial Content 상태 코드는 하나 이상의 Range 헤더를 포함한 요청에 대한 응답으로 반환됩니다. Range 헤더는 서버가 문서의 어느 부분을 반환할지 지정하며, 서버는 선택적으로 그 데이터를 멀티파트 문서로 전달합니다.
단일 Range 헤더가 지정된 경우, Content-Length 헤더는 전송되는 범위(즉 콘텐츠)의 크기를 나타내고, Content-Type 헤더는 문서 타입과 일치하며, Content-Range 헤더는 어느 구간이 포함되었는지 표시합니다. 문서 전체 크기는 Content-Range 헤더의 complete-length 필드에 나타납니다. 요청한 데이터는 메시지 본문에 이어집니다.
여러 범위를 요청한 경우, Content-Length 헤더는 메시지 본문의 총 바이트 수를 나타냅니다. 최초의 Content-Type 헤더는 multipart/byteranges로 설정되고, 뒤따르는 Content-Type / Content-Range 쌍이 각 범위를 설명합니다. 서버는 최초 헤더에 Content-Range 필드를 포함하지 않습니다.
다중 범위 요청에서 서버는 선택적으로 겹치는 범위나, 파트를 추가로 보내는 오버헤드보다 작은 간격으로 떨어진 범위를 병합하기도 합니다. 이는 효율을 위한 것이므로, 요청한 것보다 적은 수의 파트를 받았다고 해서 반드시 오류인 것은 아닙니다. 그 반대는 성립하지 않습니다. 단 하나의 범위만 요청했을 때 서버가 여러 파트를 생성하지는 않습니다.
범위의 개수뿐 아니라 파트의 순서도 보장되지 않습니다. 서버는 요청된 것과 같은 순서로 범위를 보내려고 노력하지만, 항상 그렇게 할 수 있는 것은 아닙니다.
몇 개의 범위를 요청했든 Content-Range 헤더에는 리소스의 전체 크기가 포함됩니다. 응답 시점에 크기를 알 수 없으면 별표로 그 값을 표시합니다.
서버가 요청된 범위를 반환할 수 없을 때는 416 상태 코드를 반환합니다. 일부 서버는 대신 메시지 본문에 문서 전체를 담은 200을 반환합니다.
단일 범위 조회 예시
클라이언트가 Range 헤더를 사용해 동영상 파일 내부의 데이터 블록을 요청합니다. 서버는 요청된 범위를 MP4로 인코딩된 동영상임을 표시하며 반환합니다.
요청
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=25000-75000
응답
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/100000
<50,001 bytes of video data>
전체 크기를 알 수 없을 때의 대체 응답
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/*
<50,001 bytes of video data>
다중 범위 조회 예시
둘 이상의 범위를 요청할 때 클라이언트는 각 범위를 요청에 명시합니다. 범위는 서로 다른 줄에 두거나 같은 줄에 쉼표로 구분해 나열합니다. 서버는 범위 파트 사이의 경계를 표시하기 위해 문자열 구분자를 사용합니다.
요청
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=100-250, 1500-2000, 5000-5200
응답
HTTP/1.1 206 Partial Content
Content-Length: 1115
Content-Type: multipart/byteranges; boundary=range_sep
--range_sep
Content-Type: video/mp4
Content-Range: bytes 100-250/75000
<151 bytes of video data as the first range>
--range_sep
Content-Type: video/mp4
Content-Range: bytes 1500-2000/75000
<501 bytes of video data as the second range>
--range_sep
Content-Type: video/mp4
Content-Range: bytes 5000-5200/75000
<201 bytes of video data as the third range>
--range_sep--
이어받기 다운로드
206 Partial Content 응답은 이어받기 다운로드를 가능하게 합니다. 전송이 중단되면 클라이언트는 마지막으로 받은 바이트부터 시작하는 Range 헤더를 담아 새 요청을 보냅니다. 서버는 리소스 전체를 다시 전송하는 대신 남은 데이터를 206 응답으로 반환합니다. 다운로드 관리자와 curl —continue-at - 같은 도구가 이 메커니즘에 의존합니다.
코드 참고
.NET
HttpStatusCode.PartialContent
Rust
http::StatusCode::PARTIAL_CONTENT
Rails
:partial_content
Go
http.StatusPartialContent
Symfony
Response::HTTP_PARTIAL_CONTENT
Python3.5+
http.HTTPStatus.PARTIAL_CONTENT
Java
java.net.HttpURLConnection.HTTP_PARTIAL
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_PARTIAL_CONTENT
Angular
@angular/common/http/HttpStatusCode.PartialContent