Was sind die Hauptunterschiede zwischen JWT- und OAuth-Authentifizierung?

356

Ich habe ein neues SPA mit einem zustandslosen Authentifizierungsmodell mit JWT. Ich werde oft gebeten, OAuth für Authentifizierungsabläufe zu verweisen, z. B. mich zu bitten, für jede Anforderung "Bearer-Token" anstelle eines einfachen Token-Headers zu senden, aber ich denke, dass OAuth viel komplexer ist als eine einfache JWT-basierte Authentifizierung. Was sind die Hauptunterschiede, sollte ich dafür sorgen, dass sich die JWT-Authentifizierung wie OAuth verhält?

Ich verwende das JWT auch als XSRF-TOKEN, um XSRF zu verhindern, aber ich werde gebeten, sie getrennt zu halten. Soll ich sie getrennt halten? Jede Hilfe hier wird geschätzt und kann zu einer Reihe von Richtlinien für die Community führen.

Tech Junkie
quelle

Antworten:

330

TL; DR Wenn Sie sehr einfache Szenarien haben, wie eine einzelne Clientanwendung, eine einzelne API, zahlt es sich möglicherweise nicht aus, OAuth 2.0 zu verwenden, andererseits viele verschiedene Clients (browserbasiert, nativ mobil, serverseitig) Wenn Sie sich dann an die OAuth 2.0-Regeln halten, ist dies möglicherweise einfacher zu handhaben als der Versuch, Ihr eigenes System zu rollen.


Wie in einer anderen Antwort angegeben, ist JWT ( Learn JSON Web Tokens ) nur ein Token-Format. Es definiert einen kompakten und in sich geschlossenen Mechanismus für die Übertragung von Daten zwischen Parteien auf eine Weise, die überprüft und vertrauenswürdig ist, da sie digital signiert sind. Darüber hinaus machen die Codierungsregeln eines JWT die Verwendung dieser Token im Kontext von HTTP sehr einfach.

Da sie in sich geschlossen sind (das eigentliche Token enthält Informationen zu einem bestimmten Thema), sind sie auch eine gute Wahl für die Implementierung zustandsloser Authentifizierungsmechanismen (auch bekannt als Look mum, keine Sitzungen! ). Wenn Sie diesen Weg gehen und das einzige, was eine Partei vorlegen muss, um Zugriff auf eine geschützte Ressource zu erhalten, ist das Token selbst. Das betreffende Token kann als Inhaber-Token bezeichnet werden.

In der Praxis kann das, was Sie tun, bereits als auf Inhaber-Token basierend klassifiziert werden. Beachten Sie jedoch, dass Sie keine Inhaber-Token verwenden, wie in den OAuth 2.0-Spezifikationen angegeben (siehe RFC 6750 ). Dies würde bedeuten, sich auf den AuthorizationHTTP-Header zu verlassen und das BearerAuthentifizierungsschema zu verwenden.

In Bezug auf die Verwendung des JWT zur Verhinderung von CSRF ohne genaue Details ist es schwierig, die Gültigkeit dieser Praxis festzustellen, aber um ehrlich zu sein, scheint sie nicht korrekt und / oder sinnvoll zu sein. Der folgende Artikel ( Cookies vs Tokens: The Definitive Guide ) kann eine nützliche Lektüre zu diesem Thema sein, insbesondere der Abschnitt XSS- und XSRF-Schutz .

Ein letzter Ratschlag, auch wenn Sie nicht OAuth 2.0 vollständig ausführen müssen, würdeAuthorization ich dringend empfehlen, Ihr Zugriffstoken innerhalb des Headers zu übergeben, anstatt benutzerdefinierte Header zu verwenden . Wenn es sich wirklich um Inhaber-Token handelt, befolgen Sie die Regeln von RFC 6750. Wenn nicht, können Sie jederzeit ein benutzerdefiniertes Authentifizierungsschema erstellen und diesen Header weiterhin verwenden.

Autorisierungsheader werden von HTTP-Proxys und -Servern erkannt und speziell behandelt. Daher verringert die Verwendung solcher Header zum Senden von Zugriffstoken an Ressourcenserver die Wahrscheinlichkeit eines Verlusts oder einer unbeabsichtigten Speicherung authentifizierter Anforderungen im Allgemeinen und insbesondere von Autorisierungsheadern.

(Quelle: RFC 6819, Abschnitt 5.4.1 )

