Verwendung von HTTP-Cookies
Ein Cookie (auch bekannt als Web-Cookie oder Browser-Cookie) ist ein kleines Datenstück, das ein Server an den Webbrowser eines Benutzers sendet. Der Browser kann Cookies speichern, neue Cookies erstellen, vorhandene modifizieren und sie mit späteren Anfragen an denselben Server zurücksenden. Cookies ermöglichen es Webanwendungen, begrenzte Mengen an Daten zu speichern und Statusinformationen zu merken; standardmäßig ist das HTTP-Protokoll zustandslos.
In diesem Artikel werden wir die Hauptanwendungen von Cookies untersuchen, bewährte Methoden für ihre Nutzung erläutern sowie ihre Datenschutz- und Sicherheitsimplikationen betrachten.
Wofür Cookies verwendet werden
Typischerweise verwendet der Server den Inhalt von HTTP-Cookies, um festzustellen, ob verschiedene Anfragen vom selben Browser/Benutzer stammen, und gibt dann eine personalisierte oder allgemeine Antwort aus, wie es angemessen ist. Im Folgenden wird ein sehr einfaches Anmeldesystem für Benutzer beschrieben:
- Der Benutzer sendet Anmeldeinformationen an den Server, zum Beispiel über die Übermittlung eines Formulars.
- Sind die Anmeldedaten korrekt, aktualisiert der Server die Benutzeroberfläche, um anzuzeigen, dass der Benutzer angemeldet ist, und antwortet mit einem Cookie, das eine Sitzungs-ID enthält, die den Anmeldestatus im Browser aufzeichnet.
- Zu einem späteren Zeitpunkt wechselt der Benutzer zu einer anderen Seite auf derselben Webseite. Der Browser sendet das Cookie mit der Sitzungs-ID zusammen mit der entsprechenden Anfrage, um anzuzeigen, dass der Benutzer weiterhin als angemeldet angesehen wird.
- Der Server überprüft die Sitzungs-ID und sendet dem Benutzer, falls sie noch gültig ist, eine personalisierte Version der neuen Seite. Ist sie nicht gültig, wird die Sitzungs-ID gelöscht, und dem Benutzer wird eine generische Seite angezeigt (oder vielleicht eine "Zugriff verweigert"-Meldung und eine Aufforderung zur erneuten Anmeldung).
Cookies werden hauptsächlich für drei Zwecke verwendet:
- Sitzungsverwaltung: Anmeldestatus des Benutzers, Inhalte des Warenkorbs, Spielergebnisse oder andere sitzungsbezogene Details, die der Server sich merken muss.
- Personalisierung: Benutzereinstellungen wie Anzeige-Sprache und UI-Thema.
- Tracking: Aufzeichnung und Analyse des Nutzerverhaltens.
Datenspeicherung
In den frühen Tagen des Webs, als es keine andere Option gab, wurden Cookies für allgemeine Zwecke der clientseitigen Datenspeicherung verwendet. Moderne Speicher-APIs werden jetzt empfohlen, beispielsweise die Web Storage API (localStorage
und sessionStorage
) und IndexedDB.
Sie sind mit dem Fokus auf Speicherung konzipiert, senden niemals Daten an den Server und haben nicht die anderen Nachteile, die die Verwendung von Cookies zur Speicherung mit sich bringt:
- Browser sind im Allgemeinen auf eine maximale Anzahl von Cookies pro Domain beschränkt (unterscheidet sich je nach Browser, generell in den Hunderten) und auf eine maximale Größe pro Cookie (normalerweise 4KB). Speicher-APIs können größere Datenmengen speichern.
- Cookies werden mit jeder Anfrage gesendet, was die Leistung verschlechtern kann (zum Beispiel bei langsamen mobilen Datenverbindungen), insbesondere wenn viele Cookies gesetzt sind.
Hinweis: Um gespeicherte Cookies (und andere von einer Webseite genutzte Speichermedien) zu sehen, können Sie den Speicherinspektor in den Firefox Developer Tools oder das Anwendungsfenster in den Chrome Developer Tools verwenden.
Erstellen, Entfernen und Aktualisieren von Cookies
Nach Erhalt einer HTTP-Anfrage kann ein Server eine oder mehrere Set-Cookie
-Header mit der Antwort senden, von denen jeder ein separates Cookie setzt. Ein einfaches Cookie wird gesetzt, indem ein Name-Wert-Paar wie folgt angegeben wird:
Set-Cookie: <cookie-name>=<cookie-value>
Die folgende HTTP-Antwort weist den empfangenden Browser an, ein Paar von Cookies zu speichern:
HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=chocolate
Set-Cookie: tasty_cookie=strawberry
[page content]
Hinweis:
Erfahren Sie, wie Sie den Set-Cookie
-Header in verschiedenen serverseitigen Sprachen/Frameworks verwenden: PHP, Node.JS, Python, Ruby on Rails.
Wird eine neue Anfrage gestellt, sendet der Browser normalerweise die zuvor gespeicherten Cookies für die aktuelle Domain mit einem Cookie
-HTTP-Header zurück an den Server:
GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=chocolate; tasty_cookie=strawberry
Entfernung: Festlegung der Lebensdauer eines Cookies
Sie können ein Ablaufdatum oder einen Zeitraum angeben, nach dem das Cookie gelöscht und nicht mehr gesendet werden soll. Abhängig von den im Set-Cookie
-Header festgelegten Attributen, wenn die Cookies erstellt werden, können sie entweder dauerhaft oder sitzungsbasiert sein:
-
Dauerhafte Cookies werden nach dem im
Expires
-Attribut festgelegten Datum gelöscht:httpSet-Cookie: id=a3fWa; Expires=Thu, 31 Oct 2021 07:28:00 GMT;
oder nach dem im
Max-Age
-Attribut festgelegten Zeitraum:httpSet-Cookie: id=a3fWa; Max-Age=2592000
Hinweis:
Expires
ist bereits länger verfügbar alsMax-Age
, jedoch istMax-Age
weniger fehleranfällig und hat Vorrang, wenn beide gesetzt sind. Der Grund dafür ist, dass beim Setzen einesExpires
-Datums und einer Zeit diese relativ zum Client sind, auf dem das Cookie gesetzt wird. Wenn der Server auf eine andere Zeit eingestellt ist, könnte dies Fehler verursachen. -
Sitzungs-Cookies – Cookies ohne ein
Max-Age
- oderExpires
-Attribut – werden gelöscht, wenn die aktuelle Sitzung endet. Der Browser legt fest, wann die "aktuelle Sitzung" endet, und einige Browser verwenden bei einem Neustart die Sitzungswiederherstellung. Dadurch können Sitzungs-Cookies unbegrenzt bestehen bleiben.Hinweis: Wenn Ihre Seite Benutzer authentifiziert, sollte sie Sitzungs-Cookies regenerieren und erneut senden, auch solche, die bereits existieren, wann immer ein Benutzer authentifiziert wird. Dieser Ansatz hilft, Session-Fixation-Angriffe zu verhindern, bei denen ein Dritter die Sitzung eines Benutzers wieder verwenden kann.
Es gibt einige Techniken, die darauf abzielen, Cookies nach ihrer Löschung wiederherzustellen. Diese werden als "Zombie"-Cookies bezeichnet. Diese Techniken verletzen die Grundsätze des Benutzer-Datenschutzes und der Kontrolle, können gegen Datenschutzbestimmungen verstoßen und eine Webseite, die sie verwendet, rechtlichen Haftungen aussetzen.
Aktualisieren von Cookie-Werten
Um ein Cookie über HTTP zu aktualisieren, kann der Server einen Set-Cookie
-Header mit dem Namen des vorhandenen Cookies und einem neuen Wert senden. Zum Beispiel:
Set-Cookie: id=new-value
Es gibt mehrere Gründe, warum Sie dies tun möchten, zum Beispiel wenn ein Benutzer seine Präferenzen aktualisiert hat und die Anwendung die Änderungen in den clientseitigen Daten widerspiegeln möchte (Sie könnten dies auch mit einem clientseitigen Speichersystem wie Web Storage tun).
Aktualisieren von Cookies über JavaScript
Im Browser können Sie neue Cookies über JavaScript mit der Document.cookie
-Eigenschaft oder der asynchronen Cookie Store API erstellen. Beachten Sie, dass alle unten stehenden Beispiele Document.cookie
verwenden, da es die am weitesten unterstützte/etablierte Option ist.
document.cookie = "yummy_cookie=chocolate";
document.cookie = "tasty_cookie=strawberry";
Sie können auch auf vorhandene Cookies zugreifen und ihnen neue Werte zuweisen, sofern das HttpOnly
-Attribut nicht auf ihnen gesetzt ist (d.h. im Set-Cookie
-Header, der es erstellt hat):
console.log(document.cookie);
// logs "yummy_cookie=chocolate; tasty_cookie=strawberry"
document.cookie = "yummy_cookie=blueberry";
console.log(document.cookie);
// logs "tasty_cookie=strawberry; yummy_cookie=blueberry"
Beachten Sie, dass Sie aus Sicherheitsgründen Cookie-Werte nicht ändern können, indem Sie direkt beim Initiieren einer Anfrage einen aktualisierten Cookie
-Header senden, z.B. über fetch()
oder XMLHttpRequest
. Beachten Sie, dass es auch gute Gründe gibt, warum Sie JavaScript nicht erlauben sollten, Cookies zu ändern – d.h. HttpOnly
bei Erstellung setzen. Siehe den Abschnitt Sicherheit für mehr Details.
Sicherheit
Wenn Sie Informationen in Cookies speichern, sind standardmäßig alle Cookie-Werte sichtbar und können vom Endbenutzer geändert werden. Sie möchten wirklich nicht, dass Ihre Cookies missbraucht werden – zum Beispiel von böswilligen Akteuren abgerufen/geändert oder an Domains gesendet werden, an die sie nicht gesendet werden sollten. Die möglichen Folgen können von ärgerlich – Apps, die nicht funktionieren oder seltsames Verhalten zeigen – bis hin zu katastrophal reichen. Ein Krimineller könnte zum Beispiel eine Sitzungs-ID stehlen und diese verwenden, um ein Cookie zu setzen, das es so aussehen lässt, als ob er als jemand anderes angemeldet ist, und dabei die Kontrolle über deren Bank- oder E-Commerce-Konto übernehmen.
Sie können Ihre Cookies auf verschiedene Arten sichern, die in diesem Abschnitt überprüft werden.
Zugriff auf Ihre Cookies blockieren
Sie können sicherstellen, dass Cookies sicher gesendet werden und nicht von unbefugten Parteien oder Skripten aufgerufen werden, auf zwei Arten: mit dem Secure
-Attribut und dem HttpOnly
-Attribut:
Set-Cookie: id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly
-
Ein Cookie mit dem
Secure
-Attribut wird nur mit einer verschlüsselten Anfrage über das HTTPS-Protokoll an den Server gesendet. Es wird nie mit ungesichertem HTTP (außer auf localhost) gesendet, was bedeutet, dass Man-in-the-Middle-Angreifer nicht leicht darauf zugreifen können. Unsichere Seiten (mithttp:
in der URL) können keine Cookies mit demSecure
-Attribut setzen. Nehmen Sie jedoch nicht an, dassSecure
jeglichen Zugriff auf sensible Informationen in Cookies vollständig verhindert. Jemand mit Zugriff auf die Festplatte des Clients (oder JavaScript, wenn dasHttpOnly
-Attribut nicht gesetzt ist) kann die Informationen lesen und ändern. -
Ein Cookie mit dem
HttpOnly
-Attribut kann nicht von JavaScript, zum Beispiel mitDocument.cookie
, aufgerufen werden; es kann nur aufgerufen werden, wenn es den Server erreicht. Cookies, die Benutzersitzungen aufrechterhalten, sollten zum Beispiel dasHttpOnly
-Attribut gesetzt haben – es wäre wirklich unsicher, sie JavaScript zur Verfügung zu stellen. Diese Vorsichtsmaßnahme hilft, Cross-Site-Scripting (XSS)-Angriffe abzumildern.
Hinweis: Abhängig von der Anwendung möchten Sie möglicherweise einen opaken Bezeichner verwenden, den der Server nachschlägt, anstatt sensible Informationen direkt in Cookies zu speichern, oder untersuchen Sie alternative Authentifizierungs-/Vertraulichkeitsmechanismen wie JSON Web Tokens.
Definieren, wohin Cookies gesendet werden
Die Attribute Domain
und Path
definieren den Geltungsbereich eines Cookies: Welche URLs die Cookies gesendet werden.
-
Das
Domain
-Attribut gibt an, welcher Server ein Cookie empfangen kann. Falls angegeben, sind Cookies auf dem angegebenen Server und seinen Subdomains verfügbar. Zum Beispiel, wenn SieDomain=mozilla.org
vonmozilla.org
setzen, sind Cookies auf dieser Domain und ihren Subdomains wiedeveloper.mozilla.org
verfügbar.httpSet-Cookie: id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly; Domain=mozilla.org
Wenn der
Set-Cookie
-Header keinDomain
-Attribut angibt, sind die Cookies auf dem Server verfügbar, der sie gesetzt hat, aber nicht auf seinen Subdomains. Daher ist das Angeben vonDomain
weniger restriktiv als das Weglassen davon. Beachten Sie, dass ein Server dasDomain
-Attribut nur auf seine eigene Domain oder eine übergeordnete Domain setzen kann, nicht auf eine Subdomain oder eine andere Domain. So könnte ein Server mit der Domainfoo.example.com
das Attribut beispielsweise aufexample.com
oderfoo.example.com
setzen, aber nichtbar.foo.example.com
oderelsewhere.com
(die Cookies würden jedoch immer noch an die Subdomains wiebar.foo.example.com
gesendet). Siehe Ungültige Domains für mehr Details. -
Das
Path
-Attribut gibt einen URL-Pfad an, der in der angeforderten URL vorhanden sein muss, um denCookie
-Header zu senden. Beispielsweise:httpSet-Cookie: id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly; Path=/docs
Der
%x2F
("/")-Charakter wird als Verzeichnistrennzeichen betrachtet, und Unterverzeichnisse stimmen ebenfalls überein. Zum Beispiel, wenn SiePath=/docs
setzen, stimmen diese Anforderungspfade überein:/docs
/docs/
/docs/Web/
/docs/Web/HTTP
Aber diese Anforderungspfade nicht:
/
/docsets
/fr/docs
Steuerung von Drittanbieter-Cookies mit SameSite
Das SameSite
-Attribut lässt Server angeben, ob/wann Cookies bei Cross-Site-Anfragen gesendet werden — d.h. Drittanbieter-Cookies. Cross-Site-Anfragen sind Anfragen, bei denen die Seite (die registrierbare Domain) und/oder das Schema (http oder https) nicht mit der Seite übereinstimmen, die der Nutzer derzeit besucht. Dazu gehören Anfragen, die gesendet werden, wenn Links auf anderen Seiten angeklickt werden, um auf Ihre Seite zu navigieren, und jede Anfrage, die von eingebettetem Drittanbieter-Inhalt gesendet wird.
SameSite
hilft, den Informationsaustausch zu verhindern, die Benutzer-Privatsphäre zu wahren und bietet einen gewissen Schutz vor Cross-Site-Request-Forgery-Angriffen. Es nimmt drei mögliche Werte an: Strict
, Lax
und None
:
-
Strict
bewirkt, dass der Browser das Cookie nur als Antwort auf Anfragen sendet, die von der Ursprungsseite des Cookies stammen. Dies sollte verwendet werden, wenn Sie Cookies verwenden, die sich auf Funktionalitäten beziehen, die immer hinter einer ersten Navigation stehen, wie z.B. Authentifizierung oder die Speicherung von Warenkorbinformationen.httpSet-Cookie: cart=110045_77895_53420; SameSite=Strict
Hinweis: Cookies, die für sensible Informationen verwendet werden, sollten auch eine kurze Lebensdauer haben.
-
Lax
ist ähnlich, außer dass der Browser das Cookie auch sendet, wenn der Benutzer zur Ursprungsseite des Cookies navigiert (auch wenn der Benutzer von einer anderen Website kommt). Dies ist nützlich für Cookies, die die Anzeige einer Website beeinflussen — zum Beispiel könnten Sie Partnerproduktinformationen zusammen mit einem Affiliate-Link auf Ihrer Website haben. Wenn dieser Link auf die Partnerwebsite gefolgt wird, möchten sie möglicherweise ein Cookie setzen, das angibt, dass der Affiliate-Link gefolgt wurde, was ein Belohnungsbanner anzeigt und einen Rabatt gewährt, wenn das Produkt gekauft wird.httpSet-Cookie: affiliate=e4rt45dw; SameSite=Lax
-
None
gibt an, dass Cookies sowohl bei ausgehenden als auch bei Cross-Site-Anfragen gesendet werden. Dies ist nützlich, wenn Sie Cookies zusammen mit Anfragen versenden möchten, die von drittanbieter-inhalten auf anderen Webseiten eingebettet werden, wie zum Beispiel Werbe- oder Analyseanbietern. Beachten Sie, dass, wennSameSite=None
gesetzt ist, auch dasSecure
-Attribut gesetzt werden muss —SameSite=None
erfordert einen sicheren Kontext.httpSet-Cookie: widget_session=7yjgj57e4n3d; SameSite=None; Secure; HttpOnly
Wenn kein SameSite
-Attribut gesetzt ist, wird das Cookie standardmäßig als Lax
behandelt.
Cookie-Präfixe
Aufgrund des Designs des Cookie-Mechanismus kann ein Server nicht bestätigen, dass ein Cookie von einem sicheren Ursprung gesetzt wurde oder sogar wo ein Cookie ursprünglich gesetzt wurde.
Eine anfällige Anwendung auf einer Subdomain kann ein Cookie mit dem Domain
-Attribut setzen, das den Zugriff auf dieses Cookie auf allen anderen Subdomains ermöglicht. Dieser Mechanismus kann bei einem Session-Fixation-Angriff missbraucht werden. Siehe Session-Fixation für primäre Abhilfemethoden.
Als Verteidigung-in-der-Tiefe-Maßnahme, jedoch, können Sie Cookie-Präfixe verwenden, um bestimmte Fakten über das Cookie zu bestätigen. Zwei Präfixe stehen zur Verfügung:
__Host-
: Wenn ein Cookie-Name dieses Präfix hat, wird es in einemSet-Cookie
-Header nur akzeptiert, wenn es auch dasSecure
-Attribut enthält, es von einem sicheren Ursprung gesendet wurde, keinenDomain
-Attribut hat und dasPath
-Attribut auf/
setzt. Mit anderen Worten, das Cookie ist domain-locked.__Secure-
: Wenn ein Cookie-Name dieses Präfix hat, wird es in einemSet-Cookie
-Header nur akzeptiert, wenn es dasSecure
-Attribut enthält und von einem sicheren Ursprung gesendet wurde. Dies ist schwächer als das__Host-
-Präfix.
Der Browser lehnt Cookies mit diesen Präfixen ab, die nicht ihren Einschränkungen entsprechen. Dies stellt sicher, dass von Subdomains erstellte Cookies mit Präfixen entweder auf eine Subdomain beschränkt sind oder vollständig ignoriert werden. Da der Anwendungsserver nur auf einen spezifischen Cookie-Namen überprüft, um festzustellen, ob der Benutzer authentifiziert ist oder ein CSRF-Token korrekt ist, dient dies effektiv als Abwehrmaßnahme gegen Session-Fixation.
Hinweis:
Auf dem Server muss die Webanwendung den vollständigen Cookienamen einschließlich des Präfixes überprüfen. Benutzeragenten streifen das Präfix nicht vom Cookie ab, bevor sie es in einem Anfrage-Cookie
-Header senden.
Für mehr Informationen über Cookie-Präfixe und den aktuellen Stand der Browserunterstützung, siehe den Abschnitt Präfixe des Set-Cookie-Referenzartikels.
Datenschutz und Tracking
Früher haben wir darüber gesprochen, wie das SameSite
-Attribut verwendet werden kann, um zu kontrollieren, wann Drittanbieter-Cookies gesendet werden, und dass dies helfen kann, die Privatsphäre der Benutzer zu bewahren. Datenschutz ist eine sehr wichtige Überlegung beim Erstellen von Websites, die, wenn sie richtig gemacht werden, das Vertrauen Ihrer Benutzer aufbauen können. Wenn es schlecht gemacht wird, kann es dieses Vertrauen vollständig untergraben und eine Vielzahl anderer Probleme verursachen.
Drittanbieter-Cookies können von fremden Inhalten, die über <iframe>
s in Seiten eingebettet sind, gesetzt werden. Sie haben viele legitime Verwendungen, die das Teilen von Nutzerprofilinformationen, das Zählen von Anzeigenimpressionen oder das Sammeln von Analysen über verschiedene verwandte Domains umfassen.
Jedoch können Drittanbieter-Cookies auch verwendet werden, um unheimliche, invasive Benutzererfahrungen zu schaffen. Ein Drittanbieterserver kann ein Profil der Browserhistorie und -gewohnheiten eines Benutzers basierend auf Cookies erstellen, die ihm von demselben Browser beim Zugriff auf mehrere Websites gesendet werden. Das klassische Beispiel ist, wenn Sie auf einer Website nach Produktinformationen suchen und dann von Werbung für ähnliche Produkte überall im Web verfolgt werden.
Browseranbieter wissen, dass Benutzer dieses Verhalten nicht mögen, und als Ergebnis haben alle angefangen, Drittanbieter-Cookies standardmäßig zu blockieren oder zumindest Pläne gemacht, in diese Richtung zu gehen. Drittanbieter-Cookies (oder einfach Tracking-Cookies) können auch von anderen Browsereinstellungen oder Erweiterungen blockiert werden.
Hinweis: Cookie-Blockierung kann dazu führen, dass einige Drittanbieter-Komponenten (wie soziale Medien-Widgets) nicht wie beabsichtigt funktionieren. Da Browser weitere Einschränkungen für Drittanbieter-Cookies verhängen, sollten Entwickler anfangen, nach Wegen zu suchen, ihre Abhängigkeit von ihnen zu reduzieren.
Siehe unseren Artikel Drittanbieter-Cookies für detaillierte Informationen zu Drittanbieter-Cookies, den damit verbundenen Problemen und welchen Alternativen es gibt. Siehe unsere Datenschutz-Landingpage für mehr Informationen zu Datenschutz im Allgemeinen.
Cookie-bezogene Vorschriften
Gesetze oder Vorschriften, die die Verwendung von Cookies abdecken, umfassen:
- Die Allgemeine Datenschutzverordnung (GDPR) in der Europäischen Union
- Die Datenschutzrichtlinie in der EU
- Das California Consumer Privacy Act
Diese Vorschriften haben globale Reichweite. Sie gelten für jede Seite im World Wide Web, die von Nutzern aus diesen Rechtsordnungen aufgerufen wird (die EU und Kalifornien, mit der Einschränkung, dass das kalifornische Gesetz nur auf Entitäten mit einem Bruttoumsatz von über 25 Millionen USD, unter anderem, anwendbar ist).
Diese Vorschriften beinhalten Anforderungen wie:
- Benachrichtigung der Benutzer, dass Ihre Seite Cookies verwendet.
- Ermöglichung der Benutzer, den Empfang einiger oder aller Cookies abzulehnen.
- Ermöglichung der Benutzer, den Großteil Ihres Dienstes ohne den Erhalt von Cookies zu nutzen.
Es gibt möglicherweise andere Vorschriften, die die Verwendung von Cookies in Ihrer Region regeln. Es liegt an Ihnen, diese Vorschriften zu kennen und zu befolgen. Es gibt Unternehmen, die "Cookie-Banner"-Code anbieten, der Ihnen hilft, diese Vorschriften einzuhalten.
Hinweis: Unternehmen sollten die Arten von Cookies, die sie auf ihren Webseiten verwenden, zu Zwecken der Transparenz und zur Einhaltung der Vorschriften offenlegen. Beispielsweise siehe Googles Hinweis zu den Arten von Cookies, die es verwendet und Mozillas Websites, Communications & Cookies Privacy Notice.
Siehe auch
- Verwandte HTTP-Header:
Set-Cookie
,Cookie
- Verwandte JavaScript-APIs:
Document.cookie
,Navigator.cookieEnabled
, Cookie Store API - Drittanbieter-Cookies
- Cookie-Spezifikation: RFC 6265
- Cookies, die GDPR und die Datenschutzrichtlinie