Umgang mit Cookies mit Spring Boot und der Servlet-API (2023)

In diesem Artikel geht es um Cookies und verschiedene Möglichkeiten, wie wir sie in Spring Boot implementieren können. Wir geben einen kurzen Überblick darüber, was Cookies sind, wie sie funktionieren und wie wir mit der Servlet-API und Spring Boot damit umgehen können.

Wenn Sie eine Webanwendung erstellen, sind Sie wahrscheinlich an dem Punkt angelangt, an dem die Implementierung von Cookies erforderlich ist. Wenn Sie es nicht getan haben, werden Sie es tun!

Beispielcode

Dieser Artikel wird von einem funktionierenden Codebeispiel begleitetauf GitHub.

Was sind Cookies?

Einfach ausgedrückt sind Cookies nichts anderes als eine Information, die clientseitig (also im Browser) gespeichert wird. Der Client sendet sie mit jeder Anfrage an den Server und die Server können dem Client mitteilen, welche Cookies gespeichert werden sollen.

Sie werden häufig verwendet, um die Aktivität einer Website zu verfolgen, Benutzersitzungen anzupassen und damit Server Benutzer zwischen Anfragen erkennen können. Ein anderes Szenario besteht darin, ein JWT-Token oder die Benutzer-ID in einem Cookie zu speichern, damit der Server bei jeder Anfrage erkennen kann, ob der Benutzer authentifiziert ist.

Wie funktionieren Cookies?

Cookies werden vom Server in einer HTTP-Antwort an den Client gesendet und im Client (Browser des Benutzers) gespeichert.

Der Server setzt das Cookie im genannten HTTP-AntwortheaderSet-Cookie. Ein Cookie besteht aus einem Schlüssel/Wert-Paar sowie weiteren optionalen Attributen, die wir später betrachten werden.

Stellen wir uns ein Szenario vor, in dem sich ein Benutzer anmeldet. Der Client sendet eine Anfrage mit den Anmeldeinformationen des Benutzers an den Server. Der Server authentifiziert den Benutzer, erstellt ein Cookie mit einer codierten Benutzer-ID und setzt es in den Antwortheader. Der HeaderSet-Cookiein der HTTP-Antwort würde so aussehen:

Set-Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t

Sobald der Browser das Cookie erhält, kann er das Cookie an den Server zurücksenden. Dazu fügt der Browser das Cookie zu einer HTTP-Anfrage hinzu, indem er den Header mit dem Namen setztPlätzchen:

Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t

Der Server liest das Cookie aus der Anfrage und überprüft anhand der Tatsache, ob die Benutzer-ID gültig ist, ob der Benutzer authentifiziert wurde oder nicht.

Wie bereits erwähnt, kann ein Cookie weitere optionale Attribute haben. Sehen wir uns diese also genauer an.

Maximales Cookie-Alter und Ablaufdatum

Die AttributeMaximales Alterund/oderLäuft abwerden verwendet, um ein Cookie dauerhaft zu machen. Standardmäßig entfernt der Browser das Cookie, wenn die Sitzung geschlossen wird, es sei dennMaximales Alterund/oderLäuft abeingestellt sind. Diese Attribute werden wie folgt festgelegt:

Set-Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t; Maximales Alter=86400; Läuft ab=Do, 21.01.2021 20:06:48 GMT

Dieses Cookie läuft 86400 Sekunden nach seiner Erstellung oder zu dem im angegebenen Datum und der angegebenen Uhrzeit abLäuft abist bestanden.

Wenn beide Attribute im Cookie vorhanden sind,Maximales Alterhat Vorrang vorLäuft ab.

Cookie-Domäne

Domainist ein weiteres wichtiges Merkmal des Cookies. Wir verwenden es, wenn wir eine Domain für unser Cookie angeben möchten:

Set-Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t; Domain=example.com; Maximales Alter=86400; Läuft ab=Do, 21.01.2021 20:06:48 GMT

