Caching [2] Use-Case

Falcon·2021년 8월 3일
1
post-thumbnail

Question

  1. Cache 는 로컬? 서버에?
  2. cache-control 헤더 Public vs Private Use-cases
  3. Cache Eviction 은 알아서? (max-age, expiration 기준?)
    (feat. Last Modified)

🎯 Goal

다음 HTTP Header를 살펴보고 캐싱동작 원리를 이해한다.

  • Etag
  • Last-Modified
  • Cache-Control
  • Expires

🤖 Mechanism

캐시를 어떻게 할 것인지는 브라우저에 달려있다 (서버랑 무관)

Etags

Entity Tag
서버는 리소스들의 해시값을 만들고 이 값을 response header 에 전달한다.
클라이언트는 최초 이외의 요청에서 이 etag 값을 If-None-Match 헤더 값에 담아 보내어 서버가 현재 가지고 있는 etag 값과 비교한다.
etag 값과 일치 👌 => Return 304 Not Modified with no resource
etag 값과 불일치 ✋ => Return 200 with new resource

Cache-Control: no-cache

브라우저가 모든 요청에If-None-Match 헤더에 etag값을 담아 보내 validation 하고자 할 때 (리소스에 변동이 없는지 EndPoint Server에 검사)

Last Modified

서버는 각 파일마다 Last Modified (최근 수정일)을 갖고있다.

브라우저가 If-Modified-Since: Thu, Jul 2021 23:11:05 GMT 를 보냈을 때 Last Modified와 비교하여 수정 여부를 판단한다. 이 과정을 Validation 이라한다.

Public vs Private

사실상 모든 브라우저 - ISP 사이에 이미 프록시 서버가 있으므로 클라이언트 -> 서버로의 요청에서 반드시 프록시를 거치게 되어있다. 이 프록시 서버에 저장되는 캐시를 Shared Cache (Public cache) 라고한다.

publicprivate
cache any request in Proxy Servercache only client local

그래서 어쩌라고?

Image, PDF 파일 같은 정적 콘텐츠는
Cache-Control: Public, max-age=86400 (매우 긴 수명), no eatag, no Last-Modified 로 지정하라.

⚠️ Warning

Chrome, Safari는 매번 no-cache 정책을 사용하여 EndPoint 에 If-None-Match 헤더를 보낸다.

🔗 Reference

best practices for cache control - medium

profile
I'm still hungry

0개의 댓글