Authentifizierung: JWT-Nutzung im Vergleich zur Sitzung


121

Was ist der Vorteil der Verwendung von JWTs gegenüber Sitzungen in Situationen wie der Authentifizierung?

Wird es als eigenständiger Ansatz verwendet oder wird es in der Sitzung verwendet?

Antworten:


210

JWT hat keinen Vorteil gegenüber der Verwendung von "Sitzungen" pro Wort. JWTs bieten eine Möglichkeit, den Sitzungsstatus auf dem Client beizubehalten, anstatt ihn auf dem Server auszuführen.

Wenn die Leute dies fragen, meinen sie oft: "Was sind die Vorteile der Verwendung von JWTs gegenüber der Verwendung von serverseitigen Sitzungen ? "

Bei serverseitigen Sitzungen müssen Sie entweder die Sitzungskennung in einer Datenbank speichern oder sie im Speicher behalten und sicherstellen, dass der Client immer denselben Server erreicht. Beide haben Nachteile. Im Fall der Datenbank (oder eines anderen zentralen Speichers) wird dies zu einem Engpass und zu einer Sache, die gewartet werden muss - im Wesentlichen eine zusätzliche Abfrage, die bei jeder Anforderung durchgeführt werden muss.

Mit einer In-Memory-Lösung begrenzen Sie Ihre horizontale Skalierung, und Sitzungen sind von Netzwerkproblemen betroffen (Clients, die zwischen WLAN und mobilen Daten wechseln, Neustart von Servern usw.)

Wenn Sie die Sitzung auf den Client verschieben, entfernen Sie die Abhängigkeit von einer serverseitigen Sitzung, stellen jedoch eigene Herausforderungen.

  • Bewahren Sie den Token sicher auf
  • sicher transportieren
  • JWTs-Sitzungen können manchmal schwer ungültig zu machen sein.
  • Dem Anspruch des Kunden vertrauen.

Diese Probleme werden von JWTs und anderen clientseitigen Sitzungsmechanismen gleichermaßen geteilt.

JWT befasst sich insbesondere mit den letzten Fragen. Es kann hilfreich sein zu verstehen, was ein JWT ist:

Es ist ein bisschen Information. Für Benutzersitzungen können Sie den Benutzernamen und den Zeitpunkt angeben, zu dem das Token abläuft. Es kann sich aber auch um alles handeln, sogar um die Sitzungs-ID oder das gesamte Profil des Benutzers. (Bitte tun Sie das jedoch nicht.) Es verfügt über eine sichere Signatur, die verhindert, dass böswillige Parteien gefälschte Token generieren. (Sie benötigen Zugriff auf den privaten Schlüssel des Servers, um sie zu signieren, und Sie können überprüfen, ob sie nach der Signatur nicht geändert wurden.) Sie Senden Sie sie mit jeder Anfrage, genau wie ein Cookie oder eine AuthorizationKopfzeile gesendet werden würde. Tatsächlich werden sie normalerweise im HTTP- AuthorizationHeader gesendet, aber die Verwendung eines Cookies ist auch in Ordnung.

Das Token ist signiert und der Server kann seinen Ursprung überprüfen. Wir gehen davon aus, dass der Server seiner eigenen Fähigkeit vertraut, sicher zu signieren (Sie sollten eine Standardbibliothek verwenden: Versuchen Sie nicht, dies selbst zu tun, und sichern Sie den Server ordnungsgemäß).

Bei dem Problem des sicheren Transports des Tokens besteht die Antwort normalerweise darin, es über einen verschlüsselten Kanal, normalerweise httpS, zu senden.

Um das Token sicher im Client zu speichern, müssen Sie sicherstellen, dass die Bösen nicht darauf zugreifen können. Dies bedeutet (meistens), dass JS von schlechten Websites daran gehindert wird, das Token zu lesen, um es an sie zurückzusenden. Dies wird durch dieselben Strategien gemindert, die auch zur Minderung anderer Arten von XSS-Angriffen verwendet werden.

Wenn Sie JWTs ungültig machen müssen, gibt es definitiv Möglichkeiten, wie dies erreicht werden kann. Das Speichern einer Epoche pro Benutzer nur für Benutzer, die die Beendigung ihrer "anderen Sitzungen" beantragt haben, ist eine sehr effiziente Methode, die wahrscheinlich gut genug ist. Wenn eine Anwendung pro Sitzung ungültig gemacht werden muss, kann eine Sitzungs-ID auf die gleiche Weise verwaltet werden, und die Tabelle "getötete Token" kann weiterhin so gehalten werden, dass sie viel kleiner als die vollständige Benutzertabelle ist (Sie müssen nur Datensätze aufbewahren, die neuer als die sind längste zulässige Token-Lebensdauer.) Die Möglichkeit, das Token ungültig zu machen, negiert teilweise den Vorteil clientseitiger Sitzungen, da Sie diesen Status "Sitzung beendet" beibehalten müssten. Dies ist höchstwahrscheinlich eine viel kleinere Tabelle als die ursprüngliche Sitzungsstatustabelle, sodass die Suchvorgänge dennoch effizienter sind.

