JWT Generator

Signierte JSON Web Tokens mit HMAC-SHA256/384/512 erzeugen

{{ error }}

Was ist ein JWT?

Ein JSON Web Token (JWT, RFC 7519) ist ein kompakter, signierter Container für JSON-Daten. Er besteht aus drei Base64URL-kodierten Teilen, durch Punkte getrennt: Header (Algorithmus), Payload (Claims) und Signature. JWTs werden für stateless Authentifizierung in APIs (Bearer-Token), OAuth/OpenID Connect und Single-Sign-On eingesetzt.

Welcher Algorithmus?

HS256/384/512 sind symmetrische HMAC-Algorithmen — Sender und Empfänger teilen denselben Secret. Sie sind einfach und schnell, eignen sich für interne APIs. Für öffentliche APIs nutzt man asymmetrisches RS256 oder ES256 (Public-/Private-Key) — diese werden vom Web Crypto API ebenfalls unterstützt, sind aber komplexer in der Schlüsselverwaltung. `none` (unsigned) sollte niemals in Produktion verwendet werden.

Wichtige Sicherheitshinweise

  • Niemals geheime Daten in den Payload schreiben — JWTs sind nur signiert, nicht verschlüsselt
  • Secret muss mindestens so lang sein wie der Hash-Output (256/384/512 Bit)
  • Immer exp/nbf-Claims setzen und beim Empfang validieren

Was beim Signieren technisch passiert

Ein JWT wird in drei Schritten gebaut. Zuerst werden Header und Payload je als JSON serialisiert. Dann durchlaeuft jeder Teil Base64URL-Encoding (RFC 4648 §5) — die URL-sichere Variante mit -/_ statt +//, ohne Padding-Gleichheitszeichen. Aus diesen beiden kodierten Strings wird der signing input als base64url(header) + "." + base64url(payload). Erst dieser komplette String wird signiert, nicht der Roh-JSON. Das ist wichtig: zwei semantisch identische, aber verschieden serialisierte Header (anderes Key-Order, Whitespace) ergeben verschiedene Signaturen — wer Tokens vergleicht, muss die kanonische Form nehmen, nicht die geparsten Objekte.

Die HMAC-Familie (HS256/384/512) verwendet einen geteilten Schluessel und ist symmetrisch — wer signieren kann, kann auch verifizieren. Praktisch fuer monolithische Apps mit einem einzigen Backend, problematisch sobald mehrere Services verifizieren sollen, weil das Secret in jedem davon liegen muss. RS256 (RSA-PKCS1-v1.5 + SHA-256, RFC 3447) und ES256 (ECDSA mit P-256) sind asymmetrisch: der Issuer haelt den Private Key, alle Verifier brauchen nur den Public Key — der per JWKS-Endpunkt unter /.well-known/jwks.json verteilt wird. Fuer neue Systeme empfiehlt RFC 8037 ausdruecklich EdDSA (Ed25519): keine Padding-Tricks, deutlich kuerzere Signaturen (~88 Byte Base64 statt 256 Byte fuer 2048-Bit-RSA) und konstantzeitige Verifizierung.

alg: none ist im Standard erlaubt und sorgt seit Jahren fuer Sicherheitsluecken. Die offizielle Empfehlung der RFC 8725 ("JWT Best Current Practices") lautet: never accept alg: none. Beim Verifier strikte Algorithm-Whitelist, idealerweise ein konkreter Algorithmus pro Endpoint. Die zweite Praxisempfehlung: typ auf JWT setzen, cty nur bei nested JWS/JWE. Der dritte Punkt: kid nutzen, sobald mehr als ein Key im Umlauf ist, damit Rotation moeglich wird. Beim Generator hier ist der Output das, was du in den Authorization-Header packen kannst: Authorization: Bearer <token>.

JWT in fuenf Schritten erstellen

So baust du ein produktionsreifes Token, das gaengige Verifier akzeptieren.

  1. Header definieren: {"alg":"HS256","typ":"JWT"} fuer einfache Setups oder {"alg":"RS256","typ":"JWT","kid":"key-2024-01"} bei Key-Rotation.
  2. Payload mit Standard-Claims fuellen: iss (wer hat ausgestellt), sub (User-ID), aud (welcher Service darf das Token nutzen), iat, exp (Unix-Sekunden).
  3. Eigene Claims hinzufuegen: roles, tenant_id, scope. Kein Passwort, keine PII — JWT ist nicht verschluesselt.
  4. Geheimes Secret oder Private Key waehlen. Fuer HS256 mindestens 32 zufaellige Bytes, base64-kodiert — z.B. openssl rand -base64 32. Niemals "secret" oder "changeme" in Produktion.
  5. Token signieren, kopieren und im HTTP-Header weitergeben: Authorization: Bearer eyJhbGci.... Die Empfaengerseite verifiziert mit demselben Secret oder dem passenden Public Key.

