2 분 소요

✔ 캐시 제어 헤더

  • Cache-Control
    • 캐시 제어
  • Pragma
    • 캐시 제어(하위 호환)
  • Expires
    • 캐시 유효 기간(하위 호환)

Cache-Control (캐시 지시어)

Cache-Control:
  - HTTP 1.1에서 추가된 기능으로, 여러 캐싱 정책을 다양하게 제공
  - 최근에는 ETag와 Cache-Control을 사용하여 컨텐츠 캐싱을 수행하는 추세다
  • max-age
    • 캐시 유효 시간, 초 단위
    • 예를 들어 60 _ 60 = 3600을 입력하면 한 시간, 3600 _ 24 = 86400을 입력하면 하루동안 캐시 유지
    • 이후엔 서버에 요청한 뒤 304 응답을 받을 때에만 캐시를 이용한다
  • no-cache
    • 캐시가 유효한지 확인하기 위해 매번 원 서버에 요청을 보낸다
    • 여기서 원 서버라는 말은, 프록시 서버(중간 캐시 서버)가 아닌 정보 제공 서버를 의미
  • no-store
    • 캐시를 하게 되면 하드 디스크에 저장이 되는데, no-store는 어떤 요청도 캐시로 저장하지 않는다는 의미
    • 데이터에 민감한 정보가 있으므로, 저장하면 안됨 (메모리에서 사용하고 최대한 빨리 삭제)

no-cache와 no-store는 사용 방식이 서로 다르다?

  • no-cache는 캐시를 저장하기는 하지만 매번 원 서버에 질의
  • no-store는 캐시를 아예 저장하지 않는 것이다 (저장이 되면 안되는 정보)

완벽한 캐싱 방지?

Cache-Control: no-cache, no-store, must-revalidate
  • 완벽한 캐싱 방지를 위해 Cache-Control 헤더를 위 같이 지정 해준다
  • must-revalidate는 신선하지 않은 사본을 원 서버와의 최초의 재검사 없이는 제공해서는 안된다
    • 즉, 원 서버의 갱신된 데이터와 프록시 서버의 데이터를 비교 후
    • 차이가 있을 경우 504 Gateway Timeout을 뱉는다

Pragma 캐시 제어(하위 호환)

  • Pragma: no-cache
  • HTTP 1.0 하위 호환
  • 현재는 거의 사용되지 않음

Expires 캐시 만료일 지정(하위 호환)

  • expires: Mon, 01 Jan 1990 00:00:00 GMT
  • 캐시 만료일을 정확한 날짜로 지정
  • HTTP 1.0부터 사용
  • 지금은 더 유연한 Cache-Control: max-age 권장
  • Cache-Control: max-age와 함께 사용하면 Expires는 무시

검증 헤더와 조건부 요청 헤더

  • 검증 헤더 (Validator)
    • ETag: “v1.0”, ETag: “asid93jkrh2l”
    • Lsdy-Modified: Thu, 04 Jun 2020 07:19:24 GMT
  • 조건부 요청 헤더
    • If-Match, If-None-Match: ETag 값 사용
    • If-Modified-Since, If-Unmodified-Since: Last-Modified 값 사용

✔ 원 서버의 접근

원 서버 접근:
  - 한국에 있는 여러 클라이언트가 미국 서버에 접근을 하는 경우
  - 이미지, HTML 등등 데이터를 제공해주는 원서버
  - 원 서버 앞에 프록시 캐시 서버를 둔다 (AWS CDN Service)
  • 원 서버란 진짜 서버, orgin 서버라 한다
  • 웹 브라우저에서 미국에 있는 서버에 접근하기 위해서는 시간이 걸린다
  • 이 때, 프록시 캐시 서버를 도입하여 한국 어딘가에 구축해둔다

Cache-Control 캐시 지시어(directives) - 기타

  • public
    • 응답이 public 캐시에 저장되어도 된다
  • private
    • 응답이 해당 사용자만을 위한 것임, private 캐시에 저장해야 함 (기본값)
    • 로컬에만 저장이 되어야 한다는 의미
    • 기본은 private
  • s-maxage
    • 프록시 캐시에만 적용되는 max-age
  • Age: 60(HTTP 헤더)
    • 오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간(초)

public vs private?

Cache-Control: private
Cache-Control: public
  • public: 응답이 어떤 캐시에 의해서든 캐시되어도 좋다는 의미를 가르킨다
  • private: 응답이 단일 사용자를 위한 것이며 공유 캐시에 의해 저장되지 않아야 한다는 의미

✔ Cache-Control

  • Cache-Control
    • 캐시 무효화를 위해 아래 명령어를 사용해야 한다
    • no-cache, no-store, must-revalidate
  • Pragma
    • no-cache
    • HTTP 1.0 하위 호환

no-cache

  • 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용(이름에 주의)

no-store

  • 데이터에 민감한 정보가 있으므로, 저장하면 안됨

must-revalidate

  • 캐시 만료 후 최초 조회시 원 서버에 검증해야함
  • 원 서버 접근 시 반드시 오류가 발생해야함 - 504(Gateway Timeout)
  • must-revalidate는 캐시 유효 시간이라면 캐시를 사용함

✔ no-cache vs must-revalidate

no-cache 기본 동작

  1. 캐시 서버 요청 (no-cache + ETag)
  2. 프록시 캐시 서버에 간다
  3. 프록시 서버는 no-cache를 보고 원 서버에 요청을 한다
  4. 원 서버 검증 후 응답을 내려준다 (304 Not modified)

순간 네트워크 단절

  • 순간 네트워크 단절이 있을 경우 오래된 데이터를 보여주도록 설정이 가능
  • 즉, 오류보다는 프록시 서버에 존재하는 데이터를 보여준다는 의미

must-revalidate 기본 동작

  • 웹 서버에 접근할 수 없는 경우, 항상 오류가 발생해야 함
  • 504 Gateway Timeout (매우 중요한 돈과 관련된 결과를 생각)
  • 만약 오래된 통장 잔고를 보여주게 된다면 큰 문제가 될 수 있다

참고 자료

댓글남기기