João Angelo
quelle
2
Bedeutet dies, dass ich bei Verwendung der JWT-Authentifizierung in einer mobilen App CSRF nicht in die POST-Anforderung aufnehmen muss? Im Gegensatz zu Webinterface mit Formularen?
user805981
2
Cookies vs Tokens: Der endgültige Leitfaden, dh auth0.com/blog/cookies-vs-tokens-definitive-guide funktioniert nicht Dies ist ein weiterer großartiger Diskussionsbeitrag: stackoverflow.com/questions/37582444/…
Siddharth Jain
1
"Sie sind auch eine gute Wahl für die Implementierung zustandsloser Authentifizierungsmechanismen (auch bekannt als Look mum, keine Sitzungen!)." Wenn Sie eine Möglichkeit benötigen, das Token ungültig zu machen, weil es beispielsweise durchgesickert oder abgefangen wurde oder der Benutzer sich einfach abgemeldet und das Token entfernt hat ist nicht sicher genug, da das Token noch gültig ist, dann müssen Sie es in einer Datenbank speichern. Ich denke, es muss aus Sicherheitsgründen eine Vorstellung von einer Sitzung auf dem Server geben oder eine einfache Token-Blacklist. Sie könnten sagen, verwenden Sie dafür "Refresh" -Token. Aber auch Aktualisierungstoken können abgefangen werden und die Konsequenzen sind viel schlimmer.
Konrad
1
@Konrad, ich habe einen ähnlichen Mechanismus implementiert, der die nicht verwendeten gültigen Token in einer Tabelle speichert und sie von dort freigibt, wenn sie ablaufen. Für jede eingehende Anfrage habe ich Code geschrieben, um das eingehende Token mit den "nicht verwendeten gültigen Token" zu vergleichen. Obwohl es funktioniert, hatte ich immer meine Zweifel - es sollte einen besseren Weg geben, mit unbenutzten, aber immer noch gültigen Token umzugehen.
Tech Junkie
2
Auf der anderen Seite erschweren Aktualisierungstoken nur die Implementierung des Clients. Denn wenn Ihr Zugriffstoken abläuft, müssen Sie damit umgehen. Der Benutzer ist sauer, wenn Sie ihn nur abmelden, ohne die Möglichkeit einer manuellen Aktualisierung der Sitzung (wie dies bei Banken der Fall ist). Es ist etwas mehr Arbeit zu erledigen, auch die Verwendung von Standard-Authentifizierungsmethoden (OID) und Autorisierung (OAuth) kann sehr oft ein Overkill sein.
Konrad
281

OAuth 2.0 definiert ein Protokoll, dh es wird festgelegt, wie Token übertragen werden. JWT definiert ein Token-Format.

OAuth 2.0 und "JWT-Authentifizierung" haben ein ähnliches Erscheinungsbild, wenn es um die (2.) Phase geht, in der der Client das Token dem Ressourcenserver präsentiert: Das Token wird in einem Header übergeben.

"JWT-Authentifizierung" ist jedoch kein Standard und gibt nicht an, wie der Client das Token überhaupt erhält (erste Stufe). Das ist , wo die empfundene Komplexität von OAuth kommt: es definiert auch verschiedene Möglichkeiten , in denen der Kunde kann erhalten einen Zugriff von etwas Token , das einen Autorisierungs - Server aufgerufen wird.

Der wirkliche Unterschied besteht also darin, dass JWT nur ein Token-Format ist, OAuth 2.0 ein Protokoll (das möglicherweise ein JWT als Token-Format verwendet).

Hans Z.
quelle
10
Verwenden oAuth-Protokollimplementierungen in den meisten Fällen JWT als Token-Format? Wenn nicht, was ist am häufigsten?
James Wierzba
14
Das Token-Format in oauth ist undefiniert, aber JWT sollte gut funktionieren
vikingsteve
129

Zunächst müssen wir JWT und OAuth unterscheiden. Grundsätzlich ist JWT ein Token-Format. OAuth ist ein Autorisierungsprotokoll, das JWT als Token verwenden kann. OAuth verwendet serverseitigen und clientseitigen Speicher. Wenn Sie sich wirklich abmelden möchten, müssen Sie sich für OAuth2 entscheiden. Die Authentifizierung mit dem JWT-Token kann tatsächlich nicht abgemeldet werden. Weil Sie keinen Authentifizierungsserver haben, der Token verfolgt. Wenn Sie Clients von Drittanbietern eine API bereitstellen möchten, müssen Sie auch OAuth2 verwenden. OAuth2 ist sehr flexibel. Die Implementierung von JWT ist sehr einfach und dauert nicht lange. Wenn Ihre Anwendung diese Flexibilität benötigt, sollten Sie sich für OAuth2 entscheiden. Wenn Sie dieses Anwendungsszenario jedoch nicht benötigen, ist die Implementierung von OAuth2 Zeitverschwendung.