Dadurch teilen wir dem Client mit, an welche Domain er das Cookie senden soll. Ein Browser sendet ein Cookie nur an Server dieser Domäne.

Wenn Sie die Domain auf „example.com“ setzen, wird das Cookie nicht nur an die Domain „example.com“ gesendet, sondern auch an deren Subdomains „foo.example.com“ und „bar.example.com“.

Wenn wir die Domäne nicht explizit festlegen, wird sie nur auf die Domäne festgelegt, die das Cookie erstellt hat, nicht jedoch auf deren Unterdomänen.

Cookie-Pfad

DerWegDas Attribut gibt an, wohin ein Cookie innerhalb dieser Domäne übermittelt wird. Der Client fügt das Cookie zu allen Anfragen an URLs hinzu, die mit dem angegebenen Pfad übereinstimmen. Auf diese Weise grenzen wir die URLs ein, bei denen das Cookie innerhalb der Domain gültig ist.

Nehmen wir an, dass das Backend bei einer Anfrage ein Cookie für seinen Client setzthttp://example.com/loginwird ausgeführt:

Set-Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t; Domain=example.com; Weg=/Benutzer/; Maximales Alter=86400; Läuft ab=Do, 21.01.2021 20:06:48 GMT

Beachten Sie, dass dieWegDas Attribut ist auf festgelegt/Benutzer/. Besuchen wir nun zwei verschiedene URLs und sehen wir, was wir in den Anforderungscookies haben.

Wenn wir eine Anfrage an ausführenhttp://example.com/user/, fügt der Browser der Anfrage den folgenden Header hinzu:

Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t

Wie erwartet sendet der Browser das Cookie zurück an den Server.

Wenn wir versuchen, eine weitere Anfrage zu stellenhttp://example.com/contacts/Der Browser wird das nicht enthaltenPlätzchenHeader, weil er nicht mit dem übereinstimmtWegAttribut.

Wenn der Pfad während der Cookie-Erstellung nicht festgelegt wird, wird er standardmäßig verwendet/.

Durch Einstellen derWegExplizit wird das Cookie an die angegebene URL und alle ihre Unterverzeichnisse gesendet.

Sicheres Cookie

In Fällen, in denen wir vertrauliche Informationen im Cookie speichern und möchten, dass diese nur über sichere (HTTPS-)Verbindungen gesendet werden, dann ist dies der FallSicherDas Attribut kommt uns zu Hilfe:

Set-Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t; Domain=example.com; Maximales Alter=86400; Läuft ab=Do, 21.01.2021 20:06:48 GMT; Sicher

Indem man es einstelltSicherstellen wir sicher, dass unser Cookie nur über HTTPS übertragen wird und nicht über unverschlüsselte Verbindungen gesendet wird.

HttpOnlyPlätzchen

HttpOnlyist ein weiteres wichtiges Attribut eines Cookies. Dadurch wird sichergestellt, dass die Client-Skripte nicht auf das Cookie zugreifen. Dies ist eine weitere Form, um ein Cookie vor Veränderungen durch Schadcode oder XSS-Angriffe zu schützen.

Set-Cookie: Benutzer-ID=c2FtLnNtaXRoQGV4YW1wbGUuY29t; Domain=example.com; Maximales Alter=86400; Läuft ab=Do, 21.01.2021 20:06:48 GMT; Sicher; HttpOnly

Nicht alle Browser unterstützen dasHttpOnlyFlagge. Die gute Nachricht ist, dass die meisten von ihnen das tun, aber wenn nicht, wird es ignoriertHttpOnlyFlag, auch wenn es während der Cookie-Erstellung gesetzt wird. Cookies sollten immer seinHttpOnlyes sei denn, der Browser unterstützt dies nicht oder es besteht die Anforderung, sie den Skripten der Clients zugänglich zu machen.

Nachdem wir nun wissen, was Cookies sind und wie sie funktionieren, schauen wir uns an, wie wir sie in Spring Boot verarbeiten können.

