página - http cache
¿Por qué se deben usar tanto no-cache como no-store en la respuesta HTTP? (10)
De la especificación de HTTP 1.1 :
sin tienda :
El objetivo de la directiva de no almacenamiento es evitar la publicación inadvertida o la retención de información confidencial (por ejemplo, en cintas de respaldo). La directiva no-store se aplica a todo el mensaje, y PUEDE enviarse en una respuesta o en una solicitud. Si se envía en una solicitud, un caché NO DEBE almacenar ninguna parte de esta solicitud ni ninguna respuesta a la misma. Si se envía una respuesta, un caché NO DEBE almacenar ninguna parte de esta respuesta ni de la solicitud que la provocó. Esta directiva se aplica tanto a cachés compartidos como no compartidos. "NO DEBE almacenar" en este contexto significa que la memoria caché NO DEBE almacenar intencionalmente la información en un almacenamiento no volátil, y DEBE hacer un intento de mejor esfuerzo para eliminar la información del almacenamiento volátil tan pronto como sea posible después de reenviarla. Incluso cuando esta directiva se asocia con una respuesta, los usuarios pueden almacenar explícitamente dicha respuesta fuera del sistema de almacenamiento en caché (por ejemplo, con un cuadro de diálogo "Guardar como"). Los almacenamientos intermedios de historial PUEDEN almacenar dichas respuestas como parte de su operación normal. El objetivo de esta directiva es cumplir los requisitos establecidos de ciertos usuarios y autores de servicios que están preocupados por las versiones accidentales de información a través de accesos no anticipados a las estructuras de datos de caché. Si bien el uso de esta directiva puede mejorar la privacidad en algunos casos, advertimos que NO es de ninguna manera un mecanismo confiable o suficiente para garantizar la privacidad. En particular, las memorias caché maliciosas o comprometidas podrían no reconocer u obedecer esta directiva, y las redes de comunicaciones podrían ser vulnerables a las escuchas.
Me han dicho que evite que se filtre información del usuario, solo "no-caché" en respuesta no es suficiente. "no-store" también es necesario.
Cache-Control: no-cache, no-store
Después de leer esta especificación http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html , todavía no estoy muy seguro de por qué.
Mi comprensión actual es que es solo para el servidor de caché intermedio. Incluso si "no-cache" es en respuesta, el servidor de caché intermedio aún puede guardar el contenido en un almacenamiento no volátil. El servidor de caché intermedio decidirá si usa el contenido guardado para la siguiente solicitud. Sin embargo, si hay "no-store" en la respuesta, no se supone que el servidor de caché intermedio almacene el contenido. Por lo tanto, es más seguro.
¿Hay alguna otra razón por la que necesitamos tanto "no-cache" como "no-store"?
Debo aclarar que no-cache
no significa no caché . De hecho, significa "revalidar con el servidor" antes de usar cualquier respuesta en caché que pueda tener, en cada solicitud.
must-revalidate
, por otro lado, solo necesita volver a validar cuando el recurso se considera obsoleto.
Si el servidor dice que el recurso sigue siendo válido, la memoria caché puede responder con su representación, lo que alivia la necesidad de que el servidor reenvíe todo el recurso.
no-store
es efectivamente la directiva completa de no caché y está destinada a evitar el almacenamiento de la representación en cualquier forma de caché de cualquier tipo.
Digo lo que sea, pero tenga en cuenta esto en la especificación HTTP RFC 2616:
Los almacenamientos intermedios de historial PUEDEN almacenar dichas respuestas como parte de su operación normal
Pero esto se omite de la nueva especificación HTTP RFC 7234 en un intento potencial de hacer que no-store
se vuelva más fuerte, ver:
En determinadas circunstancias, IE6 aún almacenará en caché los archivos incluso cuando Cache-Control: no-cache
está en los encabezados de respuesta.
Los estados W3C de no-cache
:
Si la directiva no-cache no especifica un nombre de campo, entonces un caché NO DEBE utilizar la respuesta para satisfacer una solicitud posterior sin una revalidación exitosa con el servidor de origen.
En mi aplicación, si visitó una página con el encabezado no-cache
, luego se desconectó y luego volvió a llamar en su navegador, IE6 todavía tomaría la página del caché (sin una nueva solicitud de validación al servidor). Agregar en el encabezado " no-store
detuvo. Pero si toma el W3C en su palabra, en realidad no hay forma de controlar este comportamiento:
Los almacenamientos intermedios de historial PUEDEN almacenar dichas respuestas como parte de su operación normal.
Las diferencias generales entre el historial del navegador y el caché HTTP normal se describen en una subsección específica de la especificación .
En el caso de Chrome, no se utiliza la memoria caché para volver a cargar la página en una visita posterior, pero aún se almacena en la memoria caché si se vuelve al historial (botón Atrás). Para volver a cargar la página para el historial también, use la opción no almacenar. Las necesidades de IE deben revalidarse para funcionar en todas las ocasiones.
Así que solo para estar seguro de evitar todos los errores y malas interpretaciones que siempre uso
Cache-Control: no-store, no-cache, must-revalidate
si quiero asegurarme de que se vuelva a cargar.
Originalmente usamos no-cache hace muchos años y tuvimos algunos problemas con contenido obsoleto con ciertos navegadores ... No recuerdo los detalles desafortunadamente.
Desde entonces, nos habíamos decidido por el uso de no-store. Nunca ha mirado hacia atrás ni ha tenido un solo problema con contenido obsoleto por parte de ningún navegador o intermediario desde entonces.
Este espacio está ciertamente dominado por la realidad de las implementaciones frente a lo que sucede que se ha escrito en varias RFC. Muchos representantes, en particular, tienden a pensar que hacen un mejor trabajo al "mejorar el rendimiento" reemplazando la política que se supone que deben seguir con la suya.
Para empeorar las cosas, en algunas situaciones, no se puede usar la memoria caché, pero la tienda no puede:
http://faindu.wordpress.com/2008/04/18/ie7-ssl-xml-flex-error-2032-stream-error/
Si desea evitar todo el almacenamiento en caché (por ejemplo, forzar una recarga al usar el botón Atrás), necesita:
no-caché para IE
sin tienda para Firefox
Aquí está mi información sobre esto:
http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/
Si un sistema de caché implementa correctamente no-store, entonces no necesitaría no-cache. Pero no todos lo hacen. Además, algunos navegadores implementan no-cache como si no estuviera en la tienda. Por lo tanto, si bien no es estrictamente obligatorio, probablemente sea más seguro incluir ambos.
Tenga en cuenta que Internet Explorer desde la versión 5 hasta la 8 arrojará un error al intentar descargar un archivo servido a través de https y el servidor enviará Cache-Control: no-cache
o Pragma: no-cache
headers.
Ver http://support.microsoft.com/kb/812935/en-us
El uso de Cache-Control: no-store
y Pragma: private
parece ser lo más parecido que todavía funciona.
no-store no debería ser necesario en situaciones normales, y puede impedir la usabilidad si los navegadores realmente siguen las especificaciones tal como están escritas. Está destinado para ser utilizado cuando la respuesta HTTP contiene información tan delicada que nunca debería escribirse en un caché de disco, incluso si esto afecta la velocidad y la funcionalidad del navegador.
Cómo funciona:
Normalmente, incluso si un agente de usuario como un navegador determina que una respuesta no se puede cachar, aún puede almacenarla en el caché de disco por razones internas al agente de usuario. Todavía se puede utilizar para funciones como "ver fuente", "volver", "información de la página", etc., donde el usuario no ha solicitado necesariamente la página nuevamente, pero el navegador no la considera una nueva página vista .
El uso de la tienda evitará que eso suceda, pero puede afectar la capacidad del navegador de dar "vista de origen", "volver", "información de la página", etc. sin realizar una nueva solicitud para el servidor, lo cual es indeseable. En otras palabras, el usuario puede intentar ver la fuente y si el navegador no la mantuvo en la memoria, se le informará que esto no es posible o que se generará una nueva solicitud al servidor. Por lo tanto, la opción sin tienda solo se debe usar cuando la experiencia de usuario impedida de que estas funciones no funcionen correctamente o rápidamente no se ve compensada por la importancia de garantizar que el contenido no se almacene en la memoria caché.
Mi comprensión actual es que es solo para el servidor de caché intermedio. Incluso si "no-cache" es en respuesta, el servidor de caché intermedio aún puede guardar el contenido en un almacenamiento no volátil.
Esto es incorrecto. Los servidores de caché intermedios que siguen la especificación HTTP 1.1 obedecerán las instrucciones de no caché y deben revalidar (o revaluar proxy), asegurando que el contenido no se almacena en caché. El uso de estas dos instrucciones asegurará que la caché intermedia no almacene la respuesta y que todas las solicitudes subsiguientes se envíen de vuelta al servidor de origen.
Si el servidor de caché intermedio no admite HTTP 1.1, necesitará usar Pragma: no-cache y esperar lo mejor. Tenga en cuenta que si no es compatible con HTTP 1.1, entonces no-store es irrelevante de todos modos.