우클릭방지

글 목록

2017년 7월 28일 금요일

[HTTP 프로토콜 강좌]#14 HTTP 요청 헤더 IV - Range, If-Range, If-Unmodified-Since


1. Range

클라이언트(웹브라우저)는 서버가 제공하는 컨텐츠에서 일부분을 다시 요청하거나 갱신할 필요가 있을 수 있다.  예컨대 스트리밍같은 동영상 데이터일 경우 총 5분짜리 영상인데.. 처음부터 2분까지만 먼저 다운받은 경우가 그럴수 있다.
다시 다운로드를 받으려 할때, 굳이 0 ~ 2분까지 데이터를 다시 받을 필요는 없지 않겠는가?

다른 경우로는 웹서버에서 특정 파일을 다운로드 하고 있는 중 여러가지 이유로 다운로드가 완료되지 못하고 중간에 끊어지는 경우가 있을 수 있다.
이 역시 처음부터 다시 받기 보다는 중간에 다운로드가 끊긴 시점부터 다시 받으면 효율적이다.

위와 같은 경우 Range 헤더를 사용하게 된다.

동작 흐름도를 보면 다음과 같다.




  1. 클라이언트는 웹서버에게 200~400 bytes 에 해당하는 데이터를 달라고 요청
  2. 웹서버는 "206 Partial Content" 라는 상태코드 메시지와 함께 요청한 200~400 바이트에 해당하는 데이터를 전달함.





2. If-Range

If-Range 헤더는 헤더의 값으로 ETag 정보를 표시한다.
눈치챘을수도 있는데 ETag 정보를 활용하기 때문에 If-Range 헤더는 캐시관련 헤더라고 볼수 있다.
캐시라는 동작은 항상 웹서버에서 제공하는 컨텐츠의 유효성을 체크해야 한다.
내가 저장하고 있는 컨텐츠가 지금도 웹서버에서 제공하는 컨텐츠와 같을까? 라는 고민을 늘 해야만 하는 기능이다.

위 Range 헤더 설명에서 Range 헤더가 사용되는 예를 알아봤었다.
거기에 살을 좀 더 붙여서 다음을 가정해 보자.

웹서버에서 어떤 프로그램 설치 파일을 다운로드 받고 있었는데.. 어떤 이유에서인지는 모르겠으나 다운로드가 중간에 끊겼다.
그런데 일이 생겨서 지금 당장은 아니고 몇시간 뒤 또는 다음날 다시 받아야 한다.
시간이 조금 지나고 나서 다시 다운로드를 받으려고 하니 웹서버에서 제공하는 동일한 이름의 파일이 똑같은 녀석인지 궁금해졌다. 버젼이 업그레이드 되었을 수 있기도 하니까 말이다.

이 경우라면 어떤 동작이 필요할까?

웹서버에게 중간에 다운로드가 끊어졌던 파일이 이건데.. 다시 줄수 있냐고 물어볼 필요가 있지 않을까?
다시 줄수 있다면.. 동일한 파일이 존재하는 것이고... 그렇지 않다면 파일이 변경되었기 때문에 새로운 파일로 전달할 필요가 있다.

If-Range 헤더가 없는 경우라면.. If-Match를 사용해서 동일한 컨텐츠인지를 먼저 확인해야 할 것이다. 다음 동작 흐름을 참고해보자.


웹서버에서 컨텐츠 변경이 없는 경우는 뭐 특이점이 없으나.. 컨텐츠 변경이 있는 경우는 좀 복잡해진다. 하나의 컨텐츠를 전달받기 위해서 총 2번의 요청, 2번의 응답이 상호 교환된다.



바로 이점을 개선하고자 사용하는 헤더가 If-Range 헤더이다.
If-Range 헤더를 사용하게 되면 한번의 요청으로 모든 처리가 가능해 진다.

웹서버는 If-Range 헤더를 받게 되면, 컨텐츠가 변경된 경우는 새로운 컨텐츠 전체를 전달하고 변경되지 않은경우는 Range 헤더의 값에 해당되는 데이터만 전달하게 된다.

다음 동작흐름을 보자.


컨텐츠 변경이 없는 경우는 위 If-Match 사용했을 때와 당연히 같으나, 컨텐츠가 변경된 경우는 처리 과정이 절반으로 줄어든것을 볼수 있다.

* 참고: 웹서버에서 ETag 를 지원하지 않는 경우가 있을 수 있다. 이경우 If-Range 헤더의 값으로 클라이언트는 If-Modified-Since와 같이 Last-Modified 의 시간 정보를 기재한다. 이때는 표시되는 정보 형태만 다를 뿐 동작은 같다. 

If-Modfied-Since와 Last-Modified 에 대한 내용은 다음 강좌를 참고하기 바란다.
[HTTP 프로토콜 강좌]#13 HTTP 요청 헤더 III - If-Match, If-Modified-Since, If-None-Match



3. If-Unmodified-Since

헤더 이름에서 알수 있듯이 If-Modified-Since 헤더의 반대 의미이다.
If-Modified-Since 는 변경되었는지를 체크하는 것이고, If-Unmodified-Since 는 변경되지 않았는지를 체크하는 것이다.


  • If-Modified-Since (변경된 경우 중심) 
    • 컨텐츠 변경 시 : 200 OK 메시지와 함께 신규 컨텐츠 전송
    • 컨텐츠 미 변경 시 : 304 Not Modified 와 함께 페이로드 미전송


  • If-Unmodified-Since (변경되지 않은 경우 중심)
    • 컨텐츠 변경 시 : 412 Precondition Failed 에러 메시지 전달
    • 컨텐츠 미 변경 시 : 200 OK 와 함께 전체 데이터 전송



If-Unmodified-Since 는 PUT 메소드를 이용해서 웹서버의 컨텐츠를 수정하려 할때 사용하면 좋을것도 같다. 변경되지 않은 올드한 컨텐츠의 내용을 바꾸려고 할때 올드한 컨텐츠인지 아닌지를 체크하는 과정에서 활용될 수 있을것 같다.


오늘은 Max-forwards와 Meter에 대해서도 정리를 좀 하려 했으나, 내용이 좀 많을 것같아서 이 포스팅은 여기서 마무리 하려 한다.

끝!



댓글 없음:

댓글 쓰기