Warum sollten in der HTTP-Antwort sowohl No-Cache als auch No-Store verwendet werden?

120

Ich soll verhindern, dass Benutzerinformationen verloren gehen. Nur "kein Cache" als Antwort reicht nicht aus. "no-store" ist ebenfalls erforderlich.

Cache-Control: no-cache, no-store

Nachdem ich diese Spezifikation http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html gelesen habe , bin ich mir immer noch nicht ganz sicher, warum.

Mein derzeitiges Verständnis ist, dass es nur für Zwischen-Cache-Server ist. Selbst wenn "kein Cache" antwortet, kann der Zwischen-Cache-Server den Inhalt dennoch in einem nichtflüchtigen Speicher speichern. Der Zwischen-Cache-Server entscheidet, ob der gespeicherte Inhalt für die folgende Anforderung verwendet wird. Wenn jedoch "no-store" in der Antwort enthalten ist, soll der Zwischen-Cache-Server den Inhalt nicht speichern. Es ist also sicherer.

Gibt es einen anderen Grund, warum wir sowohl "No-Cache" als auch "No-Store" benötigen?

Morgan Cheng
quelle
3
no-cachebedeutet nicht, was Sie denken, dass es tut. Eigentlich bedeutet es "bitte revalidieren".
Erwan Legrand

Antworten:

77

Ich muss klarstellen, dass no-cachedas nicht bedeutet , nicht zwischenzuspeichern . Tatsächlich bedeutet dies "erneut mit Server validieren", bevor bei jeder Anforderung eine zwischengespeicherte Antwort verwendet wird.

must-revalidateAuf der anderen Seite muss nur erneut validiert werden, wenn die Ressource als veraltet betrachtet wird.

Wenn der Server angibt, dass die Ressource noch gültig ist, kann der Cache mit seiner Darstellung antworten, wodurch die Notwendigkeit verringert wird, dass der Server die gesamte Ressource erneut sendet.

no-storeist effektiv die vollständige Nicht-Cache- Direktive und soll verhindern, dass die Darstellung in irgendeiner Form von Cache gespeichert wird.

Ich sage was auch immer, aber beachte dies in der RFC 2616 HTTP-Spezifikation:

Verlaufspuffer KÖNNEN solche Antworten als Teil ihres normalen Betriebs speichern

Dies wird jedoch in der neueren RFC 7234-HTTP-Spezifikation weggelassen, um möglicherweise zu versuchen, no-storestärker zu werden, siehe:

http://tools.ietf.org/html/rfc7234#section-5.2.1.5

Luke Puplett
quelle
18
Beantworten Sie die Frage immer noch nicht: Warum sollten sowohl No-Cache als auch No-Store in der HTTP-Antwort verwendet werden? Ist das nicht Cache-Control: no-storegenug
Franklin Yu
Gibt es Unterschiede zwischen Browsern? Weil dieser Artikel von Microsoft docs.microsoft.com/en-us/iis/configuration/system.webServer/… nicht einmal erwähnt no-storeund beschreibt, no-cacheals ob es überhaupt kein Caching gibt ... Ich bin verwirrt!
Roel
Alconjas Antwort ist speziell die Antwort auf die Frage. Als ich antwortete, tat ich dies nur, um eine sehr häufige Mikrokonzeption zu klären. Bitte stimmen Sie die andere Antwort ab!
Luke Puplett
48

Unter bestimmten Umständen speichert IE6 Dateien auch dann zwischen, wenn sie Cache-Control: no-cachesich in den Antwortheadern befinden.

Die W3C-Staaten vonno-cache :

Wenn die Direktive ohne Cache keinen Feldnamen angibt, darf ein Cache die Antwort NICHT verwenden, um eine nachfolgende Anforderung ohne erfolgreiche erneute Validierung mit dem Ursprungsserver zu erfüllen.