Ein weiterer Vorteil der Verwendung von JWT-Token besteht darin, dass die Implementierung mithilfe von Bibliotheken, die wahrscheinlich in jeder Sprache verfügbar sind, die Sie erwarten können, relativ einfach ist. Es ist auch vollständig von Ihrem ursprünglichen Benutzerauthentifizierungsschema getrennt. Wenn Sie zu einem auf Fingerabdrücken basierenden System wechseln, müssen Sie keine Änderungen am Sitzungsverwaltungsschema vornehmen.

Ein subtilerer Vorteil: Da die JWT "Informationen" enthalten kann und der Client darauf zugreifen kann, können Sie jetzt einige intelligente Dinge tun. Erinnern Sie den Benutzer beispielsweise daran, dass seine Sitzung einige Tage vor dem Abmelden abläuft, und geben Sie ihm die Möglichkeit, sich basierend auf dem Ablaufdatum im Token erneut zu authentifizieren. Was auch immer Sie sich vorstellen können.

Kurz gesagt: JWTs beantworten einige der Fragen und Mängel anderer Sitzungstechniken.

  1. "Billigere" Authentifizierung, da Sie einen DB-Roundtrip eliminieren können (oder zumindest eine viel kleinere Tabelle zum Abfragen haben!), Die wiederum eine horizontale Skalierbarkeit ermöglicht.
  2. Manipulationssichere clientseitige Ansprüche.

JWTs beantwortet zwar keine anderen Probleme wie sichere Speicherung oder Transport, führt jedoch keine neuen Sicherheitsprobleme ein.

Bei JWTs besteht eine Menge Negativität. Wenn Sie jedoch die gleiche Sicherheit implementieren, die Sie für andere Authentifizierungstypen anwenden würden, ist dies in Ordnung.

Ein letzter Hinweis: Es handelt sich auch nicht um Cookies gegen Token. Cookies sind ein Mechanismus zum Speichern und Transportieren von Informationen und können auch zum Speichern und Transportieren von JWT-Token verwendet werden.


4
Es ist erwähnenswert, dass serverseitige Sitzungen auch keine Informationen auf dem Server speichern müssen. Der Server kann den Client genauso wie das JWT als Speicher verwenden. Der wirkliche Unterschied besteht darin, 1) Browsersicherheitsregeln zu vermeiden, indem der Wert als anderer Anforderungsheader als ein Cookie-Header übergeben wird, und 2) ein standardisiertes Format mit JWT zu haben.
Xeoncross

1
Würden Sie sagen, dass es sicher ist, ein JWT im lokalen Speicher zu speichern? Wenn nicht, wo kann es sicher gespeichert werden, damit der Benutzer angemeldet bleibt?
Jessica

1
Ja, localstorage ist im Allgemeinen der richtige Ort, um es clientseitig zu speichern. Sie müssen sich mit XSS befassen - ich bin kein Webprogrammierungsexperte, aber schauen Sie sich diese Antwort an stackoverflow.com/a/40376819/1810447 an und suchen Sie nach "So schützen Sie sich vor XSS"
The Tahaan

1
In Ihrem Kommentar sprechen Sie nicht über Cache-basierte Lösung + Sitzungstoken. Es klingt für mich "besser" als die JWT + "Killed Token" -Tabelle, denn mit dieser "Killed Token" -Tabelle benötigen Sie sowieso einen DB-Zugriff, den Sie auch mit Sessions + Cache haben (das ist auch klein). Das Fortbestehen von JWT ist schmerzhafter zu implementieren als das Fortbestehen von Sitzungen, da Sie mit einem refresh_token spielen müssen (also zwei Token, die beibehalten werden müssen) ... Jeder Kommentar wäre sehr willkommen ... insbesondere, wenn Sie eine Nummer haben, die zeigt, wie JWT + kill_table ist effizienter als Sessions + Cache ;-)
tobiasBora

2
@TheTahaan localStorage wird nicht zum Speichern von JWTs empfohlen. Der Link, den Sie geteilt haben, erwähnt dies auch. Dieser Blog enthält eine gute Erklärung, warum JWT nicht in localStorage gespeichert werden sollte.
Harke

40

Die kurze Antwort lautet: Keine.

Eine längere Version ist:

Ich habe JWTs für das Sitzungsmanagement implementiert, nachdem ich diese Empfehlung in den GraphQL-Dokumenten gelesen habe :

Wenn Sie mit keinem dieser Authentifizierungsmechanismen vertraut sind, empfehlen wir die Verwendung von Express-JWT, da dies einfach ist, ohne die zukünftige Flexibilität zu beeinträchtigen.

