• 캐시 제어 응답 헤더 설정 :: 마이구미
    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, whereas no-cache implies must-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

    반응형

    댓글 1

    • ㅇㅇ 2021.04.01 10:02

      브라우저에 따라 저 옵션으로도 캐싱을 막을 수 없는 경우가 꽤 있습니다. 저 옵션보다 cache-control: no-store이면 대부분 브라우저에서 캐싱을 막을 수 있습니다.

Designed by Tistory.