Wenn Sie in meiner Anwendung eine Seite mit dem no-cacheHeader besucht, sich dann abgemeldet und dann in Ihrem Browser zurückgeschlagen haben, hat IE6 die Seite weiterhin aus dem Cache abgerufen (ohne eine neue / validierende Anforderung an den Server). Durch Hinzufügen des no-storeHeaders wurde dies gestoppt. Aber wenn Sie das W3C beim Wort nehmen, gibt es tatsächlich keine Möglichkeit, dieses Verhalten zu kontrollieren:

Verlaufspuffer KÖNNEN solche Antworten als Teil ihres normalen Betriebs speichern.

Allgemeine Unterschiede zwischen dem Browserverlauf und dem normalen HTTP-Caching werden in einem bestimmten Unterabschnitt der Spezifikation beschrieben .

Alconja
quelle
7
Wenn Sie in Ihrem Browser zurückschlagen, greift IE6 die Seite nicht aus dem Cache ab. Die Seite wird aus dem Verlaufspuffer abgerufen.
Pacerier
1
In Chrome 34 (2014) muss dies ebenfalls festgelegt no-storewerden. Andernfalls zeigt Chrome zwischengespeicherte / gepufferte Daten an, wenn Sie die Schaltfläche "Zurück" verwenden.
Caw
4
-1, weil der erste Satz fälschlicherweise impliziert, dass es für einen Browser falsch ist, eine Antwort mit einem no-cacheHeader zwischenzuspeichern. Das unmittelbar unten stehende W3C-Zitat macht deutlich, dass dies nicht der Fall ist. Der no-cacheHeader bedeutet lediglich, dass die Antwort erneut validiert werden muss, bevor sie für nachfolgende Anforderungen wiederverwendet wird.
Mark Amery
1
Der Wortlaut der Spezifikation wurde von RFC1616 auf die aktuelle Version der Spezifikation ( tools.ietf.org/html/rfc7230 RFC-Familie) verbessert . eine Familie, weil es 6 RFCs sind. Sie sind veraltet 2616.
Arcin B
16

Aus der HTTP 1.1-Spezifikation :

No-Store :

