상세 컨텐츠

본문 제목

HTML WEB 웹 개발 각각 cache 유무 코드의 no-cache 캐시삭제, browser 가 caching 하지 않게 하는 http header 설정

프로그래밍 관련/웹

by AlrepondTech 2014. 11. 27. 10:34

본문

반응형
728x170

 

 

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

 

<meta http-equiv="Expires" content=0">

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">

 

 

<html>

 

<!-- code ....-->

 

</html>

 

 

 

HTML 제일 윗부분에 위와같이 설정을 해주자.

 

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

html no-cache

 

<META HTTP-EQUIV='Cache-Control' CONTENT='no-cache'>

<META HTTP-EQUIV='Pragma' CONTENT='no-cache'>

<META http-equiv="Expires" content="-1"> 

 

asp no-cache

 

<%

Response.CacheControl = "no-cache"

Response.AddHeader "Pragma", "no-cache"

Response.Expires = -1

%>

 

jsp no-cache

<%   

response.setHeader("Cache-Control","no-store");   

response.setHeader("Pragma","no-cache");   

response.setDateHeader("Expires",0);   

if (request.getProtocol().equals("HTTP/1.1")) 

        response.setHeader("Cache-Control", "no-cache"); 

%>   

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

출처: https://www.lesstif.com/pages/viewpage.action?pageId=20775788

 

 

로그인용 사용자 이름, 비밀번호 및 기타 민감한 정보들을 보호하기 위해 SSL 을 로그인 페이지나 회원 정보 페이지등은 SSL로 암호화하는 경우가 많다.

SSL 을 사용해서 민감한 정보들을 보호한다고 해도 브라우저에 이 정보가 캐싱되면 문제가 발생할 수 있다. (PC방이나 공공장소에서 사용후 캐슁으로 인해 개인 정보가 남는등..)

 

다음 http 헤더를 사용하면 브라우저 캐싱을 방지할 수 있다. 단 캐싱을 하지 않으면 성능 저하가 발생할 수 있으므로 로그인 페이지등에 제한적으로 사용해야 한다.

 

HTTP 1.1
Cache-Control: no-cache, no-store, must-revalidate
HTTP 1.0
Pragma: no-cache
Proxy
Expires: 0

 

PHP 

header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.
header('Expires: 0'); // Proxies.

Java Servlet

response.setHeader("Cache-Control""no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma""no-cache"); // HTTP 1.0.
response.setDateHeader("Expires"0); // Proxies.

 

Trouble Shooting

Ref

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

반응형

 

 

728x90

 

 

 

출처: http://mygumi.tistory.com/149

 

이번 글은 캐시 제어에 관련된 응답 헤더들을 다뤄본다.

"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



출처: http://mygumi.tistory.com/149 [마이구미의 HelloWorld]

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

반응형
그리드형


관련글 더보기

댓글 영역