Für meinen Authentifizierungsprozess erstelle ich ein eindeutiges Token, wenn sich ein Benutzer anmeldet, und füge dieses in ein Cookie ein, das zur Authentifizierung verwendet wird.
Also würde ich so etwas vom Server senden:
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;
Welches funktioniert auf allen Browsern. Um dann ein Cookie zu löschen, sende ich ein ähnliches Cookie mit dem expires
für den 1. Januar 1970 festgelegten Feld
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;
Und das funktioniert gut in Firefox, löscht aber das Cookie in IE oder Safari nicht.
Was ist der beste Weg, um ein Cookie zu löschen (vorzugsweise ohne JavaScript)? Die Methode "Set-the-Expires-in-the-Past" scheint sperrig zu sein. Und warum funktioniert das auch in FF, aber nicht in IE oder Safari?
Antworten:
Wenn Sie denselben Cookie-Wert mit
; expires
angehängtem senden, wird das Cookie nicht zerstört.Machen Sie das Cookie ungültig, indem Sie einen leeren Wert festlegen und auch ein
expires
Feld einfügen:Beachten Sie, dass Sie nicht alle Browser zwingen können, ein Cookie zu löschen. Der Client kann den Browser so konfigurieren, dass das Cookie auch dann bestehen bleibt, wenn es abgelaufen ist. Das Einstellen des Werts wie oben beschrieben würde dieses Problem lösen.
quelle
"deleted"
später Verwechslungen mit einem potenziell legalen Wert zu vermeiden, der gleich "gelöscht" istfoo=bar; domain=www.example.com
wird beispielsweise ein anderes Cookiefoo=qux; domain=.example.com
verwendet.Zum Zeitpunkt des Schreibens dieser Antwort scheint die akzeptierte Antwort auf diese Frage zu besagen, dass Browser kein Cookie löschen müssen, wenn sie ein Ersatz-Cookie erhalten, dessen
Expires
Wert in der Vergangenheit liegt. Diese Behauptung ist falsch. Die EinstellungExpires
, in der Vergangenheit zu sein, ist die standardmäßige, spezifikationskonforme Methode zum Löschen eines Cookies. Benutzeragenten müssen diese spezifizieren.Die Verwendung eines
Expires
Attributs in der Vergangenheit zum Löschen eines Cookies ist korrekt und dient zum Entfernen von Cookies, die von der Spezifikation vorgegeben werden. Im Beispielabschnitt von RFC 6255 heißt es:Der Abschnitt Anforderungen an Benutzeragenten enthält die folgenden Anforderungen, die zusammen dazu führen, dass ein Cookie sofort gelöscht werden muss, wenn der Benutzeragent ein neues Cookie mit demselben Namen erhält, dessen Ablaufdatum in der Vergangenheit liegt
Die obigen Punkte 11-3, 11-4 und 12 bedeuten zusammen, dass beim Empfang eines neuen Cookies mit demselben Namen, derselben Domäne und demselben Pfad das alte Cookie gelöscht und durch das neue Cookie ersetzt werden muss. Schließlich schreibt der folgende Punkt über abgelaufene Cookies weiter vor, dass das neue Cookie danach auch sofort gelöscht werden muss. Die Spezifikation bietet Browsern in diesem Punkt keinen Spielraum. Wenn ein Browser dem Benutzer die Option bietet, den Ablauf von Cookies zu deaktivieren, wie aus der akzeptierten Antwort hervorgeht, dass dies bei einigen Browsern der Fall ist, verstößt dies gegen die Spezifikation. (Eine solche Funktion hätte auch wenig Sinn und ist meines Wissens in keinem Browser vorhanden.)
Warum hat das OP dieser Frage dann beobachtet, dass dieser Ansatz fehlgeschlagen ist? Obwohl ich eine Kopie von Internet Explorer nicht abgestaubt habe, um das Verhalten zu überprüfen, vermute ich, dass dies daran lag, dass der
Expires
Wert des OP fehlerhaft war! Sie haben diesen Wert verwendet:Dies ist jedoch in zweierlei Hinsicht syntaktisch ungültig.
Der Syntaxabschnitt der Spezifikation schreibt vor, dass der Wert des
Expires
Attributs a sein mussNach dem zweiten Link oben finden wir dies als Beispiel für das Format:
und finde, dass die Syntaxdefinition ...
erfordert, dass die Daten im Format Tag Monat Jahr geschrieben werden, nicht im Format Monat Tag Jahr Jahr , wie es vom Fragesteller verwendet wird.
Insbesondere definiert es
rfc1123-date
wie folgt:und definiert
date1
wie folgt:und
erlaubt nicht
UTC
als Zeitzone.Die Spezifikation enthält die folgende Aussage darüber, welche Zeitzonenversätze in diesem Format zulässig sind:
Wenn wir uns eingehender mit der ursprünglichen Spezifikation dieses Datetime-Formats befassen, stellen wir fest, dass in der ursprünglichen Spezifikation unter https://tools.ietf.org/html/rfc822 im Abschnitt Syntax "UT" (was "Universalzeit" bedeutet) aufgeführt ist. ) als möglicher Wert, listet jedoch nicht UTC (Coordinated Universal Time) als gültig auf. Soweit ich weiß, war die Verwendung von "UTC" in diesem Datumsformat nie gültig. es war kein gültiger Wert , wenn das Format erst im Jahr 1982 festgelegt wurde, und die HTTP - Spezifikation hat eine streng angenommen mehr restriktive Version des Formats durch das Verbot der Verwendung alles „Zone“ anderer Werte als „GMT“.
Wenn der Fragesteller hier stattdessen ein
Expires
Attribut wie dieses verwendet hat , dann:dann hätte es vermutlich geklappt.
quelle
Das Setzen von "läuft ab" auf ein vergangenes Datum ist die Standardmethode zum Löschen eines Cookies.
Ihr Problem liegt wahrscheinlich daran, dass das Datumsformat nicht konventionell ist. IE erwartet wahrscheinlich nur GMT.
quelle
Verwenden Sie Max-Age = -1 anstelle von "Expires". Die Syntax ist kürzer, weniger wählerisch, und Max-Age hat ohnehin Vorrang vor Expires.
quelle
Für die JAF-RS-Implementierung von GlassFish Jersey habe ich dieses Problem behoben, indem alle gängigen Parameter beschrieben werden. Mindestens drei der Parameter müssen gleich sein: Name (= "Name"), Pfad (= "/") und Domäne (= Null):
Und verwenden Sie es auf die übliche Weise, um Cookies zu setzen:
und um den Cookie zu löschen:
quelle
Max-Age
als das früheste darstellbare Datum und die früheste darstellbare Uhrzeit interpretieren. Servern ist es jedoch untersagt, einen solchenMax-Age
Wert zu senden . Ich denke, die Autoren wussten sowohl von vorhandenen Clients, die nicht damit umgehen konnten,Max-Age=0
als auch von Servern, die sie zum Zeitpunkt des Schreibens der Spezifikation gesendet hatten, und versuchten, das Problem von beiden Seiten zu lösen.