Das XSRF-Token wird in jedem Antwortheader immer an den Client gesendet. Es spielt keine Rolle, ob ein CSRF-Token in einem JWT-Token gesendet wird oder nicht, da das CSRF-Token mit sich selbst gesichert ist. Daher ist das Senden eines CSRF-Tokens in JWT nicht erforderlich.

Melikşah Şimşek
quelle
7
Ich verstehe nicht, warum diese Antwort viele positive Stimmen hat. Sie besagt, dass "OAuth ein Authentifizierungsframework ist" und dies ist völlig falsch. OAuth ist ein Autorisierungsprotokoll und nur ein Autorisierungsprotokoll.
Michael
4
Hallo @Michael, es gibt zu viele Missverständnisse darüber. Ich habe meinen Kommentar bearbeitet, danke.
Melikşah Şimşek
6
@ Michael, bitte schätzen Sie die Antwort von anderen bcz er teilte sein verfeinertes Wissen mit uns und ich genoss die Antwort wirklich.
Yasir Shabbir Choudhary
Wollen Sie damit sagen, dass Oauth nur ein Teil der Standards ist, denen Entwickler folgen sollten? Oder ist es wirklich ein Rahmen?
StormTrooper
65

JWT (JSON Web Tokens) - Dies ist nur ein Token-Format. JWT-Token sind JSON-codierte Datenstrukturen, die Informationen zu Aussteller, Betreff (Ansprüche), Ablaufzeit usw. enthalten. Sie sind für Manipulationssicherheit und Authentizität signiert und können zum Schutz der Token-Informationen mithilfe eines symmetrischen oder asymmetrischen Ansatzes verschlüsselt werden. JWT ist einfacher als SAML 1.1 / 2.0 und wird von allen Geräten unterstützt. Es ist leistungsfähiger als SWT (Simple Web Token).

OAuth2 - OAuth2 löst ein Problem, bei dem Benutzer mithilfe von Client-Software wie durchsuchbasierten Web-Apps, nativen mobilen Apps oder Desktop-Apps auf die Daten zugreifen möchten. OAuth2 dient nur zur Autorisierung. Client-Software kann autorisiert werden, im Namen des Endbenutzers mithilfe des Zugriffstokens auf die Ressourcen zuzugreifen.

OpenID Connect - OpenID Connect baut auf OAuth2 auf und fügt Authentifizierung hinzu. OpenID Connect fügt OAuth2 einige Einschränkungen hinzu, z. B. UserInfo-Endpunkt, ID-Token, Erkennung und dynamische Registrierung von OpenID Connect-Anbietern und Sitzungsverwaltung. JWT ist das obligatorische Format für das Token.

CSRF-Schutz - Sie müssen den CSRF-Schutz nicht implementieren, wenn Sie kein Token im Cookie des Browsers speichern.

Weitere Informationen finden Sie hier http://proficientblog.com/microservices-security/

ManishSingh
quelle
3
Keine Cookies == Kein CSRF-Schutz. Wenn Sie keine Cookies zur Autorisierung verwenden, müssen Sie sich keine Gedanken über den CSRF-Schutz machen.
Niranjan Harpale
51

Es sieht so aus, als hätten alle, die hier geantwortet haben, den Streitpunkt von OAUTH verpasst

Aus Wikipedia

OAuth ist ein offener Standard für die Zugriffsdelegierung, der häufig verwendet wird, um Internetbenutzern Websites oder Anwendungen Zugriff auf ihre Informationen auf anderen Websites zu gewähren, ohne ihnen jedoch die Kennwörter zu geben. [1] Dieser Mechanismus wird von Unternehmen wie Google, Facebook, Microsoft und Twitter verwendet, um den Benutzern den Austausch von Informationen über ihre Konten mit Anwendungen oder Websites von Drittanbietern zu ermöglichen.

