Range
사용법
Range 헤더는 리소스의 부분 검색을 가능하게 합니다. 클라이언트는 리소스 전체를 내려받는 대신 특정 바이트 범위를 요청하기 위해 이 헤더를 포함시킵니다. 이는 중단된 다운로드를 재개하고, 탐색을 지원하는 미디어 스트리밍을 제공하며, 큰 파일을 여러 구간으로 병렬 로드하는 데 필수적입니다.
범위 요청을 보내기 전에 클라이언트는 이전 응답의 Accept-Ranges 헤더를 확인하여 서버 지원 여부를 검증합니다. 값이 bytes이면 서버가 바이트 범위 요청을 처리한다는 뜻입니다. 값이 none이면 서버가 범위 요청을 받아들이지 않는다는 뜻입니다.
범위 요청이 성공하면 서버는 206 Partial Content로 응답하고 바이트 위치와 전체 리소스 크기를 나타내는 Content-Range 헤더를 포함시킵니다. 단일 요청에 여러 범위를 담으면 각 파트가 자체 Content-Range와 Content-Type 헤더를 가지는 multipart 응답이 생성됩니다.
요청된 범위가 리소스 경계를 벗어나면 서버는 416 Range Not Satisfiable을 반환합니다. 경우에 따라 서버가 Range 헤더를 완전히 무시하고 200 상태로 리소스 전체를 전달하기도 합니다.
unit
unit은 범위의 측정 단위를 지정합니다. bytes는 HTTP 명세가 정의한 표준 단위입니다. 사용자 정의 범위 단위도 허용되지만 거의 쓰이지 않습니다.
range-start와 range-end
range-start 값은 범위가 시작되는 0부터 세는 바이트 오프셋입니다(필수). range-end 값은 범위가 끝나는 0부터 세는 바이트 오프셋입니다(선택). range-end를 생략하면 range-start부터 리소스 끝까지의 모든 바이트를 요청합니다.
suffix-length
suffix-length 형태는 리소스의 마지막 N바이트를 요청합니다. -N 형식은 전체 리소스 크기를 몰라도 마지막 N바이트를 가져옵니다.
예시
클라이언트가 큰 이미지 파일의 처음 1,000바이트를 요청합니다. 서버는 206 Partial Content로 응답하며 Content-Range 헤더에 바이트 범위와 전체 파일 크기를 명시합니다.
GET /photo.jpg HTTP/1.1
Host: cdn.example.re
Range: bytes=0-999
HTTP/1.1 206 Partial Content
Content-Type: image/jpeg
Content-Length: 1000
Content-Range: bytes 0-999/250000
클라이언트가 50,000바이트 지점부터 다운로드를 재개합니다. 끝 값을 생략하면 주어진 오프셋부터 리소스 끝까지 전부를 요청합니다.
Range: bytes=50000-
클라이언트가 파일의 마지막 500바이트를 요청합니다. suffix 형태는 클라이언트가 전체 파일 크기를 모를 때 유용합니다.
Range: bytes=-500
클라이언트가 단일 요청으로 서로 떨어진 두 바이트 범위를 요청합니다. 서버는 각 구간을 별도의 본문 파트로 담은 multipart 응답을 반환합니다.
Range: bytes=0-499, 1000-1499