JWT

2 tools

Grundlagen der Web-Sicherheit

Web-Sicherheit ist die Praxis, Webanwendungen und APIs vor unbefugtem Zugriff, Datenverletzungen und Angriffen zu schützen. Moderne Anwendungen verwenden Authentifizierung, Autorisierung und Kryptographie.

JSON Web Tokens (JWT) sind der dominante zustandslose Authentifizierungsmechanismus in der modernen Webentwicklung.

JSON Web Tokens (JWT)

Ein JWT ist eine kompakte, URL-sichere Methode, Ansprüche zwischen zwei Parteien darzustellen. Er besteht aus drei Base64url-kodierten Teilen, getrennt durch Punkte.

Die drei Teile eines JWT

Header

Enthält Metadaten über den Token: den Signaturalgorithmus (alg) und den Token-Typ (typ).

Kodiert
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Dekodiert
{
  "alg": "HS256",
  "typ": "JWT"
}
Payload

Enthält die Claims: Aussagen über den Benutzer und zusätzliche Metadaten. Die Payload-Daten sind NICHT verschlüsselt, nur signiert.

Kodiert
eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJhZG1pbiIsImV4cCI6MTcxNzIwMDAwMH0
Dekodiert
{
  "sub": "user_123",
  "role": "admin",
  "exp": 1717200000
}
Signature

Eine kryptographische Signatur über den kodierten Header und Payload. Die Überprüfung dieser Signatur stellt sicher, dass der Token nicht manipuliert wurde.

Kodiert
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Dekodiert
HMACSHA256(
  base64url(header) + "." +
  base64url(payload),
  secret
)

Standard-JWT-Claims

Die JWT-Spezifikation definiert Standard-Claim-Namen für die Interoperabilität:

ClaimNameBeschreibung
issIssuerIdentifiziert den Principal, der den Token ausgestellt hat
subSubjectIdentifiziert den Principal, der das Subjekt des Tokens ist (z.B. Benutzer-ID)
audAudienceIdentifiziert die Empfänger, für die der Token bestimmt ist
expExpirationUnix-Timestamp, nach dem der Token nicht mehr akzeptiert werden darf
nbfNot BeforeUnix-Timestamp, vor dem der Token nicht akzeptiert werden darf
iatIssued AtUnix-Timestamp, zu dem der Token ausgestellt wurde
jtiJWT IDEindeutiger Bezeichner für den Token, verhindert Token-Replay-Angriffe

Signaturalgorithmen

Der Signaturalgorithmus wird im JWT-Header deklariert. Die richtige Wahl ist für die Sicherheit entscheidend:

HS256 / HS384 / HS512Symmetrisch (HMAC)

Verwendet einen gemeinsamen geheimen Schlüssel zum Signieren und Verifizieren.

Verwenden wenn: Interne Dienste, bei denen alle Parteien kontrolliert werden.
RS256 / RS384 / RS512Asymmetrisch (RSA)

Verwendet einen privaten Schlüssel zum Signieren und einen öffentlichen Schlüssel zum Verifizieren.

Verwenden wenn: Microservices-Architekturen, Drittanbieter-Token-Verifizierung, OAuth2 und OpenID Connect.
ES256 / ES384 / ES512Asymmetrisch (ECDSA)

Wie RSA, aber mit kleineren Schlüsseln und schnellerer Signierung.

Verwenden wenn: Mobile und IoT-Anwendungen, bei denen Performance wichtig ist.
"alg": "none"Unsigniert — GEFÄHRLICH

Keine Signatur. Ein Token mit alg:none hat keine Integritätsgarantie und kann von jedem gefälscht werden.

Verwenden wenn: Niemals in der Produktion verwenden.

Authentifizierungsabläufe

Passwort-Grant (direkt)
  1. 1.Benutzer sendet Benutzername und Passwort an den Login-Endpunkt
  2. 2.Server validiert Anmeldedaten gegen die Benutzerdatenbank
  3. 3.Server signiert einen JWT mit Benutzer-Claims und Ablaufzeit
  4. 4.Client speichert JWT (localStorage, Cookie oder Speicher)
  5. 5.Client sendet JWT im Authorization: Bearer-Header für nachfolgende Anfragen
