JSON Web Token (JWT) ist ein offener Standard (RFC 7519), der die sichere Datenübertragung in Form eines JSON-Objekts definiert. D.h. JWTs enthalten Daten. Diese Daten können überprüft werden und sind vertrauenswürdig, da JWTs verschlüsselt signiert sind.

Nicht die Daten, sondern nur die Signatur ist verschlüsselt. Wenn hierfür öffentlich/private Schlüsselpaare verwendet werden, ist die Datenintegrität gewährleistet und nur der Besitzer des privaten Schlüssel ist überprüfbar der Aussteller des JWT.

Verwendung

Autorisierung ist das häufigste Szenario für die Verwendung von JWT. Sobald ein Benutzer eingeloggt ist, enthält jeder nachfolgende Request das JWT und dem Benutzer wird der entsprechenden Zugang gewährt. Single Sign On ist eine Funktion, bei der JWT heute verwendet werden, da der Overhead gering ist die Übertragung problemlos über verschiedene Domänen hinweg erfolgen kann.

Informationsaustausch: Mit JSON-Web-Token können Informationen sicher zwischen Parteien übertragen werden, da durch die verschlüsselte Signatur zum einen der Absender überprüft werden kann. Da die Signatur anhand der Kopfzeile und der Nutzdaten berechnet wird, können zum anderen die enthaltenen Daten nicht gefälscht werden.

Aufbau und Struktur

JSON-Web-Token bestehen aus drei Teilen, die durch Punkte "." getrennt sind:

  • Header (Kopfzeile)
  • Payload (Nutzdaten)
  • Signature (Signatur)

xxxxx.yyyyy.zzzzz


Header

Der Header besteht in der Regel aus zwei Teilen: dem Typ des Tokens, d. h. JWT, und dem verwendeten Signieralgorithmus, z. B. HMAC SHA256 oder RSA.

Zum Beispiel:

{
  "alg": "HS256",
  "typ": "JWT"
}

Dieser JSON-Code wird in Base64Url kodiert und bildet den ersten Teil des JWT.

Payload

Der zweite Teil des Tokens bilden die Nutzdaten, die sogenannte "Claims" (hier dt. Behauptungen) enthält. Claims sind Aussagen über eine Entität (in der Regel der Benutzer) und zusätzliche Daten. Es gibt drei Arten von Claims: registrierte, öffentliche und private Claims:

Registrierte Claims sind vordefinierten Angaben, die nicht obligatorisch sind, aber empfohlen werden, um eine Reihe nützlicher, interoperabler Angaben bereitzustellen. Einige von ihnen sind: iss (issuer = Aussteller), exp (expiry = Verfallszeit), sub (Subjekt), aud (auditory = Publikum) und andere.
(Die Claim-Bezeichner sind nur drei Zeichen lang sind, da JWTs kompakt sein sollen.)

Öffentliche Claims nach Belieben definiert werden. (Um Kollisionen zu vermeiden, sollten sie jedoch in der IANA JSON Web Token Registry oder als URI definiert werden, die einen kollisionssicheren Namensraum enthält.)

Private Claims sind benutzerdefinierte Angaben für den Informationsaustausch zwischen Parteien, die sich auf deren Verwendung einigen, und die weder registriert noch öffentlich sind.

Ein Beispiel für eine Nutzdaten könnte sein:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Auch die Nutzdaten werden mit Base64Url kodiert und bilden so den zweiten Teil des JSON-Web-Tokens.

Diese Informationen sind bei signierten Token zwar gegen Manipulationen geschützt, aber dennoch von jedermann lesbar. Geheime Informationen in den Nutzdaten oder im Header eines JWTs müssen extra verschlüsselt werden.

Signatur

Die Signatur wird erstellt, indem der Base64Url-kodierte Header und die Nutzdaten zusammen mit einem Secret mit dem im Header angegebenen Algorithmus zusammen verschlüsselt werden:

Beispiel der Signaturerstellung mit dem HMAC SHA256 Algorithmus:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  geheim)

Mit der Signatur kann überprüft werden, ob die Nachricht unterwegs verändert wurde. Wurde mit einem privaten Schlüssel signiert, kann damit auch überprüft werden, ob der Absender des JWT derjenige ist, der er vorgibt zu sein.

Header, Payload und Signatur zusammengenommen

Das Ergebnis sind drei durch Punkte getrennte Base64-URL-Strings, die problemlos in HTML- und HTTP-Umgebungen weitergegeben werden können und im Vergleich zu XML-basierten Standards wie SAML kompakter sind.

JWT mit den oben verwendeten Beispielen:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Der jwt.io - Debugger kann verwendet werden, um JWTs zu dekodieren, zu verifizieren und zu generieren:

jwt.io - Debugger
jwt.io - Debugger

Quelle:

https://jwt.io/introduction    (15.12.2022)


Empfehlenswert ist folgende Präsentation zu JWT (englisch):

 

 


Last modified: Thursday, 15 December 2022, 6:33 PM