2017년 8월 22일 화요일

[HTTP 프로토콜 강좌]#22 HTTP 엔티티 헤더 II - Expires, Last-Modified


오늘은 HTTP 엔티티 헤더 두번째 시간이다.
엔티티헤더는 첫번째 시간에 거의 모든 내용을 다룬 터라 오늘은 내용이 많지 않다.

가벼운 마음으로 아래 내용을 살펴 보시고, 지금껏 강의한 HTTP 헤더의 내용들을 정리하시면 좋겠다.

첫 강좌를 시작한게 6월 말이었는데, 어느덧 두달째가 되어간다.
오늘까지 전체 내용 중 2/3 정도를 진행한것 같다.

1. Expires

캐시서버은 디스크 또는 메모리와 같은 자신의 저정영역에 저장한 컨텐츠들에 대해선 유효성을 고민해야 한다.
실제적으로 클라이언트에게 직접 전달해되 되는지 또는 그렇지 않은지에 대한 판단을 늘 해야 하며, 제공된 컨텐츠는 항상 서비스에 유효한 것이어야 한다.

캐시서버가 이러한 판단을 할 수 있게끔 도움을 주는 HTTP 헤더가 몇가지 있는데, Expires 헤더가 그 중 하나이다.

Expires 헤더는 단어 뜻 그대로 컨텐츠의 유효기간이라고 이해하면 좋다.

유통되는 우유나 음료/식품등에 유통기간이 적혀 있고, 그 기간을 넘어가게 되면 식품의 변질을 의심해야 한다.

캐시서버가 캐싱하고 있는 (저장하고 있는) 컨텐츠 역시 마찬가지이다.
Expires 헤더에 명시되어 있는 기간이 지나게 되면, 더 이상 유효한지 아닌지를 실제 웹서버에서 확인해야 한다.

Expires 헤더의 값은 시간정보를 포함한 날짜 정보이다.
아래가 그 예이다.

Expires: Mon, 21 Aug 2017 09:00:05 GMT

만약 웹서버가 제공하는 컨텐츠가 캐싱되지 않기를 원한다면, Expires 헤더의 값을 응답하는 Date 헤더의 값과 같거나 지난 날짜를 설정해서 전달하면 된다.

이전 강좌의 Cache-Control 부분에서 max-age 값의 의미를 설명할 때, Expires 를 이야기 한적이 있다.
다시 간단히 정리하면.. Cache-Control은 HTTP 1.1에서 등장한 헤더이다. Expires 와 Cache-Control 헤더의 max-age가 같이 사용된 경우에는 Cache-Control 헤더가 먼저 적용된기 때문에 Expires 헤더가 무시될 수 있다.

Cache-Control 의 max-age 내용을 자세히 알고 싶다면 여기 를 클릭한다.




2. Last-Modified

웹서버에 있는 컨텐츠가 내용이 변경된 경우 컨텐츠의 생성/수정 시간이 변경된 시점으로 바뀐다. 이는 서버만 알고 있는 정보이긴한데.. 클라이언트가 변경된 컨텐츠를 요청한 경우 HTTP 헤더에 이 날짜정보(시간 포함)를 표시하여 캐시서버나 클라이언트에게 알린다.

Last-Modified 헤더는 주로 If-Modified-Since 헤더와 같이 사용된다.
이 두 헤더 정보를 통해 캐시서버가 현재 캐싱하고 있는 컨텐츠를 제공할지 아니면 웹서버에 있는 오리지널 컨텐츠를 제공할지 결정하기도 한다.

아래는 이에 대한 동작 흐름 그림이다.


먼저, 최초 요청에 대한 설명이다.
위그림에서..


  1. 클라이언트가 최초 요청을 보낸다. 
  2. 프록시서버는 그 요청을 받고 자신이 캐싱한 컨텐츠를 확인해 본다.
    캐싱한 컨텐츠가 없으니 실제 웹서버로 요청을 전달한다.
  3. 웹서버가 요청한 컨텐츠에 대한 응답을 한다.
    응답 시 컨텐츠의 생성/수정 시간을 참고하여 Last-Modified 헤더에 기록한 후 전달한다.
  4. 캐시서버 역시 컨텐츠를 캐싱한 후 클라이언트에게 전달한다. 




같은 요청을 다시 한 경우이다.




  1. 클라이언트가 같은 요청을 다시 한다. 
  2. 캐시서버가 유효성 확인을 위해 캐싱한 이미지의 Last-Modified 헤더의 시간정보를 참고하여 If-Modified-Since 헤더에 기록한 후 요청한다. 
  3. 실제 웹서버는 If-Modified-Since 헤더의 시간정보를 참고해보니 그때 이후 변경된 바가 없음을 확인한다.
    캐싱하고 있는 컨텐츠를 사용해도 좋다는 의미의 "304 Not Modified" 메시지를 전달한다. 
  4. 캐시서버는 자신이 캐싱하고 있는 컨텐츠를 그대로 전송한다. 

이상 끝~

여기까지 해서 HTTP 헤더 내용을 모두 다뤄봤다. 
나름 어렵지 않게 설명하려 애 썼는데, 다들 어떻게 느끼셨는지 모르겠다. 
의견이 있으시면 댓글로 주시면 좋겠다. 적극적으로 반영하여 강좌 내용의 질을 높일수 있게 하겠다. 






아!!!!

HTTP 헤더를 이야기 하면서 아래와 같이 4가지 HTTP 헤더를 다뤘었다. 

  1. 요청 헤더 (Request Header)
  2. 응답 헤더 (Response Header)
  3. 일반 헤더 (General Header)
  4. 엔티티 헤더 (Entity Header)
요청헤더, 응답헤더는 명확해서 알겠는데, 일반헤더는 뭐고, 엔티티 헤더는 뭐지?? 
이 두개는 요청이나 응답에 들어 가는 거니까.. 거기에 두면 안되나? 

이런 생각을 가진 분이 계시리라... 나도 그랬으니까~.. ㅎ

이 내용을 간단히.... 정말 간단히 정리하고 오늘 포스팅을 마친다. 
  • 요청헤더 : 요청메시지에서만 확인할 수 있는 헤더
  • 응답헤더 : 응답메시지에서만 확인할 수 있는 헤더
  • 일반헤더 : 요청/응답 모두에서 확인할 수 있는 헤더
  • 엔티티헤더 : 본문(메시지 바디)에 관련된 HTTP 헤더, 따라서 응답헤더에서 확인 됨

이제 HTTP 보안에 관련된 내용 그리고 HTTP 가속에 관련된 내용이 남았다. 
조금만 더 가면 된다. 힘을 내자. ^^


댓글 없음:

댓글 쓰기