Autorisierungscode + PKCE (OAuth2)
  1. 1.Client leitet Benutzer zum Autorisierungsserver mit Code-Challenge weiter
  2. 2.Benutzer authentifiziert sich und autorisiert die Client-Anwendung
  3. 3.Auth-Server leitet zurück mit einem einmaligen Autorisierungscode
  4. 4.Client tauscht Code + Verifier gegen Zugriffs- und Refresh-Token aus
  5. 5.Client verwendet Zugriffstoken für API-Aufrufe; Refresh-Token zur Erneuerung

Häufige JWT-Schwachstellen

JWTs sind sicher, wenn sie korrekt implementiert werden. Dies sind die häufigsten Implementierungsfehler:

Algorithmus-Verwirrung (alg:none)Kritisch

Einige Bibliotheken akzeptieren Tokens mit alg:none. Ein Angreifer kann die Payload ändern und alg auf none setzen, um beliebige JWTs zu fälschen.

HS256/RS256-VerwirrungKritisch

Wenn eine Bibliothek RS256 verifizieren soll, aber HS256 akzeptiert, kann ein Angreifer einen Token mit dem öffentlichen Schlüssel als HMAC-Geheimnis signieren.

Fehlende AblaufvalidierungHoch

Ein JWT ohne exp-Claim oder Code, der exp nicht prüft, ermöglicht die unbegrenzte Verwendung von Tokens.

Sensible Daten in der PayloadHoch

JWT-Payloads sind Base64-kodiert, nicht verschlüsselt. Niemals Passwörter oder andere Geheimnisse in JWT-Claims speichern.

Schwache geheime Schlüssel (HS256)Mittel

HMAC-signierte JWTs mit kurzen oder vorhersehbaren Geheimnissen können offline per Brute-Force geknackt werden.

Fehlende SignaturverifizierungMittel

JWTs ohne Signaturprüfung zu akzeptieren vertraut der Payload vollständig. Die Signatur immer vor dem Vertrauen in Claims verifizieren.

Häufig gestellte Fragen

Sind JWTs verschlüsselt?

Standard-JWTs (JWS) sind signiert, aber NICHT verschlüsselt. Die Payload ist Base64url-kodiert, was trivial umkehrbar ist.

Wie lange sollte ein JWT gültig sein?

Zugriffstoken sollten kurzlebig sein: 5–60 Minuten ist typisch. Refresh-Token für den Erhalt neuer Zugriffstoken verwenden.

Wo soll ich JWTs im Browser speichern?

HttpOnly-Cookies sind die sicherste Option — sie sind für JavaScript nicht zugänglich und verhindern XSS-Diebstahl.

Kann ich einen JWT vor dem Ablauf widerrufen?

Nicht ohne serverseitigen Zustand. Lösungen: kurze Ablaufzeiten, eine Token-Sperrliste (Redis).

Was ist der Unterschied zwischen JWT und Session-Cookies?

Session-Cookies speichern eine zufällige Session-ID; der Server sucht die Session-Daten. JWTs sind eigenständig — der Server validiert die Signatur ohne Datenbankabfrage.

Welche Claims soll ich in einen JWT aufnehmen?

Das Minimum: sub (Benutzer-ID), exp (Ablauf) und iat (ausgestellt am). Payloads klein halten.

Ist RS256 besser als HS256?

RS256 (asymmetrisch) ist für die meisten Produktionssysteme besser, da nur der Auth-Server den privaten Schlüssel benötigt.

Was ist PKCE und warum ist es wichtig?

PKCE ist eine Erweiterung des OAuth2-Autorisierungscode-Flows, die Autorisierungscode-Abfangangriffe verhindert. Es ist für öffentliche Clients (SPAs, mobile Apps) erforderlich.