Über jwt

JSON Web Token

JSON-basierter Standard für die Weitergabe von Ansprüchen zwischen Parteien in Webanwendungsumgebungen

JSON Web Token ( JWT , vorgeschlagene Aussprache, wie das Wort "jot" [1] ) ist ein vorgeschlagener Internetstandard zum Erstellen von Daten mit optionaler Signatur und/oder optionaler Verschlüsselung, deren Nutzlast JSON enthält, das eine bestimmte Anzahl von Ansprüchen geltend macht. Die Token werden entweder mit einem privaten Geheimnis oder einem öffentlichen/privaten Schlüssel signiert.

Ein Server könnte z. B. ein Token mit dem Anspruch "Als Administrator angemeldet" generieren und dieses Token einem Client zur Verfügung stellen. Der Client könnte dann dieses Token verwenden, um nachzuweisen, dass er als Administrator angemeldet ist. Die Token können mit dem privaten Schlüssel einer Partei (in der Regel dem des Servers) signiert werden, so dass jede Partei anschließend überprüfen kann, ob das Token legitim ist. Wenn die andere Partei, durch eine geeignete und vertrauenswürdige Mittel, im Besitz des entsprechenden öffentlichen Schlüssels ist, sind auch sie in der Lage, die Legitimität des Tokens zu überprüfen. Die Token sind so konzipiert, dass sie kompakt, [2] URL-sicher, [3] und verwendbar sind, insbesondere im Kontext von Webbrowsern mit einmaligem Anmelden (SSO). JWT-Ansprüche können in der Regel verwendet werden, um die Identität authentifizierter Benutzer zwischen einem Identitätsanbieter und einem Dienstanbieter zu übergeben, oder um einen anderen Typ von Ansprüchen zu übergeben, der von Geschäftsprozessen benötigt wird. [4] [5]

JWT stützt sich auf andere JSON-basierte Standards: JSON Web Signature und JSON Web Encryption. [1] [6] [7]

Structure

Header
Gibt an, welcher Algorithmus zum Generieren der Signatur verwendet wird. Im folgenden Beispiel wird angegeben, dass dieses Token signiert mit HMAC-SHA256.
Typische verwendete kryptographische Algorithmen sind HMAC mit SHA-256 (HS256) und RSA-Signatur mit SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 führt viele weitere für die Authentifizierung und Verschlüsselung ein. [8]
{"alg":"HS256","typ":"JWT"}
Payload
Enthält eine Reihe von Ansprüchen. Die JWT-Spezifikation definiert sieben registrierte Anspruchsnamen, bei denen es sich um die Standardfelder handelt, die üblicherweise in Token enthalten sind. [1] Benutzerdefinierte Ansprüche sind in der Regel auch enthalten, abhängig vom Zweck des Tokens.
Dieses Beispiel verfügt über den standardmäßigen Anspruch "Ausgestellt zum Zeitpunkt" () und einen benutzerdefinierten Anspruch ().
{"loggedInAs":"admin","iat":1422779638}
Sichere Signatur
Validiert das Token. Die Signatur wird berechnet, indem der Header und die Nutzlast mit Base64url EncodingRFC 4648 codiert und mit einem Punkttrennzeichen verkettet werden. Diese Zeichenfolge wird dann durch den kryptografischen Algorithmus geführt, der im Header angegeben ist. In diesem Beispiel wird HMAC-SHA256 mit einem gemeinsamen geheimen Schlüssel verwendet (Public-Key-Algorithmen sind ebenfalls definiert). Die Base64url-Codierung ähnelt base64, verwendet jedoch andere nicht-alphanumerische Zeichen und lässt den Abstand aus.
HMAC_SHA256(secret,base64urlEncoding(header)+'.'+base64urlEncoding(payload))

Die drei Teile werden separat mit Base64url EncodingRFC 4648 codiert und mit Punkten verkettet, um das JWT zu erzeugen:

consttoken=base64urlEncoding(header)+'.'+base64urlEncoding(payload)+'.'+base64urlEncoding(Signatur)

Die obigen Daten und das Geheimnis von "secretkey" erstellt das Token:

(Die obigen JSON-Zeichenfolgen werden ohne Zeilenumbrüche oder Leerzeichen in UTF-8-Byte-Arrays formatiert. Dies ist wichtig, da sich selbst geringfügige Änderungen in den Daten auf das resultierende Token auswirken.)

