Set-Cookie header
Baseline
Weitgehend verfügbar
*
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.
Der HTTP-Set-Cookie-Antwort-Header wird verwendet, um ein Cookie vom Server an den Benutzer-Agent zu senden, damit der Benutzer-Agent es später an den Server zurücksenden kann. Um mehrere Cookies zu senden, sollten mehrere Set-Cookie-Header in derselben Antwort gesendet werden.
Warnung:
Browser blockieren den Zugriff von Frontend-JavaScript-Code auf den Set-Cookie-Header, wie es von der Fetch-Spezifikation gefordert wird, die Set-Cookie als verbotenen Antwort-Headernamen definiert, der herausgefiltert werden muss aus jeder Antwort, die dem Frontend-Code gezeigt wird.
Bei einer Fetch API oder XMLHttpRequest API-Anfrage, die CORS verwendet, ignorieren Browser die Set-Cookie-Header in der Serverantwort, es sei denn, die Anfrage enthält Anmeldeinformationen. Besuchen Sie Die Fetch API verwenden - Anmeldeinformationen einschließen und den XMLHttpRequest-Artikel, um zu erfahren, wie Sie Anmeldeinformationen einschließen können.
Weitere Informationen finden Sie im Leitfaden zu HTTP-Cookies verwenden.
| Header-Typ | Antwort-Header |
|---|---|
| Verbotener Anforderungs-Header | Nein |
| Verbotener Antwort-Header | Ja |
Syntax
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>
Set-Cookie: <cookie-name>=<cookie-value>; Partitioned
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure
// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
Attribute
-
Definiert den Cookie-Namen und seinen Wert. Eine Definition eines Cookies beginnt mit einem Namen-Wert-Paar.
Ein
<cookie-name>kann alle US-ASCII-Zeichen enthalten, außer Steuerzeichen (ASCII-Zeichen 0 bis 31 und ASCII-Zeichen 127) oder Trennzeichens (Leerzeichen, Tabulator und die Zeichen:( ) < > @ , ; : \ " / [ ] ? = { }).Ein
<cookie-value>kann optional in doppelte Anführungszeichen eingeschlossen werden und jedes US-ASCII-Zeichen enthalten, ausgenommen Steuerzeichen (ASCII-Zeichen 0 bis 31 und ASCII-Zeichen 127), Leerzeichen, doppelte Anführungszeichen, Kommata, Semikolons und Backslashes.Kodierung: Viele Implementierungen führen eine Prozent-Kodierung von Cookie-Werten durch. Dies ist jedoch nicht durch die RFC-Spezifikation erforderlich. Die Prozent-Kodierung hilft, die Anforderungen an die erlaubten Zeichen für
<cookie-value>zu erfüllen.Hinweis: Einige Cookie-Namen enthalten Präfixe, die bestimmte Einschränkungen für die Attribute des Cookies in unterstützenden Benutzer-Agenten auferlegen. Siehe Cookie-Präfixe für weitere Informationen.
Domain=<domain-value>Optional-
Definiert den Host, an den das Cookie gesendet wird.
Nur die aktuelle Domäne kann als Wert gesetzt werden oder eine Domäne höherer Ordnung, es sei denn, es handelt sich um ein öffentliches Suffix. Das Setzen der Domäne macht das Cookie sowohl verfügbar für diese, als auch für alle ihre Subdomänen.
Wenn weggelassen, wird das Cookie nur an den Host zurückgegeben, der es gesendet hat (d.h. es wird zu einem "Host-only-Cookie"). Dies ist restriktiver als das Setzen des Hostnamens, da das Cookie für Subdomänen des Hosts nicht verfügbar gemacht wird.
Entgegen früherer Spezifikationen werden führende Punkte in Domänennamen (
.example.com) ignoriert.Mehrere Host-/Domänenwerte sind nicht erlaubt, aber wenn eine Domäne angegeben ist, dann sind Subdomänen immer eingeschlossen.
Expires=<date>Optional-
Gibt die maximale Lebensdauer des Cookies als HTTP-Datum-Zeitstempel an. Siehe
Datefür das erforderliche Format.Wenn nicht festgelegt, wird das Cookie zu einem Sitzungscookie. Eine Sitzung endet, wenn der Client heruntergefahren wird, wonach das Sitzungscookie entfernt wird.
Warnung: Viele Webbrowser haben eine Sitzungswiederherstellungs-Funktion, die alle Tabs speichert und beim nächsten Gebrauch des Browsers wiederherstellt. Sitzungscookies werden ebenfalls wiederhergestellt, als wäre der Browser nie geschlossen worden.
Das
Expires-Attribut wird vom Server mit einem Wert relativ zu seiner eigenen internen Uhr festgelegt, die sich von der des Client-Browsers unterscheiden kann. Firefox und Chromium-basierte Browser verwenden intern einen Ablaufwert (max-age), der an die Uhrzeitdifferenz angepasst ist, und speichern und verfallen Cookies basierend auf der vom Server beabsichtigten Zeit. Die Anpassung für Abweichungen in der Uhrzeit wird aus dem Wert desDATE-Headers berechnet. Beachten Sie, dass die Spezifikation erklärt, wie das Attribut geparst werden sollte, aber nicht angibt, ob/wie der Wert vom Empfänger korrigiert werden sollte. HttpOnlyOptional-
Verhindert, dass JavaScript auf das Cookie zugreift, zum Beispiel über die
Document.cookie-Eigenschaft. Beachten Sie, dass ein mitHttpOnlyerstelltes Cookie dennoch mit von JavaScript initiierten Anfragen gesendet wird, zum Beispiel beim Aufruf vonXMLHttpRequest.send()oderfetch(). Dies mildert Angriffe gegen Cross-Site-Scripting (XSS). Max-Age=<number>Optional-
Gibt die Anzahl der Sekunden an, nach denen das Cookie abläuft. Eine Null oder eine negative Zahl lässt das Cookie sofort ablaufen. Wenn sowohl
Expiresals auchMax-Agefestgelegt sind, hatMax-AgeVorrang. PartitionedOptional-
Gibt an, dass das Cookie in einer partitionierten Speicherung gespeichert werden sollte. Beachten Sie, dass, wenn dies gesetzt ist, auch die
Secure-Direktive gesetzt sein muss. Siehe Cookies mit unabhängiger partitionierter Speicherung (CHIPS) für mehr Details. Path=<path-value>Optional-
Gibt den Pfad an, der vorhanden sein muss in der angeforderten URL, damit der Browser den
Cookie-Header sendet.Wenn weggelassen, wird dieses Attribut standardmäßig auf den Pfadbestandteil der Anforderungs-URL gesetzt. Zum Beispiel, wenn ein Cookie von einer Anfrage an
https://example.com/docs/Web/HTTP/index.htmlgesetzt wird, wäre der Standardpfad/docs/Web/HTTP/.Das Schrägstrich-Zeichen (
/) wird als Verzeichnistrenner interpretiert, und Unterverzeichnisse werden ebenfalls abgeglichen. Zum Beispiel, fürPath=/docs,- werden die Anforderungspfade
/docs,/docs/,/docs/Web/, und/docs/Web/HTTPalle übereinstimmen. - werden die Anforderungspfade
/,/docsets,/fr/docsnicht übereinstimmen.
Hinweis: Das
path-Attribut ermöglicht Ihnen die Kontrolle darüber, welche Cookies der Browser basierend auf den verschiedenen Teilen einer Seite sendet. Es ist nicht als Sicherheitsmaßnahme gedacht und schützt nicht vor unbefugtem Lesen des Cookies von einem anderen Pfad. - werden die Anforderungspfade
SameSite=<samesite-value>Optional-
Kontrolliert, ob ein Cookie mit standortübergreifenden Anfragen gesendet wird: das heißt, Anfragen, die von einem anderen Site, inklusive des Schemas, als die Site, die das Cookie gesetzt hat, stammen. Dies bietet einen gewissen Schutz gegen bestimmte standortübergreifende Angriffe, einschließlich Cross-Site Request Forgery (CSRF)-Angriffe.
Die möglichen Attributwerte sind:
Strict-
Senden Sie das Cookie nur für Anfragen, die von derselben Site stammen, die das Cookie gesetzt hat.
Lax-
Senden Sie das Cookie nur für Anfragen, die von derselben Site stammen, die das Cookie gesetzt hat, und für standortübergreifende Anfragen, die beide der folgenden Kriterien erfüllen:
-
Die Anfrage ist eine Top-Level-Navigation: dies bedeutet im Wesentlichen, dass die Anfrage die URL ändert, die in der Adressleiste des Browsers angezeigt wird.
-
Dies würde zum Beispiel Anfragen ausschließen, die mit der
fetch()-API oder Anfragen für Sub-Ressourcen von<img>oder<script>-Elementen, oder Navigierungen innerhalb von<iframe>-Elementen getätigt wurden. -
Es würde Anfragen einschließen, die getätigt werden, wenn der Benutzer in der obersten Browsing-Ebene auf einen Link von einer Site zu einer anderen klickt, oder eine Zuweisung zu
document.location, oder eine<form>-Einreichung.
-
-
Die Anfrage verwendet eine sichere Methode: insbesondere, dies schließt
POST,PUT, undDELETEaus.
Einige Browser verwenden
Laxals Standardwert, wennSameSitenicht spezifiziert ist: siehe Browser-Kompatibilität für Details.Hinweis: Wenn
Laxals Standardwert angewendet wird, wird eine freizügigere Version verwendet. In dieser freizügigeren Version werden Cookies auch beiPOST-Anfragen eingeschlossen, solange sie nicht mehr als zwei Minuten vor der Anfrage gesetzt wurden. -
None-
Senden Sie das Cookie sowohl mit standortübergreifenden als auch mit gleichsite-bezogenen Anfragen. Das
Secure-Attribut muss ebenfalls gesetzt sein, wenn dieser Wert verwendet wird.
SecureOptional-
Gibt an, dass das Cookie nur an den Server gesendet wird, wenn eine Anfrage mit dem
https:-Schema gemacht wird (außer auf localhost), und ist daher widerstandsfähiger gegen Man-in-the-Middle-Angriffe.Hinweis: Gehen Sie nicht davon aus, dass
Securealle Zugriffe auf sensible Informationen in Cookies (Sitzungsschlüssel, Anmeldedaten usw.) verhindert. Cookies mit diesem Attribut können dennoch gelesen/geändert werden, entweder mit Zugriff auf die Festplatte des Clients oder von JavaScript, wenn dasHttpOnly-Cookie-Attribut nicht gesetzt ist.Unsichere Sites (
http:) können keine Cookies mit demSecure-Attribut setzen. Diehttps:-Anforderungen werden ignoriert, wenn dasSecure-Attribut von localhost gesetzt wird.
Cookie-Präfixe
Einige Cookie-Namen enthalten Präfixe, die bestimmte Einschränkungen für die Attribute des Cookies in unterstützenden Benutzer-Agenten auferlegen. Alle Cookie-Präfixe beginnen mit einem doppelten Unterstrich (__) und enden mit einem Bindestrich (-). Die folgenden Präfixe sind definiert:
__Secure-: Cookies mit Namen, die mit__Secure-beginnen, müssen mit demSecure-Attribut von einer sicheren Seite (HTTPS) gesetzt werden.__Host-: Cookies mit Namen, die mit__Host-beginnen, müssen mit demSecure-Attribut von einer sicheren Seite (HTTPS) gesetzt werden. Darüber hinaus dürfen sie keinDomain-Attribut haben, und dasPath-Attribut muss auf/gesetzt werden. Dies garantiert, dass solche Cookies nur an den Host gesendet werden, der sie gesetzt hat, und nicht an einen anderen Host auf der Domain. Es garantiert auch, dass sie hostweit gesetzt sind und auf keinem Pfad auf diesem Host überschrieben werden können. Diese Kombination ergibt ein Cookie, das sich dem Ursprung als Sicherheitsgrenze so nahe wie möglich nähert.__Http-: Cookies mit Namen, die mit__Http-beginnen, müssen mit demSecure-Flag von einer sicheren Seite (HTTPS) gesetzt werden und zusätzlich muss dasHttpOnly-Attribut gesetzt sein, um zu beweisen, dass sie über denSet-Cookie-Header gesetzt wurden (sie können nicht via JavaScript-Funktionen wieDocument.cookieoder die Cookie Store API gesetzt oder geändert werden).__Host-Http-: Cookies mit Namen, die mit__Host-Http-beginnen, müssen mit demSecure-Flag von einer sicheren Seite (HTTPS) gesetzt werden und müssen dasHttpOnly-Attribut gesetzt haben, um zu beweisen, dass sie über denSet-Cookie-Header gesetzt wurden. Darüber hinaus unterliegen sie den gleichen Einschränkungen wie Cookies mit dem Präfix__Host-. Diese Kombination ergibt ein Cookie, das dem Ursprung als Sicherheitsgrenze so nahe wie möglich kommt und gleichzeitig sicherstellt, dass Entwickler und Serverbetreiber wissen, dass sein Geltungsbereich auf HTTP-Anfragen beschränkt ist.
Warnung: Sie können sich nicht auf diese zusätzlichen Zusicherungen bei Browsern verlassen, die keine Cookie-Präfixe unterstützen; in solchen Fällen werden präfixierte Cookies immer akzeptiert.
Beispiele
>Sitzungscookie
Sitzungscookies werden entfernt, wenn der Client heruntergefahren wird. Cookies sind Sitzungscookies, wenn sie das Expires- oder Max-Age-Attribut nicht angeben.
Set-Cookie: sessionId=38afes7a8
Permanentes Cookie
Permanente Cookies werden zu einem bestimmten Datum (Expires) oder nach einer bestimmten Dauer (Max-Age) entfernt und nicht beim Schließen des Clients.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
Set-Cookie: id=a3fWa; Max-Age=2592000
Ungültige Domänen
Ein Cookie für eine Domäne, die den Server, der es gesetzt hat, nicht einschließt, sollte vom Benutzer-Agenten abgelehnt werden.
Das folgende Cookie wird abgelehnt, wenn es von einem Server auf original-company.com gesetzt wird:
Set-Cookie: qwerty=219ffwef9w0f; Domain=some-company.co.uk
Ein Cookie für eine Subdomain der dienenden Domäne wird abgelehnt.
Das folgende Cookie wird abgelehnt, wenn es von einem Server auf example.com gesetzt wird:
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
Cookie-Präfixe
Cookie-Namen, die mit __Secure- oder __Host- präfixiert sind, können nur verwendet werden, wenn sie mit dem Secure-Attribut von einem sicheren (HTTPS) Ursprung gesetzt werden.
Cookie-Namen, die mit __Http- oder __Host-Http- präfixiert sind, können nur verwendet werden, wenn sie mit dem Secure-Attribut von einem sicheren (HTTPS) Ursprung gesetzt werden und zusätzlich das HttpOnly-Attribut gesetzt sein muss, um zu beweisen, dass sie über den Set-Cookie-Header und nicht clientseitig über JavaScript gesetzt wurden.
Darüber hinaus müssen Cookies mit dem Präfix __Host- oder __Host-Http- einen Pfad von / (d.h. jeder Pfad auf dem Host) haben und dürfen kein Domain-Attribut haben.
// Both accepted when from a secure origin (HTTPS)
Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/
// Rejected due to missing Secure attribute
Set-Cookie: __Secure-id=1
// Rejected due to the missing Path=/ attribute
Set-Cookie: __Host-id=1; Secure
// Rejected due to setting a Domain
Set-Cookie: __Host-id=1; Secure; Path=/; Domain=example.com
// Only settable via Set-Cookie
Set-Cookie: __Http-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-Http-ID=123; Secure; Path=/
Partitioniertes Cookie
Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;
Hinweis:
Partitionierte Cookies müssen mit Secure gesetzt werden. Darüber hinaus wird empfohlen, ein __Host- oder __Host-Http--Präfix beim Setzen von partitionierten Cookies zu verwenden, um sicherzustellen, dass sie an den Hostnamen und nicht an die registrierbare Domäne gebunden sind.
Spezifikationen
| Spezifikation |
|---|
| HTTP State Management Mechanism> # sane-set-cookie> |
Browser-Kompatibilität
Siehe auch
- HTTP-Cookies
CookieDocument.cookie- Samesite-Cookies erklärt (web.dev blog)