Signatur
Beschreibung
Die Methode set() der CookieStore-Schnittstelle ist der moderne, asynchrone Ersatz für das Schreiben über document.cookie. Statt einen Cookie-String mühsam zusammenzusetzen, übergibt man entweder Name und Wert oder ein strukturiertes Optionsobjekt mit expires, domain, path, sameSite und partitioned.
Der Aufruf gibt ein Promise zurück, das erfüllt wird, sobald das Cookie tatsächlich gesetzt wurde. Schlägt das Setzen fehl, etwa wegen eines ungültigen Namens, einer unpassenden Domain oder weil der Browser Cookies blockiert, wird das Promise mit einem TypeError bzw. SecurityError abgelehnt. Damit lassen sich Fehler zuverlässig erkennen. Bei document.cookie scheitert das Setzen dagegen stillschweigend.
Die API gibt es im Fenster-Kontext über window.cookieStore und in Service Workern über self.cookieStore. So können auch Service Worker Cookies verwalten, die keinen Zugriff auf document haben. Jede Änderung löst im Fenster das Ereignis change am CookieStore aus, im Service Worker (nach Anmeldung) das Ereignis cookiechange.
Über set() gesetzte Cookies sind immer Secure und niemals HttpOnly. Das Flag HttpOnly kann nur der Server per Set-Cookie-Header setzen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name | string | Name des Cookies (Kurzform mit zwei Argumenten). | |
| $value | string | Wert des Cookies (Kurzform). Wird zusammen mit name übergeben. |
|
| $options | Object | Alternative zur Kurzform: Objekt mit folgenden Feldern:
|
Rückgabewert
Promise, das mit undefined erfüllt wird, sobald das Cookie gesetzt ist. Bei ungültigen Angaben wird es mit einem TypeError abgelehnt, bei blockiertem Zugriff mit einem SecurityError.Beispiele
Einfaches Cookie mit Name und Wert setzen
const speichereTheme = async (theme) => {
try {
await cookieStore.set('theme', theme);
const cookie = await cookieStore.get('theme');
console.log(`Gespeichert: ${cookie.name}=${cookie.value}`);
} catch (err) {
console.error('Cookie konnte nicht gesetzt werden:', err);
}
};
speichereTheme('dark');
Cookie mit Ablaufdatum, Pfad und SameSite über options-Objekt
const DREISSIG_TAGE = 30 * 24 * 60 * 60 * 1000;
const merkeSprache = async (sprache) => {
await cookieStore.set({
name: 'lang',
value: sprache,
expires: Date.now() + DREISSIG_TAGE,
path: '/',
sameSite: 'lax'
});
const { name, value, expires, sameSite } = await cookieStore.get('lang');
console.log(name, value, new Date(expires).toISOString(), sameSite);
};
merkeSprache('de');
Auf Änderungen reagieren (change-Ereignis)
cookieStore.addEventListener('change', (event) => {
for (const c of event.changed) {
console.log(`Geändert: ${c.name}=${c.value}`);
}
for (const c of event.deleted) {
console.log(`Gelöscht: ${c.name}`);
}
});
await cookieStore.set('warenkorb', '3');
Cookie im Service Worker setzen
// sw.js
self.addEventListener('fetch', (event) => {
const url = new URL(event.request.url);
if (url.pathname === '/login-erfolgreich') {
event.waitUntil(
self.cookieStore.set({
name: 'eingeloggt',
value: '1',
sameSite: 'strict'
})
);
}
});
// Wichtig · Fallstricke
- Browser-Kompatibilität: Chromium-Browser unterstützen die API seit Version 87. Safari folgt ab 18.4, Firefox ab 140. Vor dem Einsatz eine Merkmalserkennung (
if ('cookieStore' in self)) durchführen und bei Bedarf aufdocument.cookiezurückfallen. - Nur sichere Kontexte: Die API ist nur unter HTTPS verfügbar (oder unter
localhost). Gesetzte Cookies sind automatischSecure. - Kein
HttpOnly: Über JavaScript lassen sich keineHttpOnly-Cookies setzen. Sitzungs- und Authentifizierungs-Token sollten deshalb vom Server perSet-Cookiegesetzt werden, damit sie bei einer XSS-Lücke nicht ausgelesen werden können. expiresist ein Zeitstempel: Erwartet wird eine Zahl in Millisekunden (z. B.Date.now() + …), kein Datumsstring.max-agegibt es nicht.- Löschen: Zum Entfernen besser
cookieStore.delete()verwenden. Ein Ablaufdatum in der Vergangenheit funktioniert zwar auch, ist aber umständlicher. - Domain-Regeln:
domainmuss zum aktuellen Host passen oder eine übergeordnete Domain sein, sonst wird das Promise abgelehnt. Die Kombination aus Name, Domain und Pfad bestimmt, ob ein bestehendes Cookie überschrieben oder ein zweites angelegt wird. - Größenlimits: Name und Wert zusammen dürfen etwa 4096 Byte nicht überschreiten. Zu große Cookies führen zu einem
TypeError. - Fehler immer mit
try/catchbzw..catch()abfangen, etwa wenn der Nutzer Cookies blockiert.