Dieses resultierende Token kann problemlos an HTML und HTTP übergeben werden. [3]

Verwendung

Bei der Authentifizierung wird bei erfolgreicher Anmeldung eines Benutzers häufig ein JSON Web Token (JWT) zurückgegeben. Dieses Token sollte mithilfe eines sicheren Mechanismus wie . Es wird davon abgeraten, das JWT lokal in Browser-Speichermechanismen wie lokalem oder Sitzungsspeicher zu speichern. Bei unbeaufsichtigten Prozessen kann sich der Client auch direkt authentifizieren, indem er sein eigenes JWT mit einem vorab freigegebenen geheimen Schlüssel generiert und signiert und es wie folgt an einen OAuth-kompatiblen Dienst übergibt:

POST /oauth2/tokenContent-type:application/x-www-form-urlencodedgrant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=eyJhb...

Wenn der Client eine gültige JWT-Assertion übergibt, generiert der Server eine access_token, die für Aufrufe der Anwendung gültig ist, und gibt sie an den Client zurück:

{"access_token":"eyJhb... ","token_type":"Bearer","expires_in":3600}

Wenn der Client auf eine geschützte Route oder Ressource zugreifen möchte, sollte der Benutzeragent das JWT senden, typischerweise im HTTP-Header unter Verwendung des Schemas. Der Inhalt des Headers könnte wie folgt aussehen:

Berechtigung: Bearer eyJhbGci ... <schnipp>... yu5CSpyHI

Hierbei handelt es sich um einen zustandslosen Authentifizierungsmechanismus, da der Benutzerstatus nie im Serverspeicher gespeichert wird. Die geschützten Routen des Servers prüfen, ob im Authorization-Header ein gültiges JWT vorhanden ist, und ob dies der Fall ist vorhanden ist, kann der Benutzer auf geschützte Ressourcen zugreifen. Da JWTs in sich geschlossen sind, sind alle notwendigen Informationen vorhanden, sodass die Datenbank nicht mehrfach abgefragt werden muss.

Standardfelder

akzeptieren. Beschreibung
Codename Beschreibung
Standard-Anspruchsfelder Die Internet-Entwürfe definieren die folgenden Standardfelder ("Ansprüche"), die innerhalb eines JWT-Anspruchssatzes verwendet werden können.
Aussteller Identifiziert den Prinzipal, der das JWT ausgestellt hat.
Subjekt Identifiziert das Subjekt des JWT.
Zielgruppe Identifiziert die Empfänger, für die das JWT bestimmt ist. Jeder Prinzipal, der das JWT verarbeiten soll , muss sich mit einem Wert in der Zielgruppe identifizieren Anspruch. Wenn sich der Hauptverantwortliche, der den Anspruch verarbeitet, nicht mit einem Wert im Anspruch identifiziert, wenn dieser Anspruch vorhanden ist, muss das JWT zurückgewiesen werden.
Ablaufzeit Gibt die Ablaufzeit an, an der und nach der das JWT nicht zur Verarbeitung akzeptiert werden darf. Der Wert muss ein NumericDate: [9] sein, entweder eine ganze Zahl oder eine Dezimalzahl, die Sekunden nach 1970-01-01 00:00:00Z darstellt.
Nicht vor Gibt den Zeitpunkt an, zu dem das JWT zur Verarbeitung akzeptiert wird. Der Wert muss ein NumericDate sein.
Ausgestellt am Gibt den Zeitpunkt an, zu dem das JWT ausgestellt wurde. Der Wert muss ein NumericDate sein.
JWT-ID : Berücksichtigung der Groß- und Kleinschreibung: eindeutige Kennung des Tokens, auch bei verschiedenen Ausstellern.
Häufig verwendete Header-Felder Die folgenden Felder werden häufig in der Kopfzeile eines JWT-Token-Typs verwendet
: Wenn vorhanden, muss er auf einen registrierten IANA-Medientyp gesetzt werden.
Inhaltstyp Wenn geschachtelte Signatur oder Verschlüsselung verwendet wird, wird empfohlen, dies auf ; andernfalls wird dieses Feld weggelassen. [1]
Algorithmus für den Nachrichtenauthentifizierungscode Der Aussteller kann einen Algorithmus frei festlegen, um die Signatur auf dem Token zu überprüfen. Einige unterstützte Algorithmen sind jedoch unsicher. [10]
Schlüssel-ID Ein Hinweis, der angibt, welchen Schlüssel der Client zum Generieren der Tokensignatur verwendet hat. Der Server gleicht diesen Wert mit einem gespeicherten Schlüssel ab, um zu überprüfen, ob die Signatur gültig ist, und die Token ist authentisch.
x.509 Zertifikatskette Eine Zertifikatskette in RFC4945 Format, das dem privaten Schlüssel entspricht, der zum Generieren der Tokensignatur verwendet wird. Der Server verwendet diese Informationen, um zu überprüfen, ob die Signatur gültig und das Token authentisch ist.
x.509 Certificate Chain URL A URL, über die der Server eine Zertifikatkette abrufen kann, die dem privaten Schlüssel entspricht, der zum Generieren der Tokensignatur verwendet wird. Der Server ruft diese Informationen ab und verwendet sie, um zu überprüfen, ob die Signatur authentisch ist.
Kritisch Eine Liste von Headern, die vom Server verstanden werden müssen, um das Token als gültigen
Codenamen zu

