Warum JWT in den meisten OAuth 2.0-Diensten
Dieser Artikel erklärt, warum JWT als Format für Zugriffstokens in OAuth 2.0 weit verbreitet ist und hebt seine Vorteile und Einschränkungen hervor.
OAuth 2.0 wird heute weit verbreitet genutzt. Als Kernframework für Autorisierungsdienste ist eine der Hauptaufgaben von OAuth 2.0 die Ausgabe von Zugriffstokens für Benutzer. Wir haben bemerkt, dass viele OAuth-Dienstanbieter auf dem Markt Zugriffstokens im JWT-Format ausgeben.
In diesem Artikel werden wir einführen, was JWT ist und warum es umfassend als Format für Zugriffstoken verwendet wird, die von OAuth 2.0 ausgegeben werden.
Einführung in JWT
JWT steht für JSON Web Token und wird von RFC 7519 wie folgt definiert:
JSON Web Token (JWT) ist ein kompaktes, URL-sicheres Mittel zur Darstellung von Ansprüchen, die zwischen zwei Parteien übertragen werden sollen.
Diese Definition macht deutlich, dass JWT ein Token ist, das verwendet wird, um Ansprüche zwischen verschiedenen Parteien zu übermitteln.
Da JWTs zwischen mehreren Parteien weitergegeben werden, sind sie signiert, um die Integrität und Authentizität der Daten sicherzustellen.
Ein signiertes JWT hat folgendes Format:
Es besteht aus drei durch .
getrennten Teilen: dem Header, dem Payload und der Signatur.
Hier ist ein Beispiel für ein JWT aus der realen Welt:
Du kannst versuchen, es unter https://jwt.io zu parsen:
Wie im Bild gezeigt, enthält der header
-Abschnitt des JWT Informationen über den verwendeten Signatur-Algorithmus und den Typ des Tokens. Der payload
-Abschnitt enthält die vom JWT getragenen Ansprüche, und die signature
wird verwendet, um die Integrität des JWT zu überprüfen.
Da wir nun wissen, was JWT ist und die Bedeutungen seiner verschiedenen Teile verstehen, erklären wir, warum viele OAuth-Autorisierungsdienste JWT als ihr Zugriffstoken wählen.
Vorteile der Verwendung von JWT
Die wichtigsten Unterschiede zwischen JWT und traditionellen zufällig generierten stringbasierten Tokens sind, dass JWTs Informationen tragen können und durch Dekodierung validiert werden können. Diese Unterschiede bringen zwei wesentliche Vorteile mit sich:
- Ressourceneffizienz: JWTs können Informationen über den Benutzer oder die Sitzung tragen, wodurch häufige Datenbankabfragen vermieden werden. Diese Effizienz kann den Ressourcenverbrauch von Diensten reduzieren.
- Verbesserte Verfügbarkeit und Skalierbarkeit: JWTs verringern die Abhängigkeit von serverseitigem Zustandsmanagement. Dies ermöglicht es Diensten, stärker zustandslos zu sein und ihre Verfügbarkeit und Skalierbarkeit zu erhöhen.
Bei Verwendung traditioneller zufällig stringbasierter Tokens sieht der typische Prozess zur Verifikation und Authentifizierung wie folgt aus:
Wie im Diagramm gezeigt, kann ein System, das viele Benutzer und viele verschiedene Ressourcensysteme hat, zu zahlreichen Anfrageanforderungen an den Auth-Server führen.
Im Laufe der Zeit, wenn das System wächst, kann der Auth-Server leicht zu einem Engpass werden, was eine Herausforderung für die gesamte Verfügbarkeit des Dienstes darstellt.
Nach der Einführung von JWTs ändert sich der Validierungsprozess zu:
Dank der Funktion von JWTs, die eine Validierung durch Dekodierung ermöglicht, kann der Ressourcensystem die Integrität von JWTs überprüfen und Benutzerinformationen daraus extrahieren, ohne mit dem Auth-Server zu interagieren (Weitere Informationen zum Dekodieren und Validieren von JWTs findest du in der Logto-Dokumentation).
Einschränkungen von JWT
Obwohl JWTs in modernen Softwarearchitekturen erhebliche Vorteile bieten, gibt es auch Einschränkungen, die berücksichtigt werden sollten.
Leicht ausgespähte Nutzlast
Wie bereits erwähnt, besteht ein JWT aus drei Teilen: dem header
, payload
und signature
.
Wie werden diese Komponenten erzeugt? Nehmen wir das JWT aus dem vorherigen Beispiel und demonstrieren den Prozess der JWT-Erzeugung:
Wie im obigen Code gezeigt, werden der Header und die Nutzlast des JWT einfach als Base64-Strings kodiert.
Das bedeutet, dass jeder, der Zugriff auf das Token hat, den Base64-String der JWT-Nutzlast leicht dekodieren und auf die darin enthaltenen Informationen zugreifen kann. Ebenso ist es relativ einfach, eine Nutzlast zu fälschen und die ursprüngliche JWT-Nutzlast mit einer manipulierten zu ersetzen.
Obwohl es zutrifft, dass die Nutzlast eines JWT relativ leicht gefälscht werden kann, ist es wichtig zu beachten, dass der Signaturteil des JWT nicht durch gefälschten Inhalt ersetzt werden kann, da er den geheimen Signaturschlüssel erfordert. Ohne die korrekte Signatur kann das JWT also nicht die Validierung bestehen.
Beim Einsatz von JWTs ist es wichtig, die folgenden Überlegungen zu berücksichtigen:
- Immer SSL verwenden: Um sicherzustellen, dass JWT-Informationen während der Übertragung nicht offengelegt werden, ist es wichtig, SSL (Secure Sockets Layer) oder seinen Nachfolger TLS (Transport Layer Security) zu verwenden, um die Daten bei der Übertragung zu verschlüsseln.
- Vermeide das Speichern sensibler Daten: Es wird nicht empfohlen, sensible Daten in der JWT-Nutzlast zu speichern. Die Nutzlast kann, wie bereits erwähnt, leicht dekodiert werden und sollte hauptsächlich nicht-sensible, relevante Ansprüche enthalten.
- JWTs validieren: Bevor man sich auf die Informationen innerhalb eines JWT verlässt, sollte sichergestellt werden, dass es einen gültigen und sicheren Validierungsprozess durchlaufen hat, einschließlich der Überprüfung der Signatur und der Kontrolle des Tokenablaufs. Dies hilft, die Verwendung manipulierte oder nicht autorisierter Tokens zu verhindern.
Schwer zu widerrufen
In der Regel haben Zugriffstokens normalerweise eine Ablaufzeit. Wenn das Zugriffstoken als zufällige Strings ohne Informationen dargestellt wird, können wir bei jeder Validierung im Auth-Server überprüfen, ob das Token widerrufen wurde.
Bei JWTs, aufgrund der Tatsache, dass JWTs Ablaufinformationen in sich selbst enthalten und die JWT-Validierung nicht auf dem Auth-Server basiert, ist es, sobald ein Auth-Server ein Zugriffstoken im JWT-Format ausgegeben hat, unmöglich, während seiner Verwendung den Status des Tokens zu ändern.
Nach dem natürlichen Ablauf eines JWT-Tokens können wir ein neues JWT vom Autorisierungsserver mithilfe eines Aktualisierungstokens erhalten (du kannst Logtos Blog für Informationen zu Aktualisierungstokens konsultieren).
In bestimmten Situationen, wie wenn ein Benutzer die Autorisierung widerruft oder sein Passwort ändert und du ein bereits ausgegebenes aber noch nicht abgelaufenes Token widerrufen musst, gibt es keine direkte Lösung.
Es gibt zwei gängige Ansätze, um die Auswirkungen des Token-Widerrufs in der Mitte zu mildern:
- Setze eine kürzere Ablaufzeit für das Zugriffstoken und verlasse dich auf den Token-Aktualisierungsmechanismus, um den Status des Tokens zeitnah zu aktualisieren.
Da das Zugriffstoken eine kürzere Ablaufzeit hat, kann der Benutzer, wenn er feststellt, dass das Zugriffstoken abgelaufen ist, ein neues Zugriffstoken von dem Autorisierungsdienst anfordern. Auf diese Weise kann der Token-Status auf der Benutzerseite so schnell wie möglich mit dem Backend synchronisiert werden. Dieser Ansatz bringt jedoch zusätzlichen Aufwand mit sich, den Benutzer berücksichtigen müssen.
- Führe eine Widerrufsliste für Zugriffstokens und prüfe, ob das Token bei jeder Validierung auf der Liste steht.
Diese Methode hat bestimmte Einschränkungen. Einer der Vorteile von JWT ist, dass der Server keine Zustandsinformationen speichern muss und JWTs in der Regel zustandslos sind. Eine Widerrufsliste zu pflegen, erfordert jedoch eine effektive Speicherung und Verwaltung, wobei zusätzliche Speichermechanismen erforderlich sind. Dies opfert im Wesentlichen die Vorteile von JWT und kann potenziell zu Leistungsproblemen führen. Daher muss der Token-Widerrufsmechanismus von den Entwicklern auf eine Weise implementiert werden, die für ihren spezifischen Anwendungsfall geeignet ist.
Zusammenfassung
In diesem Artikel haben wir eine kurze Einführung in JWT gegeben und seine Vorteile und Einschränkungen hervorgehoben. Du solltest nun ein tieferes Verständnis von JWT und den Szenarien haben, in denen es häufig verwendet wird. Obwohl JWT seine Herausforderungen hat, überwiegen die Vorteile, die es bringt, wenn es als Token-Format in OAuth 2.0-Diensten verwendet wird, bei Weitem seine Nachteile.
Logto, als schnell wachsender Identitätsauthentifizierungsdienst, verwendet auch JWT als Format für seine Zugriffstokens. Es hält sich strikt an verschiedene Autorisierungs- und Authentifizierungsprotokolle und macht es außergewöhnlich einfach, Identitätsauthentifizierungsdienste in deine Produkte zu integrieren. Logto hat seinen SaaS-Dienst offiziell gestartet, und du kannst ihn heute kostenlos ausprobieren.