Heim >Web-Frontend >js-Tutorial >JWT (JSON Web Tokens) beherrschen: Ein tiefer Einblick

JWT (JSON Web Tokens) beherrschen: Ein tiefer Einblick

DDD
DDDOriginal
2025-01-21 20:37:10776Durchsuche

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:

  1. Der Benutzer sendet den Benutzernamen und das Passwort an den Server.
  2. Nach erfolgreicher Serverauthentifizierung werden Benutzerrolle, Anmeldezeit und andere zugehörige Daten in der aktuellen Sitzung gespeichert.
  3. Der Server gibt eine session_id an den Benutzer zurück und schreibt sie in das Cookie des Benutzers.
  4. Bei jeder weiteren Anfrage des Benutzers wird die Sitzungs-ID über Cookie an den Server zurückgesendet.
  5. 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:

<code class="language-json">{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}</code>

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:

Mastering JWT (JSON Web Tokens): A Deep Dive

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

Mastering JWT (JSON Web Tokens): A Deep Dive

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:

<code class="language-json">{"alg": "HS256", "typ": "JWT"}</code>

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:

<code class="language-json">{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}</code>

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:

<code class="language-json">{"alg": "HS256", "typ": "JWT"}</code>

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

Mastering JWT (JSON Web Tokens): A Deep Dive

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.

Mastering JWT (JSON Web Tokens): A Deep Dive

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Webship-js: Wenn ich warteNächster Artikel:Webship-js: Wenn ich warte