Eine Liste der aktuell registrierten Anspruchsnamen kann wie folgt lauten: bezogen von IANA JSON Web Token Claims Registry [11] .

Implementierungen

JWT-Implementierungen gibt es für viele Sprachen und Frameworks, einschließlich, aber nicht beschränkt auf:

Schwachstellen

JSON-Web-Token können den Sitzungsstatus enthalten. Wenn die Projektanforderungen jedoch eine Invalidierung der Sitzung vor Ablauf von JWT zulassen, können Dienste Tokenassertionen allein durch das Token nicht mehr vertrauen. Um zu überprüfen, ob die im Token gespeicherte Sitzung nicht widerrufen wird, müssen Tokenassertionen mit einem Datenspeicher abgeglichen werden. Dadurch werden die Token nicht mehr zustandslos, was den primären Vorteil von JWTs untergräbt. [37]

Der Sicherheitsberater Tim McLean berichtete über Schwachstellen in einigen JWT-Bibliotheken, die das Feld zur falschen Validierung von Token verwendeten, am häufigsten durch das Akzeptieren eines Tokens. Während diese Schwachstellen gepatcht wurden, McLean schlug vor, das Feld ganz abzulehnen, um ähnliche Verwirrung bei der Implementierung zu vermeiden. [10] Dennoch werden immer noch neue Schwachstellen in freier Wildbahn gefunden, wobei vier CVEs, die im Zeitraum 2018-2021 eingereicht wurden, diese Ursache haben. [38] [ bessere Quelle benötigt ]

Mit dem richtigen Design können Entwickler Algorithmus-Schwachstellen beheben, indem sie Vorsichtsmaßnahmen treffen: [39] [40]

  1. Lassen Sie niemals den JWT-Header allein die Verifizierung vorantreiben
  2. Kennen Sie die Algorithmen (vermeiden Sie es, nur vom Feld abhängig zu sein)
  3. Verwenden Sie eine geeignete Schlüsselgröße

Im Jahr 2017 wurde festgestellt, dass mehrere JWT-Bibliotheken anfällig für einen ungültigen Angriff mit elliptischen Kurven sind. [41]

Einige haben argumentiert, dass JSON-Web-Token schwer zu verwenden sind aufgrund der vielen verschiedenen Verschlüsselungsalgorithmen und -optionen, die im Standard verfügbar sind, sicher und dass stattdessen alternative Standards sowohl für Web-Frontends [42] als auch für Backends verwendet werden sollten. [43]

Siehe auch