Der entscheidende Punkt hier ist access delegation. Warum sollte jemand OAUTH erstellen, wenn es eine id / pwd-basierte Authentifizierung gibt, die durch multifaktorierte Authentifizierung wie OTPs unterstützt wird und außerdem durch JWTs gesichert werden kann, die verwendet werden, um den Zugriff auf die Pfade (wie Bereiche in OAUTH) zu sichern und den Ablauf der festzulegen Zugriff

Es macht keinen Sinn, OAUTH zu verwenden, wenn Verbraucher nur über ihre vertrauenswürdigen Websites (oder Apps) auf ihre Ressourcen (Ihre Endpunkte) zugreifen, die wiederum auf Ihren Endpunkten gehostet werden

Sie können die OAUTH-Authentifizierung nur dann durchführen, wenn Sie eineOAUTH provider Person sind, wenn die Ressourcenbesitzer (Benutzer) über einen Drittanbieter-Client (externe App) auf ihre (Ihre) Ressourcen (Endpunkte) zugreifen möchten. Und es ist genau für den gleichen Zweck erstellt, obwohl Sie es im Allgemeinen missbrauchen können

Ein weiterer wichtiger Hinweis:
Sie verwenden das Wort authenticationfür JWT und OAUTH frei, bieten jedoch keinen Authentifizierungsmechanismus an. Ja, einer ist ein Token-Mechanismus und der andere ist ein Protokoll, aber nach der Authentifizierung werden sie nur zur Autorisierung (Zugriffsverwaltung) verwendet. Sie müssen OAUTH entweder mit der Authentifizierung vom Typ OPENID oder Ihren eigenen Client-Anmeldeinformationen sichern

manikawnth
quelle
4
OAuth kann auch für Ihre eigenen Kunden verwendet werden, nicht unbedingt nur für Kunden von Drittanbietern. Der Grant-Typ für Kennwortanmeldeinformationen macht genau das.
Harpratap
1
Ich suchte nach Google für eine so konkrete Antwort, konnte aber keine finden. Alle sprachen nur über Definitionen, z. B. Token gegen Protokoll. Ihre Antwort erklärte den wahren Zweck der Verwendung übereinander. Ich danke dir sehr!
Vivek Goel
9

Finden Sie die Hauptunterschiede zwischen JWT und OAuth

  1. OAuth 2.0 definiert ein Protokoll und JWT definiert ein Token-Format.

  2. OAuth kann entweder JWT als Token-Format oder ein Zugriffstoken verwenden, das ein Inhaber-Token ist.

  3. OpenID Connect verwendet meistens JWT als Token-Format.

Suraj Kumar Pandey
quelle
6

JWT ist ein offener Standard, der eine kompakte und in sich geschlossene Methode für die sichere Übertragung von Informationen zwischen Parteien definiert. Es handelt sich um ein Authentifizierungsprotokoll, bei dem verschlüsselte Ansprüche (Token) zwischen zwei Parteien (Client und Server) übertragen werden können und das Token bei der Identifizierung eines Clients ausgestellt wird. Bei jeder nachfolgenden Anfrage senden wir den Token.

Während OAuth2 ein Autorisierungsframework ist, in dem allgemeine Verfahren und Setups durch das Framework definiert sind. JWT kann als Mechanismus in OAuth2 verwendet werden.

Mehr dazu lesen Sie hier

OAuth oder JWT? Welches und warum?

samuelj90
quelle
5

Die Frage ist häufig, aber nicht ganz sinnvoll. JWT ist eine Art Token, und OAuth ist ein Framework, das beschreibt, wie Token ausgegeben werden.

Was meinen wir mit "Framework"? Nur die Reihenfolge der Anfragen und Antworten und die Formate dieser, die zum Anfordern von Token verwendet werden können und sollten. OAuthv2 beschreibt separate "Flows" oder Grant-Typen für verschiedene Szenarien und verfügt über verschiedene Erweiterungen (wie PKCE), um die Sicherheit bestimmter Flows zu erweitern.

Das Ergebnis einer Tokenanforderung über eine OAuthV2-Bewilligung ist ... ein Token. Dieses Ding wird dann als "Inhaber-Token" verwendet, was bedeutet, dass jede Partei, die das Token besitzt, es vorlegen kann, wenn sie eine API-Serviceanfrage stellt (z. B. "Wie hoch ist der Kontostand auf meiner gespeicherten Wertkarte?"). Als Inhaber-Token funktioniert es wie Bargeld. Wenn Sie es halten, können Sie es verwenden. (Im Gegensatz zu Bargeld ist ein Token nicht das Verwenden und Verlieren. Vielleicht ist eine bessere Analogie eine Ganztageskarte für die Fahrt mit öffentlichen Verkehrsmitteln oder eine Ganztageskarte für Disneyworld.)

