• 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 헤더가 사용되는 예시 상황

  1. 웹서버에서 어떤 프로그램 설치 파일을 다운로드 받고 있었는데, 알 수 없는 이유로 다운로드가 중간에 중단됨
  2. 당장 다운받을 수 없는 환경이라, 몇시간 뒤 다운 받아야하는 상황이 발생함
  3. 시간이 지나고 나서 다시 다운로드를 받으려고 하니 웹서버에서 제공하는 동일한 이름의 프로그램이 이전에 다운받는 것과 같은것인지 확인할 필요가 있음
  4. 멈춰있는 동안 프로그램의 버전이 업그레이드된 경우에는 이름이 같아도 내용이 다름
  5. 웹서버에게 중간에 다운로드가 끊어졌던 프로그램에 관련한 정보를 웹 서버에 전달해 주면, 웹 서버가 같은지 다른지 판단하여 프로그램을 전달
  6. 동일한 프로그램이 존재하는 경우에는 계속 다운받을 수 있는 것이고, 다른 프로그램이라면 프로그램이 변경되었기에 새로운 프로그램을 다운받아야함


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로 표현

+ Recent posts