Referenzen

  1. ^ a b c d Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (Mai 2015). JSON-Web-Token (JWT) . IETF. doi:10.17487/RFC7519. ISSN 2070-1721. RFC7519.
  2. ^ Nickel, Jochen (2016). Meistern Sie das Identitäts- und Zugriffsmanagement mit Microsoft Azure . Packt Publishing. S. 84. ISBN-NUMMER. Abgerufen 20. Juli 2018.
  3. ^ a b "JWT. IO - JSON Web Tokens Introduction". jwt.io . Abgerufen am 20. Juli 2018.
  4. ^ Sevillaja, Chris. "Die Anatomie eines JSON-Web-Tokens". Abgerufen am 8. Mai 2015.
  5. ^ "Atlassian Connect Dokumentation". developer.atlassian.com . Archiviert vom Original am 18. Mai 2015. Abgerufen am 8. Mai 2015.
  6. ^ Jones, Michael B.; Bradley, John; Sakimura, Nat (Mai 2015). "draft-ietf-jose-json-web-signature-41 - JSON-Websignatur (JWS)". tools.ietf.org . Abgerufen am 8. Mai 2015.
  7. ^ Jones, Michael B.; Hildebrand, Joe (Mai 2015). "draft-ietf-jose-json-web-encryption-40 - JSON-Webverschlüsselung (JWE)". tools.ietf.org . Abgerufen am 8. Mai 2015.
  8. ^ Jones, Michael B. (Mai 2015). "draft-ietf-jose-json-web-algorithms-40 - JSON-Webalgorithmen (JWA)". tools.ietf.org . Abgerufen am 8. Mai 2015.
  9. ^ Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (Mai 2015). "exp" (Ablaufzeit) Anspruch". JSON-Web-Token (JWT) . IETF. Abschnitt 4.1.4 doi:10.17487/RFC7519. ISSN 2070-1721. RFC7519.
  10. ^ a b McLean, Tim (31. März 2015). "Kritische Sicherheitslücken in JSON Web Token Bibliotheken". Auth0 verwenden. Abgerufen am 29. März 2016.
  11. ^ "JSON-Web-Token (JWT)". IANA . 23. Januar 2015. Abgerufen am 5. Dezember 2024.
  12. ^ jwt-dotnet auf github.com
  13. ^ libjwt auf github.com
  14. ^ "liquidz/clj-jwt". GitHub . Abgerufen am 7. Mai 2018.
  15. ^ cljwt auf github.com
  16. ^ JustJWT auf github.com
  17. ^ "bryanjos/joken". GitHub . Abgerufen am 7. Mai 2018.
  18. ^ "golang-jwt/jwt". GitHub . Abgerufen am 8. Januar 2018.
  19. ^ "jose: JSON Object Signing and Encryption (JOSE) und JSON Web Token (JWT) Bibliothek". Hackage . Abgerufen am 25. Dezember 2022.
  20. ^ auth0/java-jwt auf github.com
  21. ^ "kjur/jsrsasign". GitHub . Abgerufen am 7. Mai 2018.
  22. ^ "SkyLothar/lua-resty-jwt". GitHub . Abgerufen am 7. Mai 2018.
  23. ^ "jsonwebtoken". npm . Abgerufen am 7. Mai 2018.
  24. ^ ocaml-jwt am github.com
  25. ^ Crypt::JWT am cpan.org
  26. ^ lcobucci/jwt am github.com
  27. ^ Egan, Morten (7. Februar 2019), GitHub - morten-egan/jwt_ninja: PLSQL-Implementierung von JSON-Web-Tokens. , abgerufen am 14. März 2019
  28. ^ "SP3269/posh-jwt". GitHub . Abgerufen am 1. August 2018.
  29. ^ "jpadilla/pyjwt". GitHub . Abgerufen am 21. März 2017.
  30. ^ net-jwt auf pkgs.racket-lang.org
  31. ^ JSON-WebToken auf github.com
  32. ^ ruby-jwt auf github.com
  33. ^ jsonwebtoken auf github.com
  34. ^ rust-jwt auf github.com
  35. ^ jwt-scala auf github.com
  36. ^ [1] auf github.com
  37. ^ Slootweg, Sven. "Beenden Sie die Verwendung von JWT für Sitzungen". joepie91 Geschwafel . Abgerufen am 1. August 2018.
  38. ^ "CVE - Suchergebnisse". cve.mitre.org .
  39. ^ "Häufige JWT-Sicherheitslücken und wie man sie vermeidet". Abgerufen am 14. Mai 2018.
  40. ^ Andreas, Happe. "JWT: Signatur vs. MAC-Angriffe". snikt.net . Abgerufen am 27. Mai 2019.
  41. ^ "Kritische Schwachstelle in JSON Web Encryption". Auth0 - Blog . Abgerufen am 14. Oktober 2023.
  42. ^ "Auf keinen Fall, JOSE! . paragonie.com . Abgerufen am 13. Oktober 2023.
  43. ^ "Fallstricke der JWT-Genehmigung". authzed.com . Abgerufen am 16. November 2023.
  • RFC 7519
  • jwt.io – spezialisierte Website über JWT mit Tools und Dokumentation, gepflegt von Auth0