Sofortantwort
JWT einfach erklärt
Signierte Tokens für sichere Authentifizierung und Informationsübertragung.
- Kurz gesagt
- Selbstbeschreibend: Enthält relevante Claims im Token selbst
- Typischer Einsatz
- API-Authentifizierung, Single Sign-On (SSO), Microservices
- Wichtig zu wissen
- Stateless möglich: Server muss nicht zwingend klassische Sessions speichern
JSON Web Token im Überblick
Ein JWT (JSON Web Token) ist ein signierter Token, der Informationen enthält und bei API-Requests zur Authentifizierung oder Autorisierung mitgesendet werden kann. Der Server kann den Token oft prüfen, ohne eine klassische Session-Datenbank abzufragen.
Der Ablauf:
1. Login
User → [email + password] → Server
Server → [JWT] → User
2. API-Requests
User → [Request + JWT im Header] → Server
Server prüft JWT-Signatur
Server → [Response] → User
JWT-Struktur:
base64url(header).
base64url(payload).
base64url(signature)
Header.Payload.Signature
| Teil | Inhalt | Beispiel |
|---|---|---|
| Header | Algorithmus, Typ | {"alg": "HS256", "typ": "JWT"} |
| Payload | Claims (Daten) | {"sub": "user-id", "exp": expiry_timestamp} |
| Signature | Signatur | HMAC-SHA256(header + payload, secret) |
Technisch betrachtet
JWT erstellen
Node.js Beispiel:
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{
sub: userId,
role: userRole,
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + accessTokenLifetime
},
process.env.JWT_SECRET,
{ algorithm: 'HS256' }
);
JWT verifizieren
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
console.log(decoded);
// { sub: userId, role: userRole, ... }
} catch (err) {
if (err.name === 'TokenExpiredError') {
// Token abgelaufen
} else if (err.name === 'JsonWebTokenError') {
// Ungültige Signatur
}
}
Standard Claims
| Claim | Name | Beschreibung |
|---|---|---|
iss | Issuer | Wer hat den Token ausgestellt? |
sub | Subject | Für wen ist der Token? (User ID) |
aud | Audience | Für welchen Service? |
exp | Expiration | Wann läuft er ab? |
iat | Issued At | Wann wurde er ausgestellt? |
nbf | Not Before | Ab wann gültig? |
jti | JWT ID | Eindeutige Token-ID |
Access + Refresh Token Pattern
Login:
Server → kurzlebiges Access Token + länger geschütztes Refresh Token
API-Request:
Client → Access Token → Server
↓
Abgelaufen?
↓
Client → Refresh Token → Server
Server → Neuer Access Token → Client
Warum zwei Tokens?
- Access Token: Kurz, oft verwendet, bei Leak begrenzt Schaden
- Refresh Token: Lang, selten verwendet, sicher gespeichert
Sicherheits-Best-Practices
Do:
- TLS für Transportverschlüsselung verwenden
- starke Schlüssel und sichere Key-Verwaltung nutzen
- Laufzeiten risikobasiert begrenzen
- Algorithmus explizit prüfen
- Audience und Issuer validieren
Don’t:
- sensible Daten im Payload vermeiden
none-Algorithmus oder unerwartete Algorithmen nicht akzeptieren- Speicherort im Client gegen XSS/CSRF-Risiken abwägen
- überlange Laufzeiten vermeiden
- schwache oder hardcodierte Secrets vermeiden
JWT vs. Session
| Aspekt | JWT | Session |
|---|---|---|
| Speicherort | Client | Server |
| Skalierung | oft einfacher stateless möglich | benötigt Session Store oder Replikation |
| Invalidierung | ohne Zusatzmechanismen schwieriger | zentral oft einfacher |
| Größe | größer, weil Claims enthalten sein können | klein, meist nur ID |
| Microservices | häufig gut nutzbar | abhängig von Session-Architektur |
Algorithmen
| Algorithmus | Typ | Empfehlung |
|---|---|---|
| HS256 | Symmetric (HMAC) | passend bei sicher geteilter Secret-Verwaltung |
| RS256 | Asymmetric (RSA) | häufig bei verteilter Verifikation |
| ES256 | Asymmetric (ECDSA) | kompaktere Signaturen möglich |
| none | keine Signatur | in produktiven Auth-Flows nicht akzeptieren |
Schritt für Schritt
Ein Token sicher ausstellen und prüfen
Ein JWT ist kein verschlüsselter Datentresor. Sein Wert entsteht durch eine korrekte Signaturprüfung und enge Gültigkeitsregeln.
Identität prüfen
Prüfung
Ein vertrauenswürdiger Dienst bestätigt die Identität oder den Servicekontext, bevor ein Token ausgestellt wird.
identitaet -> berechtigter ausstellerMinimale Claims setzen
Claims
Der Token enthält nur nötige Angaben zu Empfänger, Zweck und kurzer Laufzeit – keine vertraulichen Inhalte.
anspruch + empfaenger + ablaufzeitSignieren und senden
Ausgabe
Eine Signatur verbindet Tokeninhalt und ausstellende Stelle. Der Transport erfolgt ausschließlich über geschützte Verbindungen.
claims + signatur -> jwtBei jeder Anfrage validieren
Validierung
Der empfangende Dienst prüft Signatur, Aussteller, Zielgruppe und Ablaufzeit, bevor er eine Aktion zulässt.
jwt -> signatur + issuer + audience + expiry
Konkretes Beispiel
Ein Dienst ruft eine geschützte API auf
Ein Backend übergibt ein Token an einen internen Service.
Token nur decodieren
Der Service liest Angaben aus dem Token, prüft aber nicht zuverlässig, wer ihn signiert hat oder ob er abgelaufen ist.
Token vollständig validieren
Der Service akzeptiert nur erwartete Signaturen und prüft Zielgruppe, Gültigkeit und erforderliche Berechtigungen vor jeder Aktion.
Ein JWT darf erst nach vollständiger Validierung als Grundlage für eine Zugriffsentscheidung dienen.
Einordnung
Vorteile und Grenzen
Das spricht dafür
- Kompakte Übertragung: Ein signierter Token kann die nötigen Ansprüche direkt mit einer Anfrage transportieren.
- Gut für verteilte Dienste: Mehrere Services können Tokens anhand gemeinsamer Vertrauensregeln prüfen.
- Begrenzte Laufzeit möglich: Kurze Gültigkeiten verkleinern das Risiko bei einem abgegriffenen Token.
- Standardisierte Struktur: Claims für Aussteller, Zielgruppe und Ablauf sind klar benennbar und überprüfbar.
Das solltest du beachten
- Payload ist meist lesbar: Vertrauliche Daten gehören nicht in den Tokeninhalt.
- Widerruf braucht Zusatzmechanismen: Rein zustandslose Tokens lassen sich nicht ohne weitere Architektur sofort zentral zurückziehen.
- Prüfung darf nicht unvollständig sein: Signatur allein reicht ohne Zielgruppe, Aussteller und Ablaufzeit nicht aus.
- Lange Laufzeiten erhöhen Risiko: Ein gestohlener gültiger Token kann bis zum Ablauf missbraucht werden.
Vertiefung · für FortgeschritteneVom Anspruch zur verifizierten Anfrage
Ein JWT verbindet Tokeninhalt, ausstellende Identität und Prüfregeln beim empfangenden Dienst.
signierter Token für geprüfte Ansprüche