Der Zweck des No-StoreDie Richtlinie soll verhindern, dass vertrauliche Informationen versehentlich freigegeben oder aufbewahrt werden (z. B. auf Sicherungsbändern). Die No-Store-Direktive gilt für die gesamte Nachricht und kann entweder in einer Antwort oder in einer Anfrage gesendet werden. Wenn ein Cache in einer Anfrage gesendet wird, darf er weder einen Teil dieser Anfrage noch eine Antwort darauf speichern. Wenn eine Antwort gesendet wird, darf ein Cache KEINEN Teil dieser Antwort oder der Anforderung, die sie ausgelöst hat, speichern. Diese Anweisung gilt sowohl für nicht gemeinsam genutzte als auch für gemeinsam genutzte Caches. "DARF NICHT speichern" bedeutet in diesem Zusammenhang, dass der Cache die Informationen NICHT absichtlich im nichtflüchtigen Speicher speichern darf und nach besten Kräften versucht werden muss, die Informationen nach der Weiterleitung so schnell wie möglich aus dem flüchtigen Speicher zu entfernen. Auch wenn diese Richtlinie mit einer Antwort verbunden ist, Benutzer können eine solche Antwort explizit außerhalb des Caching-Systems speichern (z. B. mit einem Dialogfeld "Speichern unter"). Verlaufspuffer KÖNNEN solche Antworten als Teil ihres normalen Betriebs speichern. Der Zweck dieser Richtlinie besteht darin, die angegebenen Anforderungen bestimmter Benutzer und Dienstautoren zu erfüllen, die über versehentliche Freigaben von Informationen über unerwartete Zugriffe auf Cache-Datenstrukturen besorgt sind. Obwohl die Verwendung dieser Richtlinie in einigen Fällen die Privatsphäre verbessern kann, weisen wir darauf hin, dass dies in keiner Weise ein zuverlässiger oder ausreichender Mechanismus zur Gewährleistung der Privatsphäre ist. Insbesondere böswillige oder kompromittierte Caches erkennen diese Anweisung möglicherweise nicht oder befolgen sie nicht, und Kommunikationsnetzwerke sind möglicherweise anfällig für Abhören. Verlaufspuffer KÖNNEN solche Antworten als Teil ihres normalen Betriebs speichern. Der Zweck dieser Richtlinie besteht darin, die angegebenen Anforderungen bestimmter Benutzer und Dienstautoren zu erfüllen, die über versehentliche Freigaben von Informationen über unerwartete Zugriffe auf Cache-Datenstrukturen besorgt sind. Obwohl die Verwendung dieser Richtlinie in einigen Fällen die Privatsphäre verbessern kann, weisen wir darauf hin, dass dies in keiner Weise ein zuverlässiger oder ausreichender Mechanismus zur Gewährleistung der Privatsphäre ist. Insbesondere böswillige oder kompromittierte Caches erkennen diese Anweisung möglicherweise nicht oder befolgen sie nicht, und Kommunikationsnetzwerke sind möglicherweise anfällig für Abhören. Verlaufspuffer KÖNNEN solche Antworten als Teil ihres normalen Betriebs speichern. Der Zweck dieser Richtlinie besteht darin, die angegebenen Anforderungen bestimmter Benutzer und Dienstautoren zu erfüllen, die über versehentliche Freigaben von Informationen über unerwartete Zugriffe auf Cache-Datenstrukturen besorgt sind. Obwohl die Verwendung dieser Richtlinie in einigen Fällen die Privatsphäre verbessern kann, weisen wir darauf hin, dass dies in keiner Weise ein zuverlässiger oder ausreichender Mechanismus zur Gewährleistung der Privatsphäre ist. Insbesondere böswillige oder kompromittierte Caches erkennen diese Anweisung möglicherweise nicht oder befolgen sie nicht, und Kommunikationsnetzwerke sind möglicherweise anfällig für Abhören. Obwohl die Verwendung dieser Richtlinie in einigen Fällen die Privatsphäre verbessern kann, weisen wir darauf hin, dass dies in keiner Weise ein zuverlässiger oder ausreichender Mechanismus zur Gewährleistung der Privatsphäre ist. Insbesondere böswillige oder kompromittierte Caches erkennen diese Anweisung möglicherweise nicht oder befolgen sie nicht, und Kommunikationsnetzwerke sind möglicherweise anfällig für Abhören. Obwohl die Verwendung dieser Richtlinie in einigen Fällen die Privatsphäre verbessern kann, weisen wir darauf hin, dass dies in keiner Weise ein zuverlässiger oder ausreichender Mechanismus zur Gewährleistung der Privatsphäre ist. Insbesondere böswillige oder kompromittierte Caches erkennen diese Anweisung möglicherweise nicht oder befolgen sie nicht, und Kommunikationsnetzwerke sind möglicherweise anfällig für Abhören.

Backslash17
quelle
1
Wenn Sie die Anforderung bereits nicht zwischenspeichern, würde dies dann nicht bereits die Speicherung der Antwort auf nichtflüchtigen Medien verhindern?
Lèse Majesté
4
@ Lèsemajesté Meistens nicht. no-cacheund max-age=0sagen, dass der Gegenstand als abgestanden anzusehen ist. Dies bedeutet, dass es vor dem Servieren erneut validiert werden muss. Dies bedeutet, dass ein Cache die Datei speichern und dann eine bedingte Anforderung ausführen kann, auf die der Server antworten kann 304 NOT MODIFIED. Dies ist offensichtlich ein großer Vorteil, da der Hauptteil der Antwort nicht generiert und gesendet werden muss. Also nutzen Sie diese viele ( die meisten?) Caches wird speichern no-cacheAntworten.
Kevin Cox
14

