Einfach erklärt 🍪
Cookies sind kleine Dateien, die Webseiten durch den Browser auf deinem Computer speichern. Sie enthalten Informationen über dich, z. B. deine Spracheinstellungen oder ob du eingeloggt bist. Das hilft, dass Webseiten dich wiedererkennen, wenn du sie später erneut besuchst, damit du dich nicht ständig neu anmelden musst.
Manche Cookies sind gut, weil sie so das Surfen einfacher machen, aber es gibt auch Cookies, die für gezielte Werbemaßnahmen eingesetzt werden und damit deine Privatsphäre verletzen können. Cookies, die benötigt werden, damit die Webseite funktioniert, heißen technisch notwendige Cookies. Alle anderen Cookies, die beispielsweise für Werbung genutzt werden, heißen technisch nicht notwendige Cookies.
Technisch notwendige Cookies dürfen auch ohne deine Zustimmung verwendet werden, für die Verwendung von technisch nicht notwendigen Cookies musst du zunächst einwilligen. Das kennst du sicherlich von diversen Cookie-Bannern. Das liegt an Datenschutzgesetzen wie der DSGVO, die Nutzern mehr Kontrolle darüber gibt, welche Cookies gespeichert werden dürfen.
Weiteres für Technik-Interessierte 🖥️
Das Hypertext Transfer Protocol (HTTP) ist zunächst ein zustandsloses Protokoll1. Es ist also nicht einfach möglich, bei einer Anfrage von einem Nutzer zu wissen, ob sich dieser bereits angemeldet hat oder die Seite zuvor aufgerufen hat. Selbst wenn wir die IP-Adresse kennen, ist dies nicht eindeutig. Beispielsweise kann eine einzelne IP-Adresse von mehreren Benutzern gleichzeitig genutzt werden (Netzwerkadressübersetzung – NAT). Da es allerdings auch ziemlich umständlich wäre, bei jeder Anfrage alle Daten, die bisher gesendet wurden, erneut zu senden, gibt es als Lösung (unter anderem) Cookies.
Der Server kann in seiner Antwort an den Client in den Header-Daten der HTTP-Response eine Anweisung zum Setzen eines Cookies mitsenden. Der Browser speichert dann entsprechend den Cookie im Textformat als Schlüssel-Wert-Paar ab und sendet ihn (bis er gelöscht wird) bei allen folgenden HTTP-Requests an die Seite im Header mit. Alternativ können auch Technologien wie JavaScript genutzt werden, um Cookies zu setzen. Damit ist es möglich, der Verbindung einen Zustand zu geben und beispielsweise den Bezug zu einem Kundenaccount eines Onlineshops zu speichern, sodass eine erneute Anmeldung nicht bei jedem Laden der Seite notwendig ist.
Der Client (also Browser) hat volle Kontrolle über die lokal gespeicherten Cookies und kann diese entsprechend nach den Anweisungen des Servers löschen und setzen. Aber auch der Nutzer kann über Cookies entscheiden, beispielsweise können in den Browsereinstellungen oftmals alle gespeicherten Cookies auch ohne eine solche Aufforderung vom Server gelöscht werden. Prinzipiell können in Cookies beliebige Inhalte gespeichert werden.
Weiteres für Entwickler 👨💻
Ein Cookie besteht aus einem Namen und einem Wert, es können aber zusätzlich diverse Attribute angegeben werden, wenn ein Cookie gesetzt werden soll. Der Name besteht aus US-ASCII-Zeichen, ausgenommen ASCII-Zeichen 0 bis 31 und ASCII-Zeichen 127 (Steuerzeichen) sowie Leerzeichen, Tabulator und die Zeichen: ( ) < > @ , ; : \ " / [ ] ? = { }
2
Für den Wert sind ebenfalls alle US-ASCII-Zeichen bis auf ASCII-Zeichen 0 bis 31 und ASCII-Zeichen 127, Leerraum, Anführungszeichen, Kommas, Semikolons und Backslashes erlaubt. Um beliebige Werte zu speichern, kann beispielsweise Base64 oder URL-Kodierung genutzt werden. Üblicherweise kann ein Cookie mindestens 4096 Bytes speichern, es können pro Domain mindestens 50 Cookies gesetzt werden und es können insgesamt mindestens 3000 Cookies gespeichert werden. Dennoch sollten so wenig und so kleine Cookies wie möglich genutzt werden.
Moderne Alternativen zu Cookies beinhalten unter anderem LocalStorage und SessionStorage, sowie JSON Web Tokens (JWT).
Cookies mit einem Namen, der den Präfix __Secure
-
hat, müssen mit dem secure
-Flag über eine sichere Verbindung (HTTPS) gesetzt werden. Wenn der Name mit dem Präfix __Host
-
beginnt, wird ein Cookie nur an die Host-Subdomain oder Domain gesendet, die ihn gesetzt hat. Dafür muss der Cookie ebenfalls mit der secure
-Flag und über HTTPS gesetzt werden. Zusätzlich darf keine Domain angegeben werden und der Pfad muss /
sein.
Diverse Attribute, die bei der Erstellung von Cookies gesetzt werden können, und weitere Informationen zum Setzen von Cookies finden sich unter anderem in den Mozilla Developer Network Web Docs. Weitergehende technischere Definitionen für Cookies und deren Umsetzung finden sich unter anderem im RFC 6265. Neben den entsprechenden Spezifikationen werden Cookies jedoch je nach Browser unterschiedlich implementiert, sodass es auch zu Unterschieden in den Sicherheitsmechanismen kommen kann.
Eine Webanwendung sollte sich auch nicht einfach auf den Inhalt von Cookies verlassen, da dieser entsprechend vom Nutzer geändert werden kann. Es ist also unsicher, beispielsweise die Rolle des Nutzers nur in einem Cookie als normalen Text (z. B. „Admin“) zu speichern, wenn dieser nicht signiert oder anderweitig geschützt wird. Daher sollten entsprechend sorgfältig die Attribute beim Setzen eines Cookies gewählt und Sicherheitsaspekte über die ganze Webanwendung hin bedacht werden.
Es gibt beispielsweise diverse Webangriffe mit Bezug zu Cookies. Das Session Hijacking durch Cross-Site Scripting (XSS), falls das Cookie kein HttpOnly
-Flag hat oder durch einen Man-in-the-Middle (MITM) Angriff, falls das Cookie nicht mit der Secure
-Flag abgesichert und die Seite über eine unsichere HTTP-Verbingung aufgerufen wird. Bei einer Cross-Site Request Forgery (CSRF) kann ein Angreifer dafür sorgen, dass eine ungewollte Anfrage gesendet wird, die eine gültige Cookie-Autorisierung enthält. Relevant ist hier, wie das SameSite
-Attribut gesetzt wurde und ob CSRF-Token zum Einsatz kommen. Auch Angriffe wie Session Fixation können möglich sein, wenn beispielsweise die Webanwendung die Session-ID aus der URL akzeptiert und anschließend in einem Cookie speichert. Der Angreifer kann dann einen entsprechenden Link präparieren. Hier ist es wichtig, Session-IDs nicht im Uniform Resource Locator (URL) oder in GET-Parametern zu nutzen und entsprechend sichere Session-IDs zu generieren.