Start · Sprachen · JavaScript · Referenz · Headers.getSetCookie()

Headers.getSetCookie()

Methode

Gibt ein Array mit den Werten aller <code>Set-Cookie</code>-Header eines <code>Headers</code>-Objekts zurück, jeden Header als eigenen Eintrag.

seit JavaScript Baseline 2023: Chrome 113, Firefox 112, Safari 17, Kategorie: webapi

Signatur

Headers.prototype.getSetCookie()

Beschreibung

Mit getSetCookie() liest du alle Set-Cookie-Header eines Headers-Objekts aus. Du bekommst ein Array von Strings, in dem jeder Header ein eigenes Element ist. Das ist nötig, weil Set-Cookie als einziger Header nicht sicher per Komma zusammengefügt werden kann: Cookie-Attribute wie Expires=Wed, 21 Oct 2026 07:28:00 GMT enthalten selbst Kommas.

Vor dieser Methode gab headers.get("set-cookie") alle Werte als einen durch ", " verbundenen String zurück. Diesen String konnte man nicht zuverlässig wieder aufteilen. getSetCookie() behebt das Problem und ist der empfohlene Weg, mehrere Cookies auszulesen.

Praktisch nützlich ist die Methode vor allem serverseitig: in Node.js, Deno, Bun, Cloudflare Workers oder in Proxys und Middleware (etwa Next.js, Remix), wenn Cookies einer Upstream-Antwort weitergereicht oder ausgewertet werden sollen. Im Browser ist Set-Cookie ein verbotener Antwort-Header (forbidden response header name). Bei Antworten von fetch() liefert die Methode dort deshalb immer ein leeres Array.

Rückgabewert

Typ
string[]
Beschreibung
Ein Array mit den Werten aller Set-Cookie-Header in der Reihenfolge, in der sie hinzugefügt wurden. Gibt es keinen solchen Header, ist das Array leer ([]) – es wird also nie null zurückgegeben.

Beispiele

Mehrere Cookies sauber auslesen

const headers = new Headers();
headers.append("Set-Cookie", "session=abc123; Path=/; HttpOnly");
headers.append("Set-Cookie", "theme=dark; Expires=Wed, 21 Oct 2026 07:28:00 GMT");

// Alt: alles in einem String, Kommas sind nicht eindeutig
console.log(headers.get("set-cookie"));

// Neu: ein Array-Element pro Header
console.log(headers.getSetCookie());
session=abc123; Path=/; HttpOnly, theme=dark; Expires=Wed, 21 Oct 2026 07:28:00 GMT [ 'session=abc123; Path=/; HttpOnly', 'theme=dark; Expires=Wed, 21 Oct 2026 07:28:00 GMT' ]

Cookies einer Upstream-Antwort in Node.js auswerten

// Node.js 20+ (ES-Modul, Top-Level-await)
const res = await fetch("https://example.com/login", {
  method: "POST",
  body: new URLSearchParams({ user: "max", pass: "geheim" }),
});

const cookies = res.headers.getSetCookie();

// Name-Wert-Paare ohne Attribute herausziehen
const jar = Object.fromEntries(
  cookies.map((c) => {
    const [pair] = c.split(";");
    const i = pair.indexOf("=");
    return [pair.slice(0, i).trim(), pair.slice(i + 1).trim()];
  })
);

console.log(jar);
{ session: 'abc123', csrf: 'xyz' } // abhängig vom Server

Cookies in einem Proxy/Worker weiterreichen

// z. B. Cloudflare Worker oder Deno.serve-Handler
const handler = async (request) => {
  const upstream = await fetch("https://api.example.com" + new URL(request.url).pathname);

  const headers = new Headers({ "Content-Type": upstream.headers.get("Content-Type") ?? "text/plain" });

  // Jeden Cookie einzeln übernehmen – nicht zu einem String zusammenfügen!
  for (const cookie of upstream.headers.getSetCookie()) {
    headers.append("Set-Cookie", cookie);
  }

  return new Response(upstream.body, { status: upstream.status, headers });
};

export default { fetch: handler };

Browser: leeres Array bei fetch-Antworten

const res = await fetch("/api/login", { method: "POST" });
// Set-Cookie ist im Browser für Skripte unsichtbar
console.log(res.headers.getSetCookie());
[]

// Wichtig · Fallstricke

  • Im Browser meist nutzlos: Set-Cookie und Set-Cookie2 sind verbotene Antwort-Header. Bei fetch()- und XHR-Antworten ist das Ergebnis immer [], auch mit credentials: "include". Cookies setzt der Browser trotzdem selbst. Aus Skripten sind sie nur über document.cookie oder die Cookie Store API lesbar, und das nur ohne HttpOnly.
  • Nicht selbst aufteilen: Den String aus get("set-cookie") niemals per split(",") zerlegen. Expires-Datumsangaben enthalten Kommas.
  • Iteration: Beim Durchlaufen mit for...of oder entries() erscheint jeder Set-Cookie-Header als eigenes Paar. Andere doppelte Header werden dagegen zusammengefasst.
  • Keine Parameter: Die Methode liefert nur rohe Header-Strings. Name, Wert und Attribute (Path, Secure, SameSite …) musst du selbst auslesen oder eine Bibliothek wie cookie bzw. set-cookie-parser verwenden.
  • Kompatibilität: Verfügbar ab Chrome/Edge 113, Firefox 112, Safari 17, Node.js 19.7 (zurückportiert nach 18.14), Deno 1.34 und Bun. Für ältere Umgebungen ist eine Prüfung sinnvoll: typeof headers.getSetCookie === "function". Andernfalls greift man in Node auf res.headers.raw() (node-fetch) oder IncomingMessage.headers["set-cookie"] zurück.
  • Sicherheit: Wenn ein Proxy Cookies weiterreicht, sollte er die Attribute Domain und Secure prüfen. Sonst können Cookies für falsche Domains oder über unverschlüsselte Verbindungen gesetzt werden.