- If-Range 헤더를 포함한 HTTP 요청 헤더는 범위 요청을 조건적으로 만듬
- 조건이 만족된다면, 서버에서 206 Partial Content 응답과 범위 요청의 데이터를 HTTP 바디(body) 포함하여 전송
- 조건을 만족하지 못한다면, 200 OK 상태 코드가 전체 리소스와 함께 반송됨
- 다운로드를 재시작하거나, 저장된 리소스가 마지막 조각을 다운받은 후 수정되었는지 확인하는 경우 많이 사용
- ETag 정보를 활용하기 때문에 If-Range 헤더는 캐시관련 헤더임
- 캐시라는 동작은 항상 웹서버에서 제공하는 컨텐츠의 유효성을 체크해야 함 → 저장하고 있는 컨텐츠가 지금도 웹서버에서 제공하는 컨텐츠와 같은지 체크 필요
- If-Range 헤더는 Last-Modified 유효 검사자, 또는 ETag와 함께 사용될 수 있지만, 동시에 사용은 불가
- 웹서버에서 ETag를 지원하지 않는 경우도 있음
- ETag를 지원하지 않는 경우에 If-Range 헤더의 값으로 클라이언트는 If-Modified-Since 헤더와 같이 Last-Modified 시간 정보를 기재 → ETag를 사용하지 못하지만, 기능에는 차이가 없음
If-Range 헤더가 사용되는 예시 상황
- 웹서버에서 어떤 프로그램 설치 파일을 다운로드 받고 있었는데, 알 수 없는 이유로 다운로드가 중간에 중단됨
- 당장 다운받을 수 없는 환경이라, 몇시간 뒤 다운 받아야하는 상황이 발생함
- 시간이 지나고 나서 다시 다운로드를 받으려고 하니 웹서버에서 제공하는 동일한 이름의 프로그램이 이전에 다운받는 것과 같은것인지 확인할 필요가 있음
- 멈춰있는 동안 프로그램의 버전이 업그레이드된 경우에는 이름이 같아도 내용이 다름
- 웹서버에게 중간에 다운로드가 끊어졌던 프로그램에 관련한 정보를 웹 서버에 전달해 주면, 웹 서버가 같은지 다른지 판단하여 프로그램을 전달
- 동일한 프로그램이 존재하는 경우에는 계속 다운받을 수 있는 것이고, 다른 프로그램이라면 프로그램이 변경되었기에 새로운 프로그램을 다운받아야함
If-Range 헤더가 없는 경우, If-Match 헤더를 사용해서 동일한 컨텐츠인지 확인하고 프로그램 다운로드 진행
- 웹서버에 컨텐츠 변경이 없는 경우에는 If-Match 헤더를 사용하여도 큰 이상은 없음 -> 같은 컨텐츠기에 프로그램을 연속해서 다운 가능
- 웹 서버에 컨텐츠 변경이 있는 경우는 복잡해짐 → 하나의 컨텐츠를 전달받기 위해서 총 2번의 요청, 2번의 응답이 상호 교환 필요
If-Match 헤더의 문제를 개선하기 위해 If-Range 헤더 사용
- If-Range 헤더를 사용하게 되면 한번의 요청으로 모든 처리가 가능
- 웹서버는 If-Range 헤더를 받게 되면, 컨텐츠가 변경된 경우는 새로운 컨텐츠 전체를 전달
- 웹서버는 If-Range 헤더를 받게 되면, 컨텐츠가 변경되지 않은경우는 Range 헤더의 값에 해당되는 데이터만 전달
- 컨텐츠 변경이 없는 경우는 If-Range 헤더는 If-Match 헤더를 사용했을 때와 같으나, 컨텐츠가 변경된 경우에 If-Range 헤더는 If-Match 헤더보다 처리 과정이 절반으로 줄어듬
If-Range 헤더 참고 사진
문법
If-Range: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
If-Range: <etag>
지시자
1. <etag>
- 개체 태그는 요청한 리소스가 유일한 것을 표현
- ASCII 문자열로 쌍따옴표("675af34563dc-tr34"처럼)로 묶여있음
- 접두사로 W/가 있어 약한 비교 알고리즘을 사용되어야 하는 것을 표시
- If-Range 헤더 사용 예제
If-Range: Wed, 21 Oct 2015 07:28:00 GMT
2. <day-name>
- "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 또는 "Sun" 중 하나가 표시
- 대소문자 구분
3. <day>
- 날짜
- 두 글자로 표시
- 예시 : "04" 또는 "23"
4. <month>
- "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 중 하나가 표시
- 대소문자 구분
5. <year>
- 연도
- 네 글자로 표시
- 예시 : "1990" 또는 "2016"
6. <hour>
- 시간
- 두 글자로 표시
- 예시 : "09" 또는 "23"
7. <minute>
- 분
- 두 글자로 표시
- 예시 : "04" 또는 "59"
8. <second>
- 초
- 두 글자로 표시
- 예시 : "04" 또는 "59"
9. GMT
- 그리니치 표준시
- HTTP 날짜는 현지 시각이 아닌, 언제나 GMT로 표현
'HTTP > HTTP 헤더' 카테고리의 다른 글
HTTP 프로토콜 Keep-Alive 헤더 (0) | 2022.06.25 |
---|---|
HTTP 프로토콜 If-Unmodified-Since헤더 (0) | 2022.06.25 |
HTTP 프로토콜 If-None-Match 헤더 (0) | 2022.06.25 |
HTTP 프로토콜 If-Modified-Since헤더 (0) | 2022.06.25 |
HTTP 프로토콜 If-Match 헤더 (0) | 2022.06.25 |