HTTPQUERY
한국어

416 Range Not Satisfiable

사용법

416 Range Not Satisfiable 오류 메시지를 받는 경우, 클라이언트가 Range 헤더로 부분 콘텐츠를 요청한 상황입니다. 바이트 범위에서 지정된 범위의 첫 바이트가 리소스의 길이보다 크면 이 오류가 반환됩니다.

부분 범위를 요청하는 이유 중 하나는 대용량 파일 전송으로, 클라이언트가 파일을 조각 단위로 내려받고자 할 때입니다. 요청에 Range 헤더를 사용하면 파일을 사실상 조각으로 나누어 임의의 순서로 내려받을 수 있습니다.

서버가 요청을 충족하여 요청된 범위 중 적어도 하나를 리소스의 부분집합으로 반환하면, 성공을 알리기 위해 206이 반환됩니다. 서버는 범위 요청을 무시하고 200 상태와 함께 리소스 전체를 반환하는 선택을 할 수도 있습니다.

서버는 응답의 일부로 현재 데이터 길이를 명시하는 Content-Range 헤더를 생성합니다.

Content-Range: bytes */512

구분자 / 앞의 별표 *는 충족할 수 없는 범위임을 나타내며, 그 뒤에 리소스의 전체 크기가 옵니다.

SEO 영향

Google 같은 검색 엔진은 416 응답 상태를 가진 URL을 색인하지 않습니다. 이전에 색인된 URL은 검색 결과에서 제거됩니다.

예시

클라이언트가 리소스의 1000번째부터 2000번째 바이트를 요청합니다. 파일의 길이가 512바이트뿐이므로 서버는 416 Range Not Satisfiable을 반환합니다. 클라이언트는 서버가 알려 준 전체 크기 정보를 이용해 유효한 범위로 요청을 다시 만듭니다.

요청

GET /documents/main HTTP/1.1
Host: example.com
Range: bytes=1000-2000

응답

HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */512

서버가 범위를 무시할 때의 대체 응답

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 512

<entire 512 bytes in message body>

해결 방법

Range 헤더가 리소스 경계 밖의 바이트 범위를 지정하고 있습니다. 가장 흔한 원인은 파일 끝을 넘어서는 바이트를 요청하는 것입니다(예: 512바이트뿐인 파일에서 1000-2000 바이트를 요청).

먼저 리소스 크기를 확인하세요. 범위 요청을 만들기 전에 HEAD 요청을 보내 Content-Length 헤더를 읽으세요. 이렇게 하면 파일 경계를 넘는 바이트를 요청하는 일을 막을 수 있습니다.

바이트 범위 계산을 점검하세요. 바이트 범위는 0부터 시작하며 양쪽 끝을 포함합니다. 512바이트 파일의 유효한 바이트 위치는 0부터 511까지입니다. bytes=0-511 범위는 파일 전체를 요청합니다. 범위 계산에서의 off-by-one 오류는 416 응답의 흔한 원인입니다.

리소스 변경을 처리하세요. 다운로드를 재개할 때, 마지막 부분 요청 이후 서버의 파일이 변경되었거나 삭제되었을 수 있습니다. 이전 버전에서 유효하던 범위가 더 짧거나 다른 파일에서는 유효하지 않게 됩니다. 재개 전에 리소스 크기를 다시 확인하세요.

Range 헤더를 제거하세요. 부분 콘텐츠가 필요하지 않다면 Range 헤더를 빼고 리소스 전체를 요청하세요. 그러면 서버가 완전한 본문과 함께 200을 반환합니다.

브라우저 캐시를 지우세요. 브라우저가 부분 응답을 캐시해 두었다가 이후 방문에서 유효하지 않은 범위 요청을 만드는 경우가 있습니다. 캐시를 지우면 새로운 전체 요청이 강제됩니다.

서버 측 고려 사항. 일부 서버 설정은 범위 요청을 지원하는 리소스 유형을 제한합니다. 대상 리소스의 응답에 서버가 Accept-Ranges: bytes를 보내는지 확인하세요. Accept-Ranges: none이 있다면 서버가 해당 리소스에 대해 부분 요청을 전혀 지원하지 않는 것입니다.

미디어 로딩 실패

브라우저의 동영상·오디오 플레이어는 미디어 파일을 스트리밍하기 위해 범위 요청을 보냅니다. 재생 중 발생하는 416 오류는 플레이어가 파일 경계를 넘는 바이트 범위를 요청했다는 뜻입니다. 이는 플레이어가 오래된 Content-Length 값을 들고 있는 사이 미디어 파일이 더 짧은 버전으로 교체되었을 때 일어납니다. 페이지를 새로고침하면 플레이어가 범위를 요청하기 전에 현재 파일 크기를 다시 가져옵니다.

코드 참고

.NET

HttpStatusCode.RequestedRangeNotSatisfiable

Rust

http::StatusCode::RANGE_NOT_SATISFIABLE

Rails

:range_not_satisfiable
:requested_range_not_satisfiable

Go

http.StatusRequestedRangeNotSatisfiable

Symfony

Response::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE

Python3.5+

http.HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE

Java

HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE

Angular

@angular/common/http/HttpStatusCode.RangeNotSatisfiable