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?
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.
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 Authorization
Kopfzeile gesendet werden würde. Tatsächlich werden sie normalerweise im HTTP- Authorization
Header 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.
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.
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 :
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
quelle
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.
quelle
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
quelle