Umgang mit Cookies mit der Servlet-API

Schauen wir uns nun an, wie man mit der Servlet-API serverseitig Cookies setzt.

Erstellen eines Cookies

Zum Erstellen eines Cookies mit der Servlet-API verwenden wir diePlätzchenKlasse, die innerhalb der definiert istjavax.servlet.httpPaket.

Der folgende Codeausschnitt erstellt ein Cookie mit NamenBenutzer-IDund Wertc2FtLnNtaXRoQGV4YW1wbGUuY29tund legt alle Attribute fest, die wir besprochen haben:

Cookie jwtTokenCookie= neuPlätzchen("Benutzer-ID", „c2FtLnNtaXRoQGV4YW1wbGUuY29t“);jwtTokenCookie.setMaxAge(86400);jwtTokenCookie.setSecure(WAHR);jwtTokenCookie.setHttpOnly(WAHR);jwtTokenCookie.setPath("/Benutzer/");jwtTokenCookie.setDomain(„example.com“);

Nachdem wir das Cookie erstellt haben, müssen wir es an den Client senden. Dazu fügen wir das Cookie zur Antwort hinzu(HttpServletResponse) und wir sind fertig. Ja, so einfach ist es:

Antwort.addCookie(jwtTokenCookie);

Einen Keks lesen

Nachdem das Cookie zum Antwortheader hinzugefügt wurde, muss der Server die vom Client in jeder Anfrage gesendeten Cookies lesen.

Die MethodeHttpServletRequest#getCookies()gibt eine Reihe von Cookies zurück, die mit der Anfrage gesendet werden. Wir können unser Cookie anhand des Cookie-Namens identifizieren.

Im folgenden Codeausschnitt durchlaufen wir das Array, suchen nach Cookie-Namen und geben den Wert des übereinstimmenden Cookies zurück:

öffentlichOptional<Zeichenfolge> readServletCookie(HttpServletRequest-Anfrage,Stringname){ zurückkehrenArrays.Strom(Anfrage.getCookies()) .Filter(Plätzchen->Name.gleicht(Plätzchen.getName())) .Karte(Plätzchen::Wert erhalten) .finde irgendein();}

Ein Cookie löschen

Um ein Cookie zu löschen, müssen wir eine weitere Instanz davon erstellenPlätzchenmit dem gleichen Namen undmaxAlter0 und fügen Sie es wie folgt erneut zur Antwort hinzu:

Cookie deleteServletCookie= neuPlätzchen("Benutzer-ID", Null);deleteServletCookie.setMaxAge(0);Antwort.addCookie(deleteServletCookie);

Zurück zu unserem Anwendungsfall, bei dem wir das JWT-Token im Cookie speichern: Wir müssten das Cookie löschen, wenn sich der Benutzer abmeldet. Das Weiterbestehen des Cookies nach der Abmeldung des Benutzers kann die Sicherheit ernsthaft gefährden.

Umgang mit Cookies mit Spring

Nachdem wir nun wissen, wie man mit einem Cookie mithilfe der Servlet-API umgeht, schauen wir uns an, wie wir dasselbe mit dem Spring Framework tun können.

Erstellen eines Cookies

In diesem Abschnitt erstellen wir ein Cookie mit denselben Eigenschaften, die wir mit der Servlet-API erstellt haben.

Wir werden die Klasse verwendenResponseCookiefür den Keks undResponseEntityzum Setzen des Cookies in der Antwort. Sie sind beide im Inneren definiertorg.springframework.httpPaket.

ResponseCookiehat eine statische Methodefrom(endgültiger String-Name, endgültiger String-Wert)was a zurückgibtResponseCookieBuilderwird mit dem Namen und Wert des Cookies initialisiert.

Wir können alle benötigten Eigenschaften hinzufügen und die Methode verwendenbauen()des Bauherrn, um das zu erstellenResponseCookie:

ResponseCookie springCookie=ResponseCookie.aus("Benutzer-ID", „c2FtLnNtaXRoQGV4YW1wbGUuY29t“) .httpOnly(WAHR) .sicher(WAHR) .Weg(„/“) .maxAlter(60) .Domain(„example.com“) .bauen();

Nachdem wir das Cookie erstellt haben, fügen wir es wie folgt zum Header der Antwort hinzu:

ResponseEntity.OK() .Header(HttpHeader.SET_COOKIE,FrühlingCookie.toString()) .bauen();

Einen Keks lesen mit@CookieValue

Spring Framework bietet die@CookieValueAnnotation zum Lesen jedes Cookies durch Angabe des Namens, ohne alle aus der Anfrage abgerufenen Cookies durchlaufen zu müssen.

@CookieValuewird in einer Controller-Methode verwendet und ordnet den Wert eines Cookies einem Methodenparameter zu:

@GetMapping(„/read-spring-cookie“)öffentlichZeichenfolgereadCookie( @CookieValue(Name= "Benutzer-ID",Standardwert= „Standardbenutzer-ID“)String-Benutzer-ID) { zurückkehrenBenutzer-ID;}

In Fällen, in denen das Cookie mit dem Namen „Benutzer-ID“ nicht existiert, gibt der Controller den mit definierten Standardwert zurückdefaultValue = „default-user-id“. Wenn wir den Standardwert nicht festlegen und Spring das Cookie in der Anfrage nicht findet, wird ein Fehler ausgelöstjava.lang.IllegalStateExceptionAusnahme.

Ein Cookie löschen

Um ein Cookie zu löschen, müssen wir ein Cookie mit demselben Namen erstellenmaxAlterauf 0 und setzen Sie es auf den Antwortheader:

ResponseCookie deleteSpringCookie=ResponseCookie.aus("Benutzer-ID", Null) .bauen();ResponseEntity.OK() .Header(HttpHeader.SET_COOKIE,deleteSpringCookie.toString()) .bauen();

Abschluss

In diesem Artikel haben wir untersucht, was Cookies sind und wie sie funktionieren.

Alles in allem handelt es sich bei Cookies um einfache Textzeichenfolgen, die Informationen enthalten und mit einem Namen identifiziert werden.

Wir haben einige der optionalen Attribute überprüft, die wir Cookies hinzufügen können, um ihnen ein bestimmtes Verhalten zu ermöglichen. Wir haben gesehen, dass wir sie damit hartnäckig machen könnenMaximales AlterUndLäuft ab, grenzen Sie ihren Umfang mit einDomainUndWeg, lassen Sie diese nur über HTTPS mit übertragenSicher, und verstecken Sie sie mit vor Client-SkriptenHttpOnly.

Abschließend haben wir uns zwei Möglichkeiten zum Umgang mit Cookies mithilfe der Servlet-API und von Spring angesehen. Beide APIs bieten die erforderlichen Methoden zum Erstellen (mit Attributen), Lesen und Löschen von Cookies.

Sie sind einfach zu implementieren und Entwickler können eine davon für die Implementierung von Cookies auswählen.

Sie können mit dem Beispielcode dieses Artikels herumspielenGitHub.

Top Articles
Latest Posts
Article information

Author: Wyatt Volkman LLD

Last Updated: 30/08/2023

Views: 6317

Rating: 4.6 / 5 (66 voted)

Reviews: 81% of readers found this page helpful

Author information

Name: Wyatt Volkman LLD

Birthday: 1992-02-16

Address: Suite 851 78549 Lubowitz Well, Wardside, TX 98080-8615

Phone: +67618977178100

Job: Manufacturing Director

Hobby: Running, Mountaineering, Inline skating, Writing, Baton twirling, Computer programming, Stone skipping

Introduction: My name is Wyatt Volkman LLD, I am a handsome, rich, comfortable, lively, zealous, graceful, gifted person who loves writing and wants to share my knowledge and understanding with you.