JWT ist eine bestimmte Art von Token, und JWT kann absolut als OAuth Bearer-Token verwendet werden. In der Tat ist dies die gängigste Praxis. Vor diesem Hintergrund ist "JWT vs OAuth" ein Vergleich von Äpfeln und Apfelkarren.

Oft denken die Leute, dass "OAuth-Token" immer ein undurchsichtiges Token impliziert - eine zufällige Folge von alphanumerischen Zeichen, die keine inhärente Bedeutung enthält -, die von einer OAuth-Token-Apotheke gewährt wird und die dann nur von demselben OAuth-Apothekensystem validiert werden kann. Dies ist jedoch nicht die einzige Art von OAuth-Token. Ein undurchsichtiger Token ist eine Art von Token. JWT kann als eine andere Art von OAuth-Token verwendet werden.

JWT sind dagegen nicht undurchsichtig. Das JWT ist kein "Zeiger" oder Verweis auf Informationen. Es enthält tatsächlich viele spezifische Informationen, die von jeder Partei, die über das Token verfügt, extrahiert und interpretiert werden können. Da die JWT echte Informationen enthält, kann eine JWT groß sein. 300 Bytes, 500 Bytes oder mehr, abhängig von den darin enthaltenen Ansprüchen und dem zum Signieren verwendeten Algorithmus. Wenn Leute sagen "JWT validieren sich selbst", bedeutet dies, dass jeder Inhaber des JWT es öffnen, validieren und dann Autorisierungsentscheidungen auf der Grundlage der darin dargestellten Ansprüche treffen kann. Das Validieren des JWT bedeutet: Überprüfen seiner Struktur, Decodieren der Base64-Codierung, Überprüfen des korrekten Schlüssels, Überprüfen der Signatur und anschließendes Überprüfen der erforderlichen Ansprüche im Token, Überprüfen des Ablaufs. Es ist keine einfache Sache, Eher ein mehrstufiger Prozess, aber natürlich gibt es viele Bibliotheken in verschiedenen Programmiersprachen, die damit zu tun haben, und natürlich gibt es die VerifyJWT-Richtlinie, die Ihnen dabei hilft, dies innerhalb eines Apigee Edge API-Proxys zu tun. Der Punkt ist, dass jeder Inhaber oder Empfänger einen Token verifizieren kann. Aus diesem Grund sagen wir, dass JWT "Federation" unterstützt - jeder kann ein Token generieren und jeder kann ein Token lesen und validieren.

kundenspezifische Ansprüche. Sowohl JWT- als auch undurchsichtige OAuth-Token können benutzerdefinierte Ansprüche zu diesem Thema enthalten. Sicherheit. Beide sind Inhaber-Token. Beide müssen als Geheimnisse geschützt werden. Ablauf. Beide können mit einem Ablauf markiert werden. Beide können aktualisiert werden. Der Authentifizierungsmechanismus oder die Erfahrung. Beide können dieselbe Benutzererfahrung bieten.

Pramod Gautam
quelle
0

Jwt ist ein strenger Satz von Anweisungen zum Ausstellen und Validieren von signierten Zugriffstoken. Die Token enthalten Ansprüche, die von einer App verwendet werden, um den Zugriff auf einen Benutzer zu beschränken

OAuth2 hingegen ist kein Protokoll, sondern ein delegiertes Autorisierungsframework. Denken Sie an eine sehr detaillierte Richtlinie, mit der Benutzer und Anwendungen bestimmte Berechtigungen für andere Anwendungen sowohl in privaten als auch in öffentlichen Umgebungen autorisieren können. OpenID Connect, das sich über OAUTH2 befindet, bietet Ihnen Authentifizierung und Autorisierung. Es beschreibt, wie sich mehrere verschiedene Rollen, Benutzer in Ihrem System, serverseitige Apps wie eine API und Clients wie Websites oder native mobile Apps bei jedem anderen authentifizieren können

Hinweis oauth2 kann mit jwt arbeiten, einer flexiblen Implementierung, die auf verschiedene Anwendungen erweiterbar ist

naila naseem
quelle
Es scheint, dass Sie dies genau rückwärts haben.
Jbruni