Wenn Sie jegliches Caching verhindern möchten (z. B. ein erneutes Laden erzwingen, wenn Sie die Zurück-Taste verwenden), benötigen Sie:

  • Kein Cache für IE

  • No-Store für Firefox

Hier gibt es meine Informationen dazu:

http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

HttpWatchSupport
quelle
6
Warum würde No-Store für Internet Explorer nicht ausreichen? Dein Blog-Beitrag erklärt es nicht.
Simon Lieschke
1
Über welche IE-Version sprichst du?
Pacerier
1
@ Pacerier, wahrscheinlich war die IE-Version die neueste, als er / sie den Kommentar schrieb. Laut Wikipedia war dies IE7. Für FF sieht es nach 3 aus. Auch nicht viele Leute benutzen es noch.
Tryse
11

no-storesollte in normalen Situationen nicht erforderlich sein und kann sowohl die Geschwindigkeit als auch die Benutzerfreundlichkeit beeinträchtigen. Es ist für die Verwendung vorgesehen, bei der die HTTP-Antwort Informationen enthält, die so vertraulich sind, dass sie niemals in einen Festplatten-Cache geschrieben werden sollten, unabhängig von den negativen Auswirkungen, die für den Benutzer entstehen.

Wie es funktioniert:

  • Selbst wenn ein Benutzeragent wie ein Browser feststellt, dass eine Antwort nicht zwischengespeichert werden soll, wird sie normalerweise aus internen Gründen des Benutzeragenten im Festplatten-Cache gespeichert. Diese Version kann für Funktionen wie "Quelltext anzeigen", "Zurück", "Seiteninformationen" usw. verwendet werden, bei denen der Benutzer die Seite nicht unbedingt erneut angefordert hat, der Browser sie jedoch nicht als neue Seitenansicht betrachtet und es wäre sinnvoll, dieselbe Version bereitzustellen, die der Benutzer gerade anzeigt.

  • Durch no-storedie Verwendung wird verhindert, dass diese Antwort gespeichert wird. Dies kann sich jedoch auf die Fähigkeit des Browsers auswirken, "Quelltext anzeigen", "Zurück", "Seiteninformationen" usw. anzugeben, ohne eine neue, separate Anforderung für den Server zu stellen, was unerwünscht ist. Mit anderen Worten, der Benutzer versucht möglicherweise, die Quelle anzuzeigen. Wenn der Browser sie nicht im Speicher aufbewahrt, wird ihm entweder mitgeteilt, dass dies nicht möglich ist, oder es wird eine neue Anforderung an den Server gesendet. Daher no-storesollte nur verwendet werden, wenn die eingeschränkte Benutzererfahrung dieser Funktionen, die nicht ordnungsgemäß oder schnell funktioniert, durch die Wichtigkeit aufgewogen wird, sicherzustellen, dass Inhalte nicht im Cache gespeichert werden.

Mein derzeitiges Verständnis ist, dass es nur für Zwischen-Cache-Server ist. Selbst wenn "kein Cache" antwortet, kann der Zwischen-Cache-Server den Inhalt dennoch in einem nichtflüchtigen Speicher speichern.

Das ist falsch. Zwischen-Cache-Server, die mit HTTP 1.1 kompatibel sind, befolgen die Anweisungen no-cacheund must-revalidateund stellen sicher, dass der Inhalt nicht zwischengespeichert wird. Durch die Verwendung dieser Anweisungen wird sichergestellt, dass die Antwort nicht von einem Zwischencache zwischengespeichert wird und dass alle nachfolgenden Anforderungen an den Ursprungsserver zurückgesendet werden.

Wenn der Zwischen-Cache-Server HTTP 1.1 nicht unterstützt, müssen Sie Pragma: no-cachedas Beste verwenden und darauf hoffen. Beachten Sie, dass HTTP 1.1 no-storeohnehin irrelevant ist , wenn es nicht unterstützt wird.

