[HTTP] 프록시캐시 및 캐시무효화
✔ 캐시 제어 헤더
- 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 기본 동작
- 캐시 서버 요청 (no-cache + ETag)
- 프록시 캐시 서버에 간다
- 프록시 서버는 no-cache를 보고 원 서버에 요청을 한다
- 원 서버 검증 후 응답을 내려준다 (304 Not modified)
순간 네트워크 단절
- 순간 네트워크 단절이 있을 경우 오래된 데이터를 보여주도록 설정이 가능
- 즉, 오류보다는 프록시 서버에 존재하는 데이터를 보여준다는 의미
must-revalidate 기본 동작
- 웹 서버에 접근할 수 없는 경우, 항상 오류가 발생해야 함
- 504 Gateway Timeout (매우 중요한 돈과 관련된 결과를 생각)
- 만약 오래된 통장 잔고를 보여주게 된다면 큰 문제가 될 수 있다
참고 자료
댓글남기기