JWT (JSON Web Tokens) beherrschen: Ein tiefer Einblick
JSON Web Token (JWT): eine beliebte Lösung für die domänenübergreifende Authentifizierung
In diesem Artikel werden die Prinzipien und die Verwendung von JSON Web Token (JWT) vorgestellt, der derzeit beliebtesten domänenübergreifenden Authentifizierungslösung.
1. Herausforderungen der domänenübergreifenden Authentifizierung
Internetdienste sind untrennbar mit der Benutzerauthentifizierung verbunden. Der traditionelle Prozess ist wie folgt:
- Der Benutzer sendet den Benutzernamen und das Passwort an den Server.
- Nach erfolgreicher Serverauthentifizierung werden Benutzerrolle, Anmeldezeit und andere zugehörige Daten in der aktuellen Sitzung gespeichert.
- Der Server gibt eine session_id an den Benutzer zurück und schreibt sie in das Cookie des Benutzers.
- Bei jeder weiteren Anfrage des Benutzers wird die Sitzungs-ID über Cookie an den Server zurückgesendet.
- Nachdem der Server die Sitzungs-ID erhalten hat, sucht er nach den vorab gespeicherten Daten, um den Benutzer zu identifizieren.
Dieses Modell weist eine schlechte Skalierbarkeit auf: Eine Einzelmaschinenumgebung ist in Ordnung, aber ein Servercluster oder eine domänenübergreifende serviceorientierte Architektur erfordert die gemeinsame Nutzung von Sitzungsdaten, und jeder Server kann die Sitzung lesen. Beispielsweise sind Website A und Website B verwandte Dienste desselben Unternehmens. Nachdem sich Benutzer bei einer der Websites angemeldet haben, können sie sich automatisch anmelden, wenn sie die andere Website besuchen. Eine Lösung besteht darin, die Sitzungsdaten beizubehalten, sie in eine Datenbank oder eine andere Persistenzschicht zu schreiben und die Daten von der Persistenzschicht anzufordern, nachdem jeder Dienst die Anfrage erhalten hat. Diese Lösung hat eine klare Architektur, aber die Arbeitslast ist groß und ein Ausfall der Persistenzschicht führt zu einem Single Point of Failure. Eine andere Möglichkeit besteht darin, dass der Server überhaupt keine Sitzungsdaten speichert, sondern alle Daten auf dem Client gespeichert und bei jeder Anfrage an den Server zurückgesendet werden. JWT vertritt diesen Ansatz.
2. Prinzip von JWT
Das Prinzip von JWT besteht darin, dass der Server nach der Überprüfung ein JSON-Objekt generiert und es an den Benutzer zurückgibt, zum Beispiel:
{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}
Später, wenn der Benutzer mit dem Server kommuniziert, muss dieses JSON-Objekt zurückgegeben werden, und der Server bestimmt die Identität des Benutzers vollständig anhand dieses Objekts. Um zu verhindern, dass Benutzer Daten manipulieren, fügt der Server beim Generieren dieses Objekts eine Signatur hinzu (Details werden später beschrieben). Der Server speichert keine Sitzungsdaten mehr, d. h. der Server wird zustandslos und lässt sich leichter skalieren.
3. JWT-Datenstruktur
Das eigentliche JWT sieht so aus:
Es handelt sich um eine lange Zeichenfolge, die durch Punkte (.) in drei Teile getrennt ist. Beachten Sie, dass es im JWT keine Zeilenumbrüche gibt. Die Zeilenumbrüche dienen hier nur der einfacheren Anzeige. Die drei Teile von JWT sind wie folgt:
- Kopfzeile
- Nutzlast
- Unterschrift
Eine Zeile wird ausgedrückt als: Header.Payload.Signature
Diese drei Teile werden im Folgenden vorgestellt.
3.1 Kopfzeile
Der Header-Teil ist ein JSON-Objekt, das die Metadaten des JWT beschreibt, normalerweise wie folgt:
{"alg": "HS256", "typ": "JWT"}
Das Attribut alg stellt den Signaturalgorithmus dar, der Standardwert ist HMAC SHA256 (HS256); das Attribut typ stellt den Typ dieses Tokens dar und JWT-Token werden einheitlich als JWT geschrieben. Dieses JSON-Objekt wird letztendlich mithilfe des Base64URL-Algorithmus in einen String umgewandelt (Details unten).
3.2 Nutzlast
Der Payload-Teil ist auch ein JSON-Objekt, das zum Speichern der eigentlichen Daten verwendet wird, die übertragen werden müssen. JWT definiert 7 offizielle optionale Felder:
- iss (Emittent): Emittent
- exp (Ablaufzeit): Ablaufzeit
- Sub (Betreff): Betreff
- aud (Publikum): Publikum
- nbf (Nicht vorher): effektive Zeit
- iat (Ausgestellt am): Ausstellungszeitpunkt
- jti (JWT-ID): Seriennummer
Neben offiziellen Feldern können auch private Felder individuell angepasst werden. Zum Beispiel:
{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}
Beachten Sie, dass JWT standardmäßig nicht verschlüsselt ist und von jedem gelesen werden kann. Geben Sie daher in diesem Abschnitt keine geheimen Informationen ein. Dieses JSON-Objekt muss ebenfalls mithilfe des Base64URL-Algorithmus in einen String konvertiert werden.
3.3 Unterschrift
Der Signaturteil ist die Signatur der ersten beiden Teile und wird verwendet, um Datenmanipulationen zu verhindern. Zuerst müssen Sie ein Geheimnis angeben. Dieses Geheimnis ist nur dem Server bekannt und kann nicht an den Benutzer weitergegeben werden. Verwenden Sie dann den im Header angegebenen Signaturalgorithmus (Standard ist HMAC SHA256), um eine Signatur gemäß der folgenden Formel zu generieren:
{"alg": "HS256", "typ": "JWT"}
Nachdem die Signatur berechnet wurde, werden die drei Teile Header, Payload und Signatur zu einer Zeichenfolge zusammengefasst und jeder Teil durch einen „Punkt“ (.) getrennt, der an den Benutzer zurückgegeben werden kann.
3.4 Base64URL
Wie bereits erwähnt, ist der Serialisierungsalgorithmus von Header und Payload Base64URL. Dieser Algorithmus ähnelt grundsätzlich dem Base64-Algorithmus, weist jedoch einige geringfügige Unterschiede auf. Als Token kann JWT manchmal in einer URL platziert werden (z. B. api.example.com/?token=xxx). Die drei Zeichen in Base64, / und = haben in der URL eine besondere Bedeutung und müssen durch = ersetzt werden weggelassen und durch „Ersetzt durch -“ ersetzt, / wird durch „_“ ersetzt. Dies ist der Base64URL-Algorithmus.
4. So verwenden Sie JWT
Nachdem der Client das vom Server zurückgegebene JWT erhalten hat, kann er es in Cookie oder localStorage speichern. Der Client muss dieses JWT jedes Mal übertragen, wenn er mit dem Server kommuniziert. Es kann in einem Cookie abgelegt und automatisch versendet werden, dies ist jedoch nicht domänenübergreifend möglich. Ein besserer Ansatz besteht darin, es in das Autorisierungsfeld des HTTP-Anforderungsheaders einzufügen:
Autorisierung: Inhaber
Ein anderer Ansatz besteht darin, das JWT beim Überqueren von Domänen in den Hauptteil der POST-Anfrage einzufügen.
5. Mehrere Merkmale von JWT
(1) JWT ist standardmäßig nicht verschlüsselt, kann aber verschlüsselt werden. Nachdem der ursprüngliche Token generiert wurde, kann er erneut mit dem Schlüssel verschlüsselt werden.
(2) Wenn JWT nicht verschlüsselt ist, können geheime Daten nicht geschrieben werden.
(3) JWT kann nicht nur zur Identitätsprüfung, sondern auch zum Informationsaustausch verwendet werden. Durch den effektiven Einsatz von JWT kann die Anzahl der Abfragen der Datenbank durch den Server reduziert werden.
(4) Der größte Nachteil von JWT besteht darin, dass der Server den Sitzungsstatus nicht speichert und während der Verwendung kein Token widerrufen oder die Berechtigungen des Tokens ändern kann. Das heißt, sobald ein JWT ausgegeben wurde, bleibt es gültig, bis es abläuft, es sei denn, der Server stellt zusätzliche Logik bereit.
(5) Das JWT selbst enthält Authentifizierungsinformationen, und sobald es durchgesickert ist, kann jeder alle Berechtigungen des Tokens erhalten. Um Diebstahl zu reduzieren, sollte die Gültigkeitsdauer von JWT relativ kurz eingestellt werden. Für einige wichtigere Berechtigungen sollten sich Benutzer bei der Verwendung erneut authentifizieren.
(6) Um Diebstahl zu reduzieren, sollte JWT nicht im Klartext über das HTTP-Protokoll, sondern über das HTTPS-Protokoll übertragen werden.
Leapcell: Die beste serverlose Webhosting-Plattform
Abschließend empfehle ich die beste Plattform für die Bereitstellung von Webdiensten: Leapcell
1. Mehrsprachige Unterstützung
- Entwickeln Sie in JavaScript, Python, Go oder Rust.
2. Stellen Sie unbegrenzt viele Projekte kostenlos bereit
- Zahlen Sie nur für das, was Sie nutzen – keine Anfragen, keine Gebühren.
3. Beispiellose Kosteneffizienz
- Pay-as-you-go, keine Leerlaufgebühren.
- Beispiel: 25 $ unterstützt 6,94 Millionen Anfragen mit einer durchschnittlichen Antwortzeit von 60 ms.
4. Vereinfachtes Entwicklererlebnis
- Intuitive Benutzeroberfläche, einfach einzurichten.
- Vollautomatische CI/CD-Pipeline und GitOps-Integration.
- Echtzeitmetriken und Protokollierung für umsetzbare Erkenntnisse.
5. Einfache Erweiterung und hohe Leistung
- Automatische Erweiterung zur einfachen Handhabung hoher Parallelität.
- Kein Betriebsaufwand – konzentrieren Sie sich nur auf den Bau.
Erfahren Sie mehr in der Dokumentation!
Leapcell Twitter: https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd
Das obige ist der detaillierte Inhalt vonJWT (JSON Web Tokens) beherrschen: Ein tiefer Einblick. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.
