캐시란
Q.) 캐시는
장치
인가데이터
인가? CacheData가 임시장소(장치)에 저장된 데이터 아닐까?
A1.) 웹 캐시는 장치, 캐시에 저장되는 것이 캐시데이터 이다. 따라서 예상한 것이 맞다.
A Web cache (or HTTP cache) is a system for optimizing the World Wide Web. (출처 : https://en.wikipedia.org/wiki/Web_cache)
A2.) 웹 캐시는 자주 쓰이는 문서의 사본을 자동으로 보관하는 HTTP 장치이다. (출처:HTTP완벽가이드 7장)
캐시 미적용 시
캐시 적용 시
클라이언트 & 서버간 의사과정
출처:https://thisblogfor.me/web/http/cache/
# 기존데이터가 서버에서 변경되지 않은 경우에도 데이터를 다시 다운로드 받는 것은 낭비이다. 이 낭비를 제거하기 위해선 기존데이터의 변경 여부를 먼저 확인할 필요가 있다. 이때 확인하는 수단이 검증 헤더
와 조건부 요청 헤더
이다.
캐시에 사본 요청이 왔을 시,
Q.) '신선도검사'와 '재검사' 라는 두 용어는 다른 의미 아닌가?
서적에는 '이러한 신선도 검사를 http 재검사라고 부른다' 라고 되어 있는데 (https://thisblogfor.me/web/http/cache/) 해당 블로그의 순서도와 설명에는 Freshness check와 Revalidation을 구분하고 있다.
A.) 캐시 장치에서 요청받은 데이터가 최신의 것인지를 검사하는 것도, 원서버에 해당 데이터가 최신의 것인지 묻는 것도 모두 freshness를 check하는 것(신선도 검사) 임에는 변함 없는 것 같다. 다만 캐시장치가 아닌, 원서버와 소통하여 검증하는 것은 Revalidation 이라고 일컫는 것 같다.
출처 : https://docs.trafficserver.apache.org/en/latest/admin-guide/configuration/cache-basics.en.html?highlight=http%20proxy
정리하자면,
Q.) 응답 속도 비교 3번과 4번 어떤게 더 빠를까..? 캐시의 신선도 검사가 필요없이 바로 원서버에 컨텐츠를 응답받는 3번이 더 빠를 것 같다고 예상한다.
A.)
특징
특징
Last-Modified & If-Modified-Since 의 단점
특징
Q) Last-Modified와 ETag가 함께 사용된다면 어떤 것이 더 우선순위가 높은가?
A) HTTP 1.1에서는 하위 호환되므로 1.0의 header를 사용하여도 정상 동작하지만 중복으로 선언된다면 1.1에 정의된 것이 우선순위를 가지게 됩니다. 예를 들어 Last-Modified와 Etag가 동시에 있다면 Etag가 우선순위를 가집니다. (답변 출처: https://cyberx.tistory.com/9)
According to RFC 2616 – section 13.3.4, an HTTP 1.1 Client MUST use the ETag in any cache-conditional requests, and if both an ETag and Last Modified are present, it SHOULD use both.(답변 출처 : https://stackoverflow.com/questions/824152/what-takes-precedence-the-etag-or-last-modified-http-header)
The ETag header is considered astrong validator
unless explicitly declared weak by the server, whereas the Last Modified header is consideredweak
unless at least a minute difference exists between it and the Date header.
RFC 2616 – 섹션 13.3.4에 따르면, HTTP 1.1 클라이언트는 캐시 조건 요청에서 반드시 ETag를 사용해야 하며, ETag와 Last Modified가 모두 존재할 경우 둘 다 사용해야 합니다.
ETag 헤더는 서버에 의해 명시적으로 약하다고 선언되지 않는 한 강력한 검증자로 간주되는 반면, Last Modified 헤더는 날짜 헤더와 최소 1분의 차이가 없는 한 약하다고 간주됩니다.
결론 : ETag의 우선순위가 더 높다. 둘다 존재할 경우 둘다 사용해야 한다.
Q.) Last-Modified 에서 약한 검사기를 이용하려면 어떻게 요청을 보내야 하는가?
Last-Modified: W/"<date>"
위와 같이 요청해야 하는가? MDN에는 관련내용이 없는 것 같다...
A.)
304 not modified
If-Modified-Since: <캐시 사본 마지막 수정date>
If-None-Match: <tags>
// 예시
If-None-Match: "v3.2"
If-None-Match: "v3.2", "v3.3", "v3.4"
종류
# 참고할 링크 : 캐시제어 응답헤더 설정 : 마이구미
# 우선순위가 높은 순으로 정리
캐시 지시어 | 요청 / 응답 헤더 | 비고 |
---|---|---|
Cache-Control: no-store | 모두 가능 | |
Cache-Control: no-cache | 모두 가능 | |
Cache-Control: must-revalidate | 응답 | |
Cache-Control: max-age | 응답 |
Cache-Control: max-age=425985
Q) 의미가 없는 짓이라는 MDN 문서를 확인했다. 해석하자면 이론적으로 지시어들이 중복될 경우 가장 제한적인 지시어가 적용된다. 따라서 [Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate] 를 해봤자 [Cache-Control: no-store] 와 동일하다는 내용이다. (관련링크: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#preventing_storing)
# 소름..누군가 해당 내용을 이미 질문했었다. 다음은 김영한 님이 답변하신 내용이다. (관련링크:https://www.inflearn.com/questions/112647)
A) no-store만으로 캐시가 무효화 되어야 하는 것이 맞습니다. 그런데 HTTP 스펙이라는 것이 모든 상황을 완벽하게 정의했으면 좋겠지만, 디테일하게 들어가면 모호한 부분들이 존재합니다.
예를 들어서 웹 브라우저에서 앞으로가기, 뒤로가기를 했을 때도 이것을 캐시로 볼 것인가? 이때는 no-store만 보고 판단할 것인가? no-cache를 보고 판단할 것인가? HTTP 1.1을 지원하지만 조금 오래된 브라우저와의 호환, 그리고 버그 수 많은 프록시 캐시 업체들과 그 구현 서버 등등..
이런 문제들 때문에 no-store만으로 해결하지는 못하고, 나머지 옵션들도 함께 사용하게 됩니다. 그래서 구글이나 네이버 등 주요 메이저 사이트의 응답을 보면 cache-control: no-cache, no-store, must-revalidate를 함께 가져갑니다.
결론 : no-store 만으로 캐시가 되면 안되는 데이터를 캐시무효화 되어야 하는 것이 맞다. 그러나, 앞으로가기/뒤로가기/서버문제/운영체제의 시간 수동변경 등 다양한 문제들 때문에 no-store 만으로는 해결이 안 될 수 있다.
추가 참고 링크 : https://stackoverflow.com/questions/49547/how-do-we-control-web-page-caching-across-all-browsers
How do we control web page caching, across all browsers?
Our investigations have shown us that not all browsers respect the HTTP cache directives in a uniform manner. For security reasons we do not want certain pages in our application to be cached, eve...
stackoverflow.com