Mit Cookies steuerst du das Nutzerverhalten auf deiner Website und realisierst zentrale Funktionen wie Login oder Personalisierung. Die PHP Funktion setcookie() liefert dir alle Werkzeuge, um Cookies gezielt und sicher einzusetzen. In diesem Artikel zeige ich dir Schritt für Schritt, wie du setcookie() professionell nutzt – von der Basis bis zu den besten Security-Praktiken.

Inhaltsverzeichnis
Was sind Cookies in PHP?
Cookies ermöglichen es dir, Daten auf dem Rechner des Besuchers zu speichern und beim nächsten Seitenaufruf wieder abzurufen. Im Weballtag sind sie unverzichtbar – vom Warenkorb bis zur Spracheinstellung.
Kurze Definition und Zweck
Cookies sind kleine Textdateien, die der Browser für eine Website ablegt. Sie speichern Nutzerpräferenzen, Sitzungs-IDs oder Tracking-Informationen.
Cookies vs. Sessions (kurze Abgrenzung)
Während Cookies im Browser des Nutzers liegen, verwaltet PHP Sessions serverseitig. Sessions nutzen meist Cookies, um den Nutzer eindeutig zu identifizieren, speichern aber die eigentlichen Daten auf dem Server.
Cookies werden per HTTP-Header zwischen Server und Browser übertragen.
Jedes Mal, wenn du setcookie() aufrufst, schickt PHP den passenden Set-Cookie-Header – und der Browser legt das Cookie ab.
Die setcookie() Funktion verstehen
Mit setcookie() erzeugst und verwaltest du Cookies direkt in PHP.
Du solltest wissen, wie und wann du die Funktion korrekt aufrufst.
Grundlegende Beschreibung
setcookie() sendet einen HTTP-Header an den Browser, um ein neues Cookie zu speichern oder ein bestehendes zu ändern.
Da Cookies per HTTP-Header übertragen werden, darf vorher noch keine HTML-Ausgabe oder gar ein Leerzeichen im PHP-Skript erfolgt sein.
Sobald du etwas ausgegeben hast, kann PHP keine Header mehr senden – das ist ein häufiger Fehler.
Lösung für Ausgabe vor setcookie(): Output Buffering (mit Code-Beispiel)
Falls du schon Ausgaben erzeugt hast, kannst du mit Output Buffering arbeiten.
So aktivierst du es in PHP:
ob_start();
/** Ausgabe und setcookie() Aufruf hier */
setcookie('sBeispielName', 'sWert');
/** ... weitere Ausgaben ... */
ob_end_flush();
Damit steuerst du, wann die Ausgabe tatsächlich erfolgt und kannst vorher Cookies setzen.
setcookie() Syntax und Parameter im Detail
Für die tägliche Arbeit mit Cookies ist es wichtig, die einzelnen Parameter von setcookie() im Detail zu verstehen.
Funktionssignatur von setcookie()
Die aktuelle Funktionssignatur (Stand: PHP 8.3) sieht wie folgt aus:
setcookie(
string $sName,
string $sWert = "",
array|int $mAblaufOderOptionen = 0,
string $sPfad = "",
string $sDomain = "",
bool $bSecure = false,
bool $bHttpOnly = false
): bool
Ab PHP 7.3 kannst du das dritte Argument ($mAblaufOderOptionen) als Array übergeben.
Frühere Versionen erwarten einen Integer-Timestamp.
Erklärung aller Parameter
Nachfolgend findest du alle Parameter ausführlich erläutert:
$sName (erforderlich)
Name des Cookies als String.
Keine Leerzeichen oder Steuerzeichen erlaubt.
$sWert (optional, Standard: '')
Der Wert des Cookies als String.
Standardmäßig wird der Wert URL-kodiert. Willst du das verhindern, nutze setrawcookie().
$mAblaufOderOptionen (optional, Standard: 0)
-
Integer: Ein Unix-Timestamp (z. B. time() + 3600 für 1 Stunde ab jetzt).
-
Array: Ab PHP 7.3 kannst du statt eines Zeitstempels ein Array mit Optionen übergeben, etwa:
[
'expires' => time() + 3600,
'path' => '/',
'domain' => '.beispiel.de',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]
$sPfad (optional, Standard: '')
Pfad, für den das Cookie gültig ist.
Mit '/' ist das Cookie auf der ganzen Domain verfügbar.
$sDomain (optional, Standard: '')
Domain, für die das Cookie gültig ist.
Mit .beispiel.de kann das Cookie auch Subdomains einschließen.
$bSecure (optional, Standard: false)
Ob das Cookie nur per HTTPS übertragen wird.
Wird empfohlen, wenn du sensible Informationen speicherst.
$bHttpOnly (optional, Standard: false)
Ob das Cookie nur per HTTP(S) und nicht per JavaScript auslesbar ist.
Schützt vor Zugriff durch XSS.
Beispiele für Ablaufzeiten
setcookie('sSessionCookie', 'sWert');
/* Gültig bis zum Schließen des Browsers (Session-Cookie) */
setcookie('sStunde', 'sWert', time() + 3600);
/* 1 Stunde */
setcookie('sMonat', 'sWert', time() + 30*24*3600);
/* 30 Tage */
setcookie('sJahr', 'sWert', time() + 365*24*3600);
/* 1 Jahr */
Options-Array ab PHP 7.3
Das Options-Array bietet moderne Cookie-Konfiguration.
Du kannst damit alle wichtigen Attribute (inkl. samesite) direkt setzen:
setcookie('sName', 'sWert', [
'expires' => time() + 3600,
'path' => '/',
'domain' => '.beispiel.de',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
Bedeutung der einzelnen Optionen
Option | Bedeutung | Beispiel/Empfehlung |
expires | Ablaufzeit als Unix-Timestamp | time() + 3600 |
path | Gültigkeitspfad | / (für gesamte Domain) |
domain | Gültigkeitsdomain | .deinedomain.de |
secure | Nur per HTTPS senden | true (bei HTTPS empfohlen) |
httponly | Nur per HTTP/HTTPS, nicht aus JavaScript | true (für Sicherheit) |
samesite | CSRF-Schutz (None, Lax, Strict) | Lax oder Strict |
Praktische Beispiele zur Verwendung von setcookie()
Beispiele erleichtern das Verständnis und zeigen den praktischen Einsatz der Funktion.
Beispiel 1: Einfaches Cookie setzen (nur Name und Wert)
setcookie('sBenutzername', 'MaxMustermann');
/** Setzt ein Session-Cookie mit dem Namen sBenutzername und dem Wert MaxMustermann */
Beispiel 2: Cookie mit Ablaufzeit setzen
setcookie('sSprache', 'de', time() + 365*24*3600);
/** Cookie für ein Jahr speichern */
Beispiel 3: Cookie für die gesamte Domain setzen (path=’/’)
setcookie('sGlobal', '1', time() + 3600, '/');
/** Das Cookie ist auf allen Seiten verfügbar */
Beispiel 4: Sicheres Cookie setzen (secure)
setcookie('sLogin', 'wert123', time() + 3600, '/', '', true);
/** Cookie nur über HTTPS senden */
Beispiel 5: HttpOnly-Cookie setzen (httponly)
setcookie('sToken', 'abc', time() + 3600, '/', '', false, true);
/** Cookie ist nicht per JavaScript auslesbar */
Beispiel 6: Cookie mit Options-Array setzen (PHP 7.3+, Fokus: samesite)
setcookie('sAuth', 'xyz', [
'expires' => time() + 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
/** Modern, flexibel und sicher */
Beispiel 7: Array-Cookies setzen
setcookie('aWarenkorb[0]', 'Apfel');
setcookie('aWarenkorb[1]', 'Birne');
/** PHP liest diese Werte als Array aus */
Cookies lesen mit $_COOKIE
Cookies stehen dir in PHP im globalen Array $_COOKIE zur Verfügung.
Du greifst einfach wie bei einem assoziativen Array darauf zu.
Beispiel: Einzelnes Cookie lesen
if (isset($_COOKIE['sBenutzername'])) {
$sBenutzer = $_COOKIE['sBenutzername'];
/* Jetzt kannst du mit $sBenutzer weiterarbeiten */
}
Beispiel: Alle Cookies lesen
print_r($_COOKIE);
/** Zeigt alle Cookies als Array */
Wichtiger Hinweis: Cookies sind erst nach dem nächsten Seitenaufruf verfügbar
Nachdem du ein Cookie mit setcookie() gesetzt hast, steht es im gleichen Request noch nicht in $_COOKIE bereit. Erst beim nächsten Seitenaufruf kannst du es lesen.
Überprüfen, ob ein Cookie gesetzt ist
Mit isset() testest du, ob das Cookie im Browser angekommen ist:
if (isset($_COOKIE['sLogin'])) {
/* Benutzer ist eingeloggt */
}
Cookies löschen
Cookies entfernst du, indem du sie mit setcookie() und einem Verfallsdatum in der Vergangenheit neu setzt.
Das Cookie verschwindet dann beim nächsten Seitenaufruf.
Die Methode: setcookie() mit Verfallsdatum in der Vergangenheit
setcookie('sLogin', '', time() - 3600, '/');
/** Das Cookie ist gelöscht */
Wichtiger Hinweis: Zum Löschen die GLEICHEN Parameter (Pfad, Domain) verwenden wie beim Setzen
Nur wenn du dieselben Werte für Pfad und Domain wie beim Setzen benutzt, wird das Cookie auch wirklich gelöscht.
Beispiel: Ein einzelnes Cookie löschen
setcookie('sBenutzername', '', time() - 3600, '/');
Beispiel: Alle Cookies löschen (Konzept und Herausforderungen)
Du kannst alle Cookies aus $_COOKIE iterieren und einzeln löschen:
foreach ($_COOKIE as $sName => $sWert) {
setcookie($sName, '', time() - 3600, '/');
}
Achtung: Array-Cookies (wie aWarenkorb[0]) musst du einzeln ansprechen.
setcookie() vs. setrawcookie()
In manchen Fällen willst du verhindern, dass PHP Werte automatisch URL-kodiert. Dafür gibt es setrawcookie().
Wann setrawcookie() verwenden? (Keine automatische URL-Kodierung)
setrawcookie() speichert Werte im Original – praktisch z.B. bei schon kodierten Strings oder speziellen Zeichen.
Kurzes Code-Beispiel
setrawcookie('sRoherWert', 'Ein Wert mit Sonderzeichen!@#', time() + 3600);
/** Keine automatische Kodierung */
Sicherheit und Best Practices bei der Verwendung von Cookies
Ein verantwortungsvoller Umgang mit Cookies ist Pflicht, gerade wenn du mit Nutzerdaten arbeitest.
Hier die wichtigsten Tipps aus der Praxis:
-
Keine sensiblen Daten direkt in Cookies speichern
- Speichere niemals Passwörter, Zahlungsdaten oder ähnliche Infos direkt im Cookie. Nutze stattdessen eine ID und lagere Daten serverseitig.
-
Keine sensiblen Daten direkt in Cookies speichern
- Speichere niemals Passwörter, Zahlungsdaten oder ähnliche Infos direkt im Cookie. Nutze stattdessen eine ID und lagere Daten serverseitig.
-
Verwendung von secure für HTTPS
- Cookies, die sensible Infos enthalten, sollten immer mit secure:true gesetzt werden – sonst sind sie abgreifbar.
-
Verwendung von httponly zur Minderung von XSS-Risiken
- Mit httponly:true schützt du dich vor JavaScript-Zugriff auf Cookies. Das mindert das Risiko für Session-Diebstahl über Cross-Site-Scripting.
-
Implementierung des samesite Attributes
- Nutze samesite, um CSRF-Angriffe zu erschweren. “Lax” ist ein guter Standard, “Strict” blockiert fast alle fremden Requests.
-
Regelmäßige Überprüfung und Löschung nicht benötigter Cookies
- Halte deine Cookies schlank. Entferne regelmäßig alles, was nicht mehr gebraucht wird.
-
Umgang mit der EU-Cookie-Richtlinie (kurzer Hinweis, keine Rechtsberatung)
- Beachte: Nutzer müssen über Cookies informiert werden. Rechtliche Hinweise und Consent-Mechanismen sind Pflicht. Informiere dich, was in deinem Land gilt.
Häufige Fehler und Fehlerbehebung
Auch erfahrene Entwickler tappen regelmäßig in dieselben Fallen. Hier findest du die Klassiker – und wie du sie löst.
-
"Headers already sent" Fehler (Verweis auf Abschnitt 2)
- Du hast vor setcookie() schon ausgegeben? Siehe “Output Buffering”.
Immer vor jeglicher Ausgabe arbeiten!
-
Cookies sind nicht auf anderen Seiten verfügbar (Pfad-Problem)
- Setze path auf '/' für seitenweite Verfügbarkeit. Cookies mit dem Standardpfad gelten nur für das aktuelle Verzeichnis.
-
Cookies werden nicht gesetzt (Browser-Einstellungen, Fehler im Code)
- Viele Browser blockieren Cookies, z.B. im Inkognito-Modus. Prüfe außerdem, ob du setcookie() korrekt vor Ausgaben aufrufst.
-
Cookies werden nicht gelöscht (falsche Parameter beim Löschen)
- Zum Löschen musst du exakt dieselben Werte für path und domain wie beim Setzen angeben.
Fazit
Mit PHP setcookie() hast du ein mächtiges Werkzeug, um Nutzererlebnisse zu gestalten und die Funktionalität deiner Website gezielt zu steuern. Wer sich mit den Parametern, Sicherheitsmechanismen und Besonderheiten (wie samesite oder Output Buffering) auseinandersetzt, spart später viel Zeit bei Fehlersuche und Optimierung. Mein Tipp: Experimentiere in einer Testumgebung mit allen Parametern, um die Auswirkungen zu verstehen – und vergiss nie, die Sicherheit deiner Cookies im Blick zu behalten.