Was ist JSON Web Token (JWT)?
Erhalten Sie ein klares Verständnis der Grundlagen von JSON Web Token (JWT) in 5 Minuten.
JSON Web Token (JWT) wird häufig in modernen Webanwendungen und offenen Standards wie OpenID Connect verwendet, um die Authentifizierung und Autorisierung zu erleichtern. Während der offizielle RFC 7519 als wesentliche Referenz dient, kann es für Anfänger schwierig sein, ihn zu verstehen. In diesem Artikel konzentrieren wir uns auf die Kernkonzepte von JWT und präsentieren sie in einfacher Sprache mit Beispielen.
Warum brauchen wir JWT?
Heutzutage ist es ziemlich üblich, JSON zum Austausch von Daten zwischen zwei Parteien zu verwenden. Betrachten Sie ein JSON-Objekt, das einen Benutzer darstellt:
sub
steht für "subject", was ein standardisierter Anspruch in OpenID Connect ist, um die Benutzeridentifikation (Benutzer-ID) darzustellen.
Wie können wir die Integrität dieses JSON-Objekts garantieren? Mit anderen Worten, wie können wir sicherstellen, dass die Daten während der Übertragung nicht manipuliert wurden? Eine gängige Lösung ist die Verwendung von digitalen Signaturen. Zum Beispiel können wir Public-Key-Kryptografie verwenden: Der Server signiert das JSON-Objekt mit seinem privaten Schlüssel, und der Client kann die Signatur mit dem öffentlichen Schlüssel des Servers überprüfen.
Kurz gesagt, JWT bietet einen standardisierten Ansatz zur Darstellung des JSON-Objekts und seiner Signatur.
Das Format von JWT
Da es viele Algorithmen zur Erstellung von digitalen Signaturen gibt, ist es notwendig, den für die JWT-Signatur verwendeten Algorithmus anzugeben. Dies wird durch die Erstellung eines JSON-Objekts erreicht:
alg
steht für "Algorithmus" undtyp
steht für "Typ".
Typischerweise wird typ
auf JWT
in Großbuchstaben gesetzt. Für unser Beispiel ist alg
HS256
, was für HMAC-SHA256 steht (wir erklären es gleich), und zeigt an, dass wir diesen Algorithmus zur Erstellung der Signatur verwenden.
Nun haben wir alle Zutaten für ein JWT:
- Header-JSON: Algorithmus und Typ
- Payload-JSON: Die tatsächlichen Daten
- Signatur: Die Signatur, die Header und Payload umfasst
Allerdings sind bestimmte Zeichen wie Leerzeichen und Zeilenumbrüche nicht netzwerkfähig. Daher müssen der Header und die Payload Base64URL-kodiert werden. Das typische JWT sieht so aus:
Das
.
dient als Trennzeichen.
Lassen Sie uns alles zusammenfassen und ein JWT erstellen:
Kopfteil
JSON: {"alg":"HS256","typ":"JWT"}
Base64URL kodiert: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
JSON: {"sub":"foo","name":"John Doe"}
Base64URL kodiert: eyJzdWIiOiJmb28iLCJuYW1lIjoiSm9obiBEb2UifQ
Signatur
In HMAC-SHA256 wird die Signatur mit einem Geheimnis erstellt:
Zum Beispiel, mit dem Geheimnis als some-great-secret
, wird die Signatur: XM-XSs2Lmp76IcTQ7tVdFcZzN4W_WcoKMNANp925Q9g
.
JWT
Das endgültige JWT ist:
Dieses gültige JWT kann von jeder Partei überprüft werden, die das Geheimnis besitzt.
Wählen Sie den Signaturalgorithmus
Wie bereits erwähnt, gibt es verschiedene Algorithmen zur Erstellung digitaler Signaturen. Wir haben HS256
als Beispiel verwendet, aber es ist möglicherweise nicht stark genug, da das Geheimnis zwischen den Parteien (z. B. dem Client und dem Server) geteilt werden muss.
In realen Szenarien können Clients öffentliche Anwendungen wie React-Apps enthalten, die das Geheimnis nicht sicher aufbewahren können. Infolgedessen ist der bevorzugte Ansatz die Verwendung von Public-Key-Kryptografie (d. h. asymmetrischer Kryptografie) zur Signierung des JWT. Beginnen wir mit dem beliebtesten Algorithmus: RSA.
RSA
RSA, ein asymmetrischer Algorithmus, verwendet ein Schlüsselpaar: einen öffentlichen Schlüssel und einen privaten Schlüssel. Der öffentliche Schlüssel wird verwendet, um die Signatur zu überprüfen, während der private Schlüssel zum Signieren verwendet wird.
Das Header-JSON für RSA sieht so aus:
RS256
steht für RSA-SHA256, was bedeutet, dass die Signatur mit dem RSA-Algorithmus und der SHA256-Hash-Funktion erstellt wird. Sie können auchRS384
undRS512
verwenden, um Signaturen mit den SHA384- und SHA512-Hash-Funktionen zu erstellen.
Die Signatur wird mit dem privaten Schlüssel erstellt:
Auch hier können wir diese Teile zusammenfügen, um ein JWT zu erstellen, und das endgültige JWT sieht so aus:
Jetzt kann der Client die Signatur überprüfen, ohne den privaten Schlüssel zu kennen.
ECDSA
Obwohl RSA weit verbreitet ist, leidet es unter größeren Signaturgrößen, die manchmal die kombinierte Größe von Header und Payload überschreiten. Der Elliptic Curve Digital Signature Algorithm (ECDSA) ist ein weiterer asymmetrischer Algorithmus, der kompaktere Signaturen erstellen kann und leistungsfähiger ist.
Um einen privaten Schlüssel für ECDSA zu generieren, müssen wir eine Kurve auswählen. Dies liegt außerhalb des Rahmens dieses Artikels, aber Sie können hier mehr Informationen finden.
Das Header-JSON für ECDSA sieht so aus:
ES256
steht für ECDSA-SHA256, was bedeutet, dass die Signatur mit dem ECDSA-Algorithmus und der SHA256-Hash-Funktion erstellt wird. Sie können auchES384
undES512
verwenden, um Signaturen mit den SHA384- und SHA512-Hash-Funktionen zu erstellen.
Die Signatur wird mit dem privaten Schlüssel erstellt:
Das endgültige JWT behält die gleiche Struktur wie RSA bei, hat aber eine erheblich kürzere Signatur:
Überprüfen des JWT
Ein JWT zu überprüfen ist so einfach wie der umgekehrte Prozess des Erstellens eines JWT:
- Teilen Sie das JWT in drei Teile (Header, Payload und Signatur) mit dem
.
Trennzeichen. - Dekodieren Sie den Header und die Payload mit Base64URL.
- Überprüfen Sie die Signatur mit dem im Header angegebenen Algorithmus und dem öffentlichen Schlüssel (für asymmetrische Algorithmen).
Es gibt viele Bibliotheken, die zur Überprüfung von JWT zur Verfügung stehen, wie zum Beispiel jose für Node.js und Webbrowser.
Fazit
In diesem Artikel haben wir kurz die Kernkonzepte von JWT erklärt und einen Überblick darüber gegeben, wie man es erstellt und überprüft. Viele Details bleiben unerforscht, und wir werden sie in zukünftigen Artikeln behandeln.
Logto nutzt offene Standards wie JWT und OpenID Connect, um Ihre Apps und APIs mit vereinfachten Workflows für jeden Entwickler zu sichern. Wenn Sie interessiert sind, können Sie es kostenlos ausprobieren (keine Kreditkarte erforderlich).