Typische Token fuer reale Anwendungsfaelle

Diese Beispiele zeigen Payloads, wie sie in echten Production-Systemen erzeugt werden.

  • Access-Token fuer eine REST-API: {"sub":"u_42","iat":1700000000,"exp":1700003600,"aud":"api.example.com","scope":"read:profile write:posts"} — eine Stunde gueltig.
  • Refresh-Token: {"sub":"u_42","iat":...,"exp":...+2592000,"typ":"refresh","jti":"uuid-..."} — 30 Tage gueltig, mit jti fuer Revocation.
  • Magic-Link / Password-Reset: {"sub":"u_42","purpose":"reset","iat":...,"exp":...+900,"jti":"..."} — 15 Minuten gueltig, einmalig nutzbar via jti-Blacklist.
  • Service-to-Service-Token: {"iss":"billing-svc","sub":"billing-svc","aud":"users-svc","iat":...,"exp":...+60} — sehr kurz lebig, identifiziert den aufrufenden Service.
  • OIDC ID-Token: {"iss":"https://auth.example.com","sub":"user-42","aud":"client-id","email":"[email protected]","nonce":"...","iat":...,"exp":...} — Identitaetsnachweis fuer Login.

Worauf du beim Signieren achten musst

Erster Punkt: das HS256-Secret muss kryptografisch zufaellig sein. Ein Woerterbuch-Wort wird in Sekunden geknackt — generiere mit openssl rand -base64 32 oder crypto.randomBytes(32). Zweiter Punkt: kurze exp-Zeiten. Access-Tokens sollten maximal 15 Minuten gueltig sein, ID-Tokens maximal eine Stunde, Refresh-Tokens duerfen laenger leben, brauchen dann aber Revocation. Dritter Punkt: Token-Groesse. Jedes Byte landet in jedem HTTP-Header. Bei mehr als 1 KB triggern manche Proxies und Loadbalancer einen 431 Request Header Fields Too Large. Vierter Punkt: alg: none nutzt dieser Generator nur fuer Demos — niemals in Produktion akzeptieren. Fuenfter Punkt: die kryptografischen Operationen laufen hier im Browser via Web Crypto API; das Secret verlaesst dein Geraet nicht, aber es wird im JavaScript-Speicher gehalten. Vermeide dieses Tool fuer Produktions-Secrets auf ungeschuetzten Maschinen.

Haeufige Fragen zum JWT-Erstellen

Wie generiere ich ein sicheres HS256-Secret?
Mit openssl rand -base64 32 oder node -e "console.log(require('crypto').randomBytes(32).toString('base64'))". Mindestlaenge: 256 Bit (32 Byte) fuer HS256, 384 Bit fuer HS384, 512 Bit fuer HS512. Speichere es in einem Secret-Manager wie Vault, AWS Secrets Manager oder Doppler — niemals im Git-Repo.
Soll ich HS256 oder RS256 nutzen?
HS256 nimmst du, wenn Issuer und Verifier dieselbe vertraute Codebasis sind. RS256 (oder besser EdDSA) nimmst du, sobald mehrere Services oder Dritte verifizieren — du verteilst dann den Public Key via JWKS und behaeltst den Private Key beim Issuer. Auth0, Cognito und Keycloak setzen standardmaessig auf RS256.
Welche Claims sind Pflicht?
RFC 7519 verlangt keine Claim formal. In der Praxis solltest du immer setzen: iss, sub, aud, iat, exp. Fuer Revocation zusaetzlich jti. OIDC-Spec verlangt zusaetzlich nonce bei Authorization-Code-Flow mit Implicit-Anteil.
Wie lange sollte exp sein?
Faustregel: Access-Tokens 5–15 Minuten, ID-Tokens 1 Stunde, Refresh-Tokens 7–30 Tage. Kuerzer ist sicherer, weil ein abgefangenes Token schneller wertlos wird. Sehr kurze Zeiten brauchen einen funktionierenden Refresh-Mechanismus, sonst kommt der Nutzer alle paar Minuten in einen Login-Dialog.
Kann ich ein JWT verschluesseln?
Ja, mit JWE (JSON Web Encryption, RFC 7516) statt JWS. Statt zwei Punkten hat ein JWE fuenf Punkte: header.encryptedKey.iv.ciphertext.tag. In der Praxis brauchen die wenigsten APIs JWE — ueblicher ist TLS (das den ganzen Transport verschluesselt) plus eine signierte aber unverschluesselte JWS.
Verlaesst mein Secret hier den Browser?
Nein. Die Signierung laeuft komplett im Browser via Web Crypto API (crypto.subtle.sign). Es wird kein Request an einen Server gesendet, das Secret existiert nur in deinem RAM. Du kannst die Seite offline laden und es funktioniert weiter. Trotzdem gilt: Produktiv-Secrets nur auf einem Geraet eingeben, dem du komplett vertraust.

Verwandte Tools