JSON Web Token (JWT) ist ein offener Standard (RFC 7519) für die sichere Übertragung von Informationen zwischen Parteien in Form eines JSON-Objekts. JWT wird häufig zur Authentifizierung und Autorisierung in modernen Webanwendungen und APIs verwendet. In diesem Artikel werfen wir einen detaillierten Blick darauf, wie JWT-Tokens funktionieren, woraus sie bestehen und wie man sie sicher verwendet.
Was ist JWT?
JWT (ausgesprochen „jot“) ist eine kompakte, URL-sichere Möglichkeit, Ansprüche zwischen zwei Parteien darzustellen. Das Token besteht aus drei durch Punkte getrennten Teilen: Header.Payload.Signatur. Jeder Teil ist in Base64URL.
codiert.Im Gegensatz zu herkömmlichen Sitzungen, bei denen der Server den Status des Benutzers speichert, ist JWT stateless – alle notwendigen Informationen sind im Token selbst enthalten. Dadurch ist JWT ideal für verteilte Systeme und Microservice-Architekturen.
JWT-Token-Struktur
Header (Header)
Der Header enthält normalerweise zwei Felder: Tokentyp (typ) und Signaturalgorithmus (alg). Die gebräuchlichsten Algorithmen sind HS256 (HMAC mit SHA-256) und RS256 (RSA mit SHA-256).
Beispiel-Header:
{
"alg": "HS256",
"typ": "JWT"
}
Nutzlast (Nutzlast)
Payload enthält Ansprüche – Aussagen über den Benutzer und zusätzliche Metadaten. Es gibt drei Arten von Ansprüchen:
- Registrierte Ansprüche – Standardfelder:
iss(Aussteller),exp(Ablaufdatum),sub(Betreff),aud(Publikum),iat(Erstellungszeit) - Öffentliche Ansprüche – in der IANA-Registrierung definiert oder über einen URI verfügen, um Kollisionen zu vermeiden
- Private Ansprüche – beliebige zwischen den Parteien vereinbarte Felder (z. B.
user_id,role)
Beispielnutzlast:
{
"sub": "1234567890",
"name": "John Doe",
"role": "admin",
"iat": 1516239022,
"exp": 1516242622
}
Signatur (Signatur)
Die Signatur wird erstellt, indem Header und Payload in Base64URL codiert, mit einem Punkt verbunden und mit einem geheimen Schlüssel signiert werden. Die Signatur stellt sicher, dass das Token seit seiner Erstellung nicht geändert wurde.
Für HS256 sieht die Formel so aus:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
So funktioniert die JWT-Authentifizierung
Der Authentifizierungsprozess mit JWT sieht normalerweise so aus:
- Login: Der Benutzer sendet seine Zugangsdaten (E-Mail + Passwort) an den Server
- Token-Generierung: Der Server prüft die Daten und erstellt bei Richtigkeit ein JWT mit den notwendigen Ansprüchen
- Storage: Client speichert Token (normalerweise in localStorage oder httpOnly-Cookie)
- Anfragen werden gesendet: Bei jeder Anfrage fügt der Client dem Header ein Token hinzu
Authorization: Bearer <token> - Verification: Server überprüft die Tokensignatur und extrahiert Benutzerdaten aus der Nutzlast
Vorteile von JWT
- Stateless: Der Server muss keine Sitzungen in der Datenbank oder im Speicher speichern
- Skalierbarkeit: Ideal für Microservices – jeder Dienst kann das Token verifizieren
- Domänenübergreifend: JWT ist einfach zwischen verschiedenen Domänen und Diensten zu verwenden
- Kompaktheit: Kleine Größe ermöglicht die Übergabe von Token in URL, POST-Parametern oder Headern
- Selbstversorgung: Alle Informationen zur Autorisierung sind im Token enthalten
JWT-Sicherheit: Best Practices
1. Legen Sie immer ein Ablaufdatum fest
Erstellen Sie niemals Token ohne exp Anspruch. Die empfohlene Lebensdauer eines Zugriffstokens beträgt 15 Minuten bis 1 Stunde. Verwenden Sie für längere Sitzungen Aktualisierungstoken.
2. Verwenden Sie nur http-Cookies
Anstelle von localStorage ist es besser, JWT nur in httpOnly-Cookies zu speichern, auf die JavaScript nicht zugreifen kann. Dies schützt vor XSS-Angriffen. Aktivieren Sie außerdem die Kontrollkästchen Secure und SameSite.
3. Speichern Sie keine sensiblen Daten in Payload
Payload ist nur Base64-codiert, nicht verschlüsselt. Jeder kann es entschlüsseln. Geben Sie niemals Passwörter, Kreditkartennummern oder andere vertrauliche Informationen an.
4. Verwenden Sie zuverlässige Algorithmen
Vermeiden Sie den Algorithmus none. Für eine symmetrische Signatur verwenden Sie HS256 mit einem langen Geheimnis (mindestens 256 Bit).Für asymmetrisch – RS256 oder ES256.
5. Alle Ansprüche validieren
Überprüfen Sie bei der Überprüfung eines Tokens immer Folgendes: exp (nicht abgelaufen), iss (richtiger Aussteller), aud (richtige Zielgruppe). Vertrauen Sie einem Token nicht nur, wenn es eine gültige Signatur hat.
6. Token-Auszahlung implementieren
Obwohl JWT zustandslos ist, müssen Sie manchmal das Token widerrufen (z. B. wenn Sie sich abmelden oder Ihr Passwort ändern). Verwenden Sie dazu eine Blacklist mit Tokens oder eine kurze Lebensdauer mit Refresh-Tokens.
Typische Fehler bei der Arbeit mit JWT
- Fehlende Signaturüberprüfung ist der gefährlichste Fehler, der es Ihnen ermöglicht, einen Token zu fälschen
- Verwendung eines schwachen Geheimnisses – kurze oder vorhersehbare Geheimnisse können mit roher Gewalt aufgegriffen werden
- Storage in localStorage – Anfälligkeit für XSS-Angriffe
- Ablaufzeit ist zu lang – vergrößert das Angriffsfenster, wenn das Token kompromittiert wird
- Übertragung über URL – das Token landet möglicherweise in Serverprotokollen und im Browserverlauf
JWT vs. Sitzungen: Wann sollte man was verwenden
JWT eignet sich am besten für:
- Single Page Applications (SPAs) mit separater API
- Microservice-Architektur
- Mobile Apps
- Systeme mit Single Sign-On(SSO)
Traditionelle Sitzungen sind besser für:
- Server-Webanwendungen (Laravel, Rails, Django)
- Anwendungen, die eine sofortige Sperrung des Zugriffs erfordern
- Einfache Projekte ohne komplexe Architektur
Übung: JWT-Dekodierung
Möchten Sie sehen, was in einem JWT-Token enthalten ist? Verwenden Sie unseren JWT-Decoder – er zerlegt den Token in Komponenten, zeigt den Header und die Nutzlast an und prüft die Signatur. Dies ist ein nützliches Tool für Entwickler beim Debuggen der Authentifizierung.
Fazit
JWT-Tokens sind ein leistungsstarker Authentifizierungsmechanismus für moderne Anwendungen. Sie bieten zustandslose Autorisierung, sind leicht skalierbar und funktionieren zwischen verschiedenen Diensten. Das Wichtigste ist, die Sicherheitsregeln einzuhalten: Legen Sie das Ablaufdatum fest, verwenden Sie zuverlässige Algorithmen, bewahren Sie Token sicher auf und validieren Sie alle Ansprüche. Bei korrekter Verwendung vereinfacht JWT die Architektur erheblich und verbessert die Anwendungsleistung.