본문 바로가기

공부

[HTTP의 이해] 2. Conditional Get / Caching

Conditional Get

클라이언트는 이전에 한번 요청해서 돌려받은 리소스에 대해 다시 한번 요청을 할 때, 불필요한 트래픽을 줄이기위해 해당 리소스가 변경된 경우에만 다시 보내달라고 요청할 수 있다.

 

Cache는 언제 사용되는가

  • Conditional Get을 이용해 트래픽을 줄일 수는 있지만, Round Trip은 줄일 수 없다.
  • 어떤 리소스에 변경이 있었는지 확인하려면 반드시 Origin 서버에 요청을 보내고 응답이 올때까지 기다려야만 한다. (Origin 서버가 먼 곳에 있다면, 이 지연은 수백ms에 달할 수도 있다.)
  • 사용자가 오래 기다리지 않고 빨리 리소스를 받을 수 있게하고 싶다.

 

Response Header 중 expires, age, cache-control: max-age로 리소스의 caching 상태 확인 가능

Caching을 바라 보기 위해서 사용하는 헤더 : Last-Modified, ETag

Last-Modified, ETag 값이 같을 경우, 304 response

 

Last-Modified

  • Last-Modified는 Date보다 이후여서는 안된다. (MUST NOT)
  • Last-Modified는 Date를 계산한 시점과 최대한 가까운 시점에서 얻은 것이어야 한다. (SHOULD)
  • 서버는 가능한 항상 Last-Modified 헤더를 보내야 한다. (SHOULD)

- 요청 메시지

GET /index.html HTTP/1.1
If-Modified-Since: Sat, 2 Feb 2013, 20:30:00 GMT

 

- 응답 메시지

  • 최근 변경 일시가 클라이언트가 알고있던 것과 같은 경우의 응답 메시지
HTTP/1.1 304 NOT Modified
Date: Wed, 14 Feb 2013 06:25:24 GMT

 

  • 최근 변경 일시가 클라이언트가 알고있던 것과 다른 경우의 응답 메시지
HTTP/1.1 200 OK
Content-Length: 55
Contenty-Type: text/html; charset=UTF-8
Date: Wed, 14 Feb 2013 06:25:24 GMT
Last-Modified: Sun, 3 Feb 2013 16:00:00 GMT <- 새 최근 변경 일시

<body 생략>

 

ETag

  • Strong ETag : 리소스가 조금이라도 바뀌면 바뀌어야 한다.
  • Weak ETag : 리소스에 의미있는 수준의 변화가 없다면 바뀌지 않을 수 있다.

- 요청 메시지

GET /index.html HTTP/1.1
If-None-Match: "a6f305a"

 

- 응답 메시지

  • ETag가 클라이언트가 알고있던 것과 같은 경우의 응답 메시지
HTTP/1.1 304 NOT Modified
Date: Wed, 14 Feb 2013 06:25:24 GMT

 

  • ETag가 클라이언트가 알고있던 것과 다른 경우의 응답 메시지
HTTP/1.1 200 OK
Content-Length: 55
Contenty-Type: text/html; charset=UTF-8
Date: Wed, 14 Feb 2013 06:25:24 GMT
Etag: "abcde74" <- 새 ETag

<body 생략>

 

'공부' 카테고리의 다른 글

클린 코드 - 주석,포맷팅  (0) 2022.01.09
[HTTP의 이해] 1. 개요, HTTP 메소드, HTTP 상태 코드  (0) 2020.10.01