-
캐시 제어 응답 헤더 설정 :: 마이구미HTTP 2017. 4. 19. 10:35반응형
이번 글은 캐시 제어에 관련된 응답 헤더들을 다뤄본다.
"HTTP 완벽 가이드" 책과 stackoverflow의 관련 글들을 참고하여 작성하였다.
Cache-Control: no-cache, no-store, must-revalidate
위와 같은 헤더들을 통해 캐시를 막을 수 있다.
알고 있었다면, 분명 헤더들의 의미 또한 알고 있을 것이다.
그렇다면 왜 굳이 3가지 모두를 명시해줘야하는가? 의미를 알고 있다면, 의미상 no-store 만을 명시해줘도 되지 않는가?
그렇다면 왜 3가지 모두 명시해줘야하는가?에 대한 의문이 들어, 알아본 결과를 통해 글을 작성하게 되었다.
의문을 해결하기에 앞서, 차근차근 살펴보겠다.
캐시는 불필요한 데이터 전송을 줄임으로써, 많은 효과를 주게 된다.
하지만 웹 개발에 있어, 목적 또는 특정 페이지에는 캐시를 필요치 않을 수 있다.
이러한 경우에 우리는 캐시를 막기 위한 설정을 할 수 있다.
설정을 위한 방법을 우선순위대로 나열해보겠다.
- Cache-Control: no-store 헤더를 응답에 첨부할 수 있다.
- Cache-Control: no-cache 헤더를 응답에 첨부할 수 있다.
- Cache-Control: must-revalidate 헤더를 응답에 첨부할 수 있다.
- Cache-Control: max-age 헤더를 응답에 첨부할 수 있다.
- Expires 날짜 헤더를 응답에 첨부할 수 있다.
- 아무 만료 정보도 주지 않고, 캐시가 스스로 체험적인(휴리스틱) 방법으로 결정하게 할 수 있다.
설정 방법들을 하나씩 살펴보자.
no-store
캐시가 그 응답의 사본을 만드는 것을 금지한다.
no-cache
응답은 로컬 캐시 저장소에 저장될 수 있다.
다만 먼저 서버와 재검사를 하지 않고서는 캐시에서 클라이언트로 제공될 수 없다.
Max-Age
신선하다고 간주되었던 문서(만료되지 않은 문서)가 서버로부터 온 이후로 흐른 시간이고, 초로 나타낸다.
ex) Cache-Control: max-age=3600
Expires
초 단위의 시간 대신 실제 만료 날짜를 명시한다.
더 이상 사용하지 않기를 권하는 헤더이다.
ex) Expires: Fri, 05 Jul 2002, 05:00:00 GMT
Must-Revalidate
신선하지 않은 사본을 원 서버와의 최초의 재검사 없이는 제공해서는 안 된다는 것을 의미한다.
* no-cache와 must-revalidate는 재검사를 거쳐 응답을 하는 공통점이 있지만, 재검사 주기가 차이점이 된다.
If a response is cacheable for 10 seconds, then
must-revalidate
kicks in after 10 seconds, whereasno-cache
impliesmust-revalidate
after 0 seconds.no-cache는 매번 재검사를 하고, must-revalidate는 최초에 재검사를 한다.
응답을 10초 동안 캐시할 수 있다면, 10초 후에 다시 재검사. no-cache 0초라고 생각하면 된다.
응답 헤더들의 의미를 알았으니, 이제는 본인이 언급한 의문에 대해 해결해보자.
캐시를 막기 위한 헤더 설정은 아래와 같은 설정이 정확하다.
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
위와 같은 설정을 하는 이유부터 설명하자면, 모든 클라이언트 및 프록시에서 동작하기 위함이다.
위 설정을 예를 들어 설명해보겠다.
Cache-Control : 클라이언트와 프록시에 대한 HTTP 1.1 스펙에 따라 필요하다.
Pragma : 오래된 클라이언트에 대한 HTTP 1.0 스펙에 따라 필요하다.
Expires : HTTP 1.1에서는 Expires보다 Cache-Control이 우선순위가 높기 때문에, HTTP 1.0 프록시에서만 사용된다.
IE6를 고려하지 않는다면 Cache-Control: no-cache 생략해도 된다.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Pragma는 언급했듯이, HTTP 1.0를 위함으로써, HTTP 1.0을 고려하지 않는다면, Pragma를 생략해도 된다.
Cache-Control: no-store, must-revalidate
Expires: 0
Expires는 언급했듯이, HTTP 1.0 프록시를 위함으로써, 고려하지 않는다면 생략해도 된다.
Cache-Control: no-store, must-revalidate
위와 같이 타겟이 되는 클라이언트와 프록시에서 동작을 하기 위해서, 응답 헤더를 설정하게 된다.
현재 네이버의 오픈 API의 응답 헤더는 아래와 같다.
Cache-Control: no-cache, no-store, must-revalidate
Pramga: no-cache자세한 사항은 아래 링크들은 더욱 상세한 정보를 얻을 수 있다.
각 언어를 통해 헤더 설정을 알고 싶었다면, 언어별로 헤더 설정법 또한 알려주니 참고하길 바란다.
혹시나 잘못된 정보가 있다면, 댓글을 통해 알려주길 바란다.
캐시 제어 && 본인이 언급한 의문을 해결하기 위한 자료
http://stackoverflow.com/questions/49547/how-to-control-web-page-caching-across-all-browsers
no-cache, must-revalidate 차이점
http://stackoverflow.com/questions/18148884/difference-between-no-cache-and-must-revalidate
반응형'HTTP' 카테고리의 다른 글
OSI 7계층 모델 :: 마이구미 (0) 2017.12.23 REST API를 위한 HTTP 상태 코드 :: 마이구미 (0) 2017.10.10 Proxy server 왜 사용하는가? :: 마이구미 (1) 2017.04.07 HTTP 커넥션 관리 :: 마이구미 (0) 2017.03.30 URI vs URL vs URN :: 마이구미 (6) 2017.03.25