[server] 416 Requested Range Not Satisfiable 에러란? 원인 및 해결방법
-
반응형
416 Requested Range Not Satisfiable: 원인과 해결 방법
1. 416 Requested Range Not Satisfiable란?
416 Requested Range Not Satisfiable는 클라이언트가 서버에 요청한 콘텐츠 범위가 유효하지 않을 때 반환되는 HTTP 상태 코드입니다. 예를 들어, 클라이언트가 요청한 파일의 크기보다 큰 범위를 지정하거나, 파일이 비어 있는 경우 이 오류가 발생합니다.
2. 주요 원인
유효하지 않은 Range 헤더: 요청 헤더에서 지정한 범위가 콘텐츠의 실제 크기를 초과한 경우.
빈 리소스: 요청한 파일이나 리소스가 비어 있을 때.
잘못된 요청: 클라이언트가 서버에 잘못된 형식의 Range 헤더를 보낸 경우.
3. 416 에러의 영향
이 에러는 클라이언트가 요청한 데이터를 정상적으로 수신할 수 없음을 나타냅니다. 다음과 같은 부정적인 영향을 미칠 수 있습니다:
파일 다운로드 실패: 요청한 파일의 특정 부분을 받을 수 없음.
미디어 스트리밍 문제: 스트리밍 중 필요한 범위를 가져오지 못함.
4. 해결 방법
1) 클라이언트 요청 수정
클라이언트가 서버에 올바른 Range 헤더를 보내야 합니다. 예를 들어:
Range: bytes=0-499
위 예제는 파일의 처음 500바이트를 요청하는 올바른 형식입니다.
2) 서버 설정 확인
서버가 Range 요청을 적절히 처리하도록 설정되어 있는지 확인합니다. 예를 들어:
Apache: EnableSendfile 및 Accept-Ranges 설정 확인.
Nginx: accept_ranges 설정이 활성화되어 있는지 확인.
3) 콘텐츠 유효성 확인
요청한 리소스가 실제로 존재하며, 요청 범위가 유효한지 확인합니다.
5. 예제 코드
Python Flask에서 Range 요청을 처리하는 예제:
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/file')
def download_file():
file_content = b"이것은 테스트 파일입니다." # 예제 파일
range_header = request.headers.get('Range', None)
if range_header:
byte_range = range_header.replace("bytes=", "").split("-")
start = int(byte_range[0])
end = int(byte_range[1]) if byte_range[1] else len(file_content) - 1
if start >= len(file_content):
return Response("Requested range not satisfiable", status=416)
return Response(file_content[start:end+1], status=206, headers={"Content-Range": f"bytes {start}-{end}/{len(file_content)}"})
return Response(file_content, status=200)
if __name__ == '__main__':
app.run(debug=True)