thomasrutter
quelle
3
Verstehe ich etwas falsch, weil mnot.net/cache_docs/#CACHE-CONTROL Ihnen widerspricht. Es heißt, dass no-cachedie starre Aktualität erhalten bleibt, ohne alle Vorteile des Cachings zu beeinträchtigen. Dies bedeutet, dass der Cache gespeichert und erneut verwendet wird, wenn der Server mit 304 Not Modified antwortet.
Pacerier
-1: Kein Cache bedeutet nicht, dass der Inhalt nicht zwischengespeichert werden kann. In 14.9.1 Was ist zwischenspeicherbar? In der Spezifikation heißt es: "Wenn die Direktive ohne Cache keinen Feldnamen angibt, darf ein Cache die Antwort NICHT verwenden, um eine nachfolgende Anforderung ohne erfolgreiche erneute Validierung mit dem Ursprungsserver zu erfüllen." ( w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9. ) Wie Chris Shiflett erklärt, "hindert es ein Caching-System nicht daran, eine zwischengespeicherte Kopie zu behalten. Es erfordert lediglich, dass das Caching-System seinen Cache zuvor erneut validiert um es an den Kunden zurückzusenden. " (HTTP Developer's Handbook, S. 91)
james.garriss
Ich glaube nicht, dass das, was ich in dieser Antwort geschrieben habe, einen dieser beiden Kommentare zusammenfasst - ich habe einfach nicht darüber gesprochen, wie Browser erneut validiert werden (z. B. mit If-Modified-Since / If-None-Match), weil ich es nicht so gesehen habe relevant. Ich habe nicht einmal versucht zu beschreiben, wofür No-Cache gedacht ist, daher habe ich Schwierigkeiten zu verstehen, wie sich der Kommentar von @ james.garriss auf meine Antwort bezieht.
Thomasrutter
7

Wenn ein Caching-System No-Store korrekt implementiert, benötigen Sie keinen No-Cache. Aber nicht alle tun es. Darüber hinaus implementieren einige Browser No-Cache, als wäre es No-Store. Obwohl dies nicht unbedingt erforderlich ist, ist es wahrscheinlich am sichersten, beide einzuschließen.

james.garriss
quelle
Aber nicht alle tun es. „Wir brauchen ein konkretes Beispiel, um meinen Kollegen zu überzeugen.
Franklin Yu
Dieser Kommentar wurde vor 6 Jahren abgegeben. Sie müssen das aktuelle Verhalten von Caching-Servern überprüfen, um festzustellen, was sie tun.
James.garriss
6

Beachten Sie, dass Internet Explorer von Version 5 bis 8 einen Fehler auslöst, wenn Sie versuchen, eine Datei herunterzuladen, die über https und die vom Server gesendeten Cache-Control: no-cacheoder Pragma: no-cacheHeader bereitgestellt wird .

Siehe http://support.microsoft.com/kb/812935/en-us

Die Verwendung von Cache-Control: no-storeund Pragma: privatescheint das Nächste zu sein, was noch funktioniert.

Bassim
quelle
2
Wie in einer verwandten SO-Antwort vorgeschlagen , können Sie Cache-Control: no-store, no-cache, must-revalidategenau diese Reihenfolge festlegen , damit es funktioniert. In unserem Szenario hat dies jedoch nicht funktioniert, aber was @bassim oben vorgeschlagen hat, hat funktioniert. Vielen Dank!
Eirik H
6

Bei Chrome wird No-Cache verwendet, um die Seite bei einem erneuten Besuch neu zu laden. Sie wird jedoch weiterhin zwischengespeichert, wenn Sie in den Verlauf zurückkehren (Schaltfläche "Zurück"). Verwenden Sie no-store, um die Seite auch für den Verlauf zurückzuladen. IE muss erneut validiert werden, um in allen Fällen funktionieren zu können.

Nur um sicherzugehen, dass ich alle Fehler und Fehlinterpretationen vermeide, die ich immer benutze

Cache-Control: no-store, no-cache, must-revalidate

wenn ich sicherstellen will, dass es neu geladen wird.

woens
quelle
2

Ursprünglich haben wir vor vielen Jahren No-Cache verwendet und sind mit bestimmten Browsern auf einige Probleme mit veralteten Inhalten gestoßen ... Erinnern Sie sich leider nicht an die Einzelheiten.

Wir hatten uns seitdem NUR für die Nutzung von No-Store entschieden. Habe seitdem nie mehr zurückgeschaut oder hatte ein einziges Problem mit veralteten Inhalten durch einen Browser oder Vermittler.

Dieser Raum wird sicherlich von der Realität der Implementierungen im Vergleich zu dem, was zufällig in verschiedenen RFCs geschrieben wurde, dominiert. Insbesondere viele Proxies neigen dazu zu glauben, dass sie die Leistung besser verbessern können, indem sie die Richtlinien, die sie befolgen sollen, durch ihre eigenen ersetzen.

Einstein
quelle
Ich glaube, es ist Firefox, der das früher bevorzugt hat no-store.
Bvdb
-1

OWASP diskutiert dies:

Was ist der Unterschied zwischen den Cache-Steueranweisungen: No-Cache und No-Store?

Die No-Cache-Direktive in einer Antwort gibt an, dass die Antwort nicht zur Zustellung einer nachfolgenden Anforderung verwendet werden darf, dh der Cache darf keine Antwort anzeigen, für die diese Anweisung im Header festgelegt ist, sondern muss den Server die Anforderung bedienen lassen. Die No-Cache-Direktive kann einige Feldnamen enthalten. In diesem Fall kann die Antwort aus dem Cache angezeigt werden, mit Ausnahme der angegebenen Feldnamen, die vom Server bereitgestellt werden sollen. Die No-Store-Direktive gilt für die gesamte Nachricht und gibt an, dass der Cache keinen Teil der Antwort oder Anforderung, die danach gefragt hat, speichern darf.

Bin ich mit diesen Richtlinien absolut sicher?

Nein. Verwenden Sie jedoch im Allgemeinen sowohl Cache-Control: No-Cache, No-Store als auch Pragma: No-Cache, zusätzlich zu Expires: 0 (oder einem ausreichend rückwirkenden GMT-Datum wie der UNIX-Epoche). Nicht-HTML-Inhaltstypen wie PDF, Word-Dokumente, Excel-Tabellen usw. werden häufig zwischengespeichert, selbst wenn die oben genannten Cache-Steueranweisungen festgelegt sind (obwohl dies je nach Version und zusätzlicher Verwendung von must-revalidate, pre-check = 0, post-check unterschiedlich ist = 0, max-age = 0 und s-maxage = 0 können in der Praxis manchmal zumindest zum Löschen von Dateien beim Schließen des Browsers führen, in einigen Fällen aufgrund von Browser-Macken und HTTP-Implementierungen. Mit der Funktion "Autocomplete" kann ein Browser außerdem alles zwischenspeichern, was der Benutzer in ein Eingabefeld eines Formulars eingibt. Um dies zu überprüfen, sollte das Formular-Tag oder die einzelnen Eingabe-Tags das Attribut 'Autocomplete = "Off"' enthalten. Jedoch,

Quelle hier .

Jan Żankowski
quelle
Das ist falsch. no-cachesagt, dass Sie es nicht verwenden können, ohne mit dem Server zu validieren . Wenn Ihre zwischengespeicherte Kopie immer noch gut ist, antwortet der Server mit einem 304 und Sie verwenden dann Ihre zwischengespeicherte Kopie. Spart Ihnen einen potenziell großen Netzwerk-Download. no-storeAuf der anderen Seite heißt es, dass Sie die Daten überhaupt nicht zwischenspeichern dürfen.
Gargoyle