Die Implementierung war in der Tat einfach, da sie nur ein wenig Komplexität hinzufügte. Nach einer Weile begann ich (wie Sie) mich zu fragen, was die Vorteile waren. Es stellt sich heraus, dass es in Bezug auf das Sitzungsmanagement nur sehr wenige (oder möglicherweise keine) für JWT gibt, wie in diesem Blog-Beitrag ausführlich erläutert wird:

Verwenden Sie JWT nicht mehr für Sitzungen


0

Meine zwei Cent, die auf dem Weg einen Kontrast zu Joepie91s berühmtem Blog-Beitrag bilden.

In Anbetracht der Tatsache, dass die Anwendungen von heute (und morgen) (meistens) Cloud-nativ sind, bietet die zustandslose JWT-Authentifizierung
einen wirtschaftlichen Vorteil , der sich mit der Skalierung der Anwendung skalieren lässt: Cloud-Anwendungen verursachen mit jedem Atemzug Kosten . Diese Kosten werden reduziert, wenn Benutzer sich nicht mehr "gegen" einen Sitzungsspeicher authentifizieren müssen.

Verarbeitung Der Betrieb
eines Sitzungsspeichers rund um die Uhr kostet Geld.
Sie können mit speicherbasierten Lösungen in der Welt von K8S nicht durchkommen, da Pods kurzlebig sind.
Sticky Sessions werden aus genau dem gleichen Grund nicht gut abschneiden.

Speicherung Das
Speichern von Daten kostet Geld. Das Speichern von Daten auf einer SSD kostet noch mehr.
Sitzungsbezogene Vorgänge müssen schnell gelöst werden, daher ist ein optisches Laufwerk keine Option.

E / A
Einige Cloud-Anbieter berechnen Geld für Disc-bezogene E / A.

Bandbreite
Einige Cloud-Anbieter berechnen Gebühren für die Netzwerkaktivität zwischen Serverinstanzen.
Dies gilt, da es fast sicher ist, dass die API und der Sitzungsspeicher separate Instanzen sind.

Clustering des Sitzungsspeichers
Die Kosten erhöhen alle oben genannten Kosten noch weiter.


"Mit speicherbasierten Lösungen kommt man in der Welt von K8S nicht durch, da Pods kurzlebig sind." Ich bin mir nicht sicher, was Sie damit meinen. Redis funktioniert definitiv in einer K8S-Umgebung, und ein Redis-Pod, der häufig genug ausfällt, um Ihre Benutzer zu beeinträchtigen, ist sehr unwahrscheinlich.
quietContest

@quietContest Ich persönlich bevorzuge es, beim Erstellen von Software nicht mit der Wahrscheinlichkeit umzugehen. Abgesehen von der Stabilität der Lösung kann ein Angriff dazu führen, dass Software ausfällt und Pods neu gestartet werden - was zu einem Sitzungsverlust führen würde. Aus diesem Grund würde ich mich für eine JWT-basierte Lösung entscheiden.
Eyal Perry

1
"Ich persönlich ziehe es vor, beim Erstellen von Software nicht mit der Wahrscheinlichkeit umzugehen". Ich denke, wir alle würden das vorziehen, weshalb wir keine Systeme entwickeln sollten, die auf In-Memory-Datenspeichern basieren, die niemals ausfallen, da die Wahrscheinlichkeit dafür einigermaßen hoch erscheint. Wenn Sie einen Angreifer haben, der Ihre Redis-Instanz dauerhaft ausschalten kann, muss für die Lösung dieses Problems wahrscheinlich keine JWTs verwendet werden.
quietContest

@quietContest konsequent oder ein einmaliges Ereignis sind für mich in dieser Hinsicht gleich. dh ein gut platzierter DDoS-Angriff kann dazu führen, dass der Server "Benutzer abmeldet". Dies ist nicht gut für die Zuverlässigkeit der Software. Ich denke, Redis ist sowieso übertrieben für das Sitzungsmanagement. Es kostet und muss skaliert werden, während dies beim (sicheren) Speichern eines JWT in einem Cookie nicht der Fall ist.
Eyal Perry

1
@quietContest danke für deine Eingabe, liebe die Diskussion!
Eyal Perry

0

Ich hatte eine ähnliche Frage bei der Auswahl zwischen JWT und Token + Cache für die Benutzerauthentifizierung.

Nach dem Lesen dieser Artikel ist mir klar, dass die Vorteile, die JWT verspricht, die damit verbundenen Probleme nicht übertreffen. Token + Cache (Redis / Memcached) ist also der richtige Weg für mich.

Auth Headers vs JWT vs Sessions - So wählen Sie die richtige Auth-Technik für APIs aus

Authentifizierungstechniken für APIs

Verwenden Sie jwt nicht mehr für Sitzungen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.