Quelles sont les principales différences entre l'authentification JWT et OAuth?


356

J'ai un nouveau SPA avec un modèle d'authentification sans état utilisant JWT. On me demande souvent de faire référence à OAuth pour les flux d'authentification, comme me demander d'envoyer des `` jetons de support '' pour chaque demande au lieu d'un simple en-tête de jeton, mais je pense que OAuth est beaucoup plus complexe qu'une simple authentification basée sur JWT. Quelles sont les principales différences, dois-je faire en sorte que l'authentification JWT se comporte comme OAuth?

J'utilise également le JWT comme XSRF-TOKEN pour empêcher XSRF mais on me demande de les garder séparés? Dois-je les garder séparés? Toute aide ici sera appréciée et pourrait conduire à un ensemble de directives pour la communauté.

Réponses:


330

TL; DR Si vous avez des scénarios très simples, comme une seule application cliente, une seule API, alors il pourrait ne pas être avantageux de passer à OAuth 2.0, d'autre part, de nombreux clients différents (basés sur un navigateur, mobile natif, côté serveur) , etc.), puis s'en tenir aux règles OAuth 2.0 pourrait le rendre plus gérable que d'essayer de faire rouler votre propre système.


Comme indiqué dans une autre réponse, JWT ( Learn JSON Web Tokens ) n'est qu'un format de jeton, il définit un mécanisme compact et autonome pour la transmission de données entre les parties d'une manière qui peut être vérifiée et approuvée car elle est signée numériquement. De plus, les règles de codage d'un JWT rendent également ces jetons très faciles à utiliser dans le contexte de HTTP.

Étant autonomes (le jeton réel contient des informations sur un sujet donné), ils sont également un bon choix pour implémenter des mécanismes d'authentification sans état (aka Look mum, no sessions! ). En empruntant cette route et la seule chose qu'une partie doit présenter pour avoir accès à une ressource protégée est le jeton lui-même, le jeton en question peut être appelé un jeton porteur.

En pratique, ce que vous faites peut déjà être classé comme basé sur des jetons de porteur. Cependant, considérez que vous n'utilisez pas de jetons de support comme spécifié par les spécifications liées à OAuth 2.0 (voir RFC 6750 ). Cela impliquerait de s'appuyer sur l' Authorizationen-tête HTTP et d'utiliser le Bearerschéma d'authentification.

Concernant l'utilisation du JWT pour empêcher la CSRF sans connaître les détails exacts, il est difficile de vérifier la validité de cette pratique, mais pour être honnête, cela ne semble pas correct et / ou utile. L'article suivant ( Cookies vs Tokens: The Definitive Guide ) peut être une lecture utile à ce sujet, en particulier la section Protection XSS et XSRF .

Un dernier conseil, même si vous n'avez pas besoin de passer à OAuth 2.0 complet, je vous recommande fortement de passer votre jeton d'accès dans l'en- Authorizationtête au lieu d' utiliser des en-têtes personnalisés . S'ils sont vraiment des jetons porteurs, suivez les règles de la RFC 6750, sinon, vous pouvez toujours créer un schéma d'authentification personnalisé et toujours utiliser cet en-tête.

Les en-têtes d'autorisation sont reconnus et spécialement traités par les serveurs proxy et les serveurs HTTP. Ainsi, l'utilisation de ces en-têtes pour envoyer des jetons d'accès aux serveurs de ressources réduit la probabilité de fuite ou de stockage involontaire des demandes authentifiées en général, et en particulier des en-têtes d'autorisation.

(source: RFC 6819, section 5.4.1 )


2
Est-ce à dire que si j'utilise l'authentification JWT sur une application mobile, je n'ai pas besoin d'inclure CSRF dans sa requête POST? Contrairement à l'interface Web avec des formulaires?
user805981

2
Cookies vs Tokens: The Definitive Guide, ie auth0.com/blog/cookies-vs-tokens-definitive-guide ne fonctionne pas Ceci est un autre excellent article de discussion: stackoverflow.com/questions/37582444/…
Siddharth Jain

1
"ils sont également un bon choix pour implémenter des mécanismes d'authentification sans état (aka Look mum, no sessions!)." Si vous avez besoin d'un moyen d'invalider le jeton parce que disons qu'il a été divulgué ou intercepté ou que l'utilisateur s'est simplement déconnecté et a supprimé le jeton n'est pas suffisamment sécurisé car le jeton est toujours valide, alors vous devez les stocker dans une base de données, donc je pense qu'il doit y avoir une notion de session sur le serveur à des fins de sécurité ou une simple liste noire de jetons. Vous pourriez dire utiliser des jetons "Actualiser" pour cela. Mais les jetons de rafraîchissement peuvent également être interceptés et les conséquences sont bien pires.
Konrad

1
@ Konrad, j'ai mis en œuvre un mécanisme similaire qui stockait les jetons valides inutilisés dans une table, les libère de là à leur expiration. Pour chaque demande entrante, j'ai écrit du code pour recouper le jeton entrant avec les "jetons valides inutilisés". Même si cela fonctionne, j'ai toujours eu des doutes - il devrait y avoir une meilleure façon de gérer les jetons inutilisés mais toujours valides.
Tech Junkie

2
D'un autre côté, les jetons de rafraîchissement compliquent simplement l'implémentation du client. Parce que si votre jeton d'accès expire, vous devez gérer cela, l'utilisateur sera énervé si vous le déconnectez sans aucune possibilité d'actualisation manuelle de la session (comme le font les banques). C'est un peu plus de travail à faire, également l'utilisation de méthodes d'authentification (OID) et d'autorisation (OAuth) standard peut très souvent être une exagération.
Konrad

282

OAuth 2.0 définit un protocole, c'est-à-dire spécifie comment les jetons sont transférés, JWT définit un format de jeton.

OAuth 2.0 et «authentification JWT» ont une apparence similaire en ce qui concerne la (2e) étape où le client présente le jeton au serveur de ressources: le jeton est passé dans un en-tête.

Mais "l'authentification JWT" n'est pas un standard et ne spécifie pas comment le client obtient le jeton en premier lieu (la 1ère étape). C'est de là que vient la complexité perçue de OAuth: elle définit également diverses façons dont le client peut obtenir un jeton d'accès à partir de quelque chose qui est appelé un serveur d'autorisation.

La vraie différence est donc que JWT n'est qu'un format de jeton, OAuth 2.0 est un protocole (qui peut utiliser un JWT comme format de jeton).


10
Les implémentations du protocole oAuth utilisent-elles JWT comme format de jeton, dans la plupart des cas? Sinon, quelle est la plus courante?
James Wierzba

14
Le format de jeton dans oauth n'est pas défini, mais JWT devrait fonctionner
correctement

129

Premièrement, nous devons différencier JWT et OAuth. Fondamentalement, JWT est un format de jeton. OAuth est un protocole d'autorisation qui peut utiliser JWT comme jeton. OAuth utilise le stockage côté serveur et côté client. Si vous souhaitez vous déconnecter réellement, vous devez utiliser OAuth2. L'authentification avec le jeton JWT ne peut pas se déconnecter réellement. Parce que vous n'avez pas de serveur d'authentification qui assure le suivi des jetons. Si vous souhaitez fournir une API à des clients tiers, vous devez également utiliser OAuth2. OAuth2 est très flexible. L'implémentation de JWT est très facile et ne prend pas longtemps à implémenter. Si votre application a besoin de ce type de flexibilité, vous devriez opter pour OAuth2. Mais si vous n'avez pas besoin de ce scénario de cas d'utilisation, l'implémentation d'OAuth2 est une perte de temps.

Le jeton XSRF est toujours envoyé au client dans chaque en-tête de réponse. Peu importe si un jeton CSRF est envoyé dans un jeton JWT ou non, car le jeton CSRF est sécurisé avec lui-même. Par conséquent, l'envoi d'un jeton CSRF dans JWT n'est pas nécessaire.


7
Je ne comprends pas pourquoi cette réponse a beaucoup de votes positifs, elle indique que "OAuth est un cadre d'authentification" et c'est complètement faux. OAuth est un protocole d'autorisation et uniquement un protocole d'autorisation.
Michael

4
Bonjour @Michael, il y a trop de malentendus à ce sujet. J'ai édité mon commentaire merci.
Melikşah Şimşek

6
@Michael, merci d'apprécier la réponse des autres bcz, il a partagé ses connaissances raffinées avec nous et j'ai vraiment apprécié la réponse.
Yasir Shabbir Choudhary

Êtes-vous en train de dire que Oauth n'est qu'un élément de normes que les développeurs devraient suivre? Ou c'est vraiment un cadre?
StormTrooper

65

JWT (JSON Web Tokens) - Ce n'est qu'un format de jeton. Les jetons JWT sont des structures de données codées JSON qui contiennent des informations sur l'émetteur, le sujet (revendications), le délai d'expiration, etc. JWT est plus simple que SAML 1.1 / 2.0 et pris en charge par tous les appareils et il est plus puissant que SWT (Simple Web Token).

OAuth2 - OAuth2 résout un problème selon lequel l'utilisateur souhaite accéder aux données à l'aide d'un logiciel client comme les applications Web basées sur la navigation, les applications mobiles natives ou les applications de bureau. OAuth2 est juste pour l'autorisation, le logiciel client peut être autorisé à accéder aux ressources au nom de l'utilisateur final à l'aide d'un jeton d'accès.

OpenID Connect - OpenID Connect s'appuie sur OAuth2 et ajoute une authentification. OpenID Connect ajoute des contraintes à OAuth2 comme UserInfo Endpoint, ID Token, la découverte et l'enregistrement dynamique des fournisseurs OpenID Connect et la gestion de session. JWT est le format obligatoire pour le jeton.

Protection CSRF - Vous n'avez pas besoin de mettre en œuvre la protection CSRF si vous ne stockez pas de jeton dans le cookie du navigateur.

Vous pouvez lire plus de détails ici http://proficientblog.com/microservices-security/


3
Pas de cookies == Pas de protection CSRF. Si vous n'utilisez pas de cookies pour l'autorisation, vous n'avez pas à vous soucier de la protection CSRF.
niranjan harpale

51

Il semble que tous ceux qui ont répondu ici ont raté le point discutable d'OAUTH

De Wikipédia

OAuth est un standard ouvert pour la délégation d'accès, couramment utilisé comme moyen pour les utilisateurs d'Internet d'accorder aux sites Web ou aux applications l'accès à leurs informations sur d'autres sites Web mais sans leur donner les mots de passe. [1] Ce mécanisme est utilisé par des sociétés telles que Google, Facebook, Microsoft et Twitter pour permettre aux utilisateurs de partager des informations sur leurs comptes avec des applications ou des sites Web tiers.

Le point clé ici est access delegation. Pourquoi est-ce que quelqu'un créerait OAUTH quand il y a une authentification basée sur id / pwd, soutenue par une authentification multifactorielle comme les OTP et peut être sécurisée par des JWT qui sont utilisés pour sécuriser l'accès aux chemins (comme les étendues dans OAUTH) et définir l'expiration du accès

Il n'y a aucun intérêt à utiliser OAUTH si les consommateurs accèdent à leurs ressources (vos points de terminaison) uniquement via leurs sites Web (ou applications) de confiance qui sont à nouveau hébergés sur vos points de terminaison

Vous ne pouvez accéder à l'authentification OAUTH que si vous êtes OAUTH providerdans le cas où les propriétaires de ressources (utilisateurs) souhaitent accéder à leurs (vos) ressources (points de terminaison) via un client tiers (application externe). Et il est exactement créé dans le même but bien que vous puissiez en abuser en général

Autre remarque importante:
vous utilisez librement le mot authenticationpour JWT et OAUTH mais vous ne fournissez ni le mécanisme d'authentification. Oui, l'un est un mécanisme de jeton et l'autre est un protocole mais une fois authentifiés, ils ne sont utilisés que pour l'autorisation (gestion des accès). Vous devez sauvegarder OAUTH avec une authentification de type OPENID ou vos propres informations d'identification client


4
OAuth peut également être utilisé pour vos propres clients, pas nécessairement uniquement ceux de tiers. C'est exactement ce que fait le type Grant Credentials Grant.
harpratap

1
Je cherchais google pour une réponse aussi concrète mais je n'ai pas pu en trouver une. Tout le monde parlait simplement de définitions, par exemple jeton vs protocole. Votre réponse expliquait le véritable but de l'utilisation l'une au-dessus de l'autre. Merci beaucoup!
Vivek Goel

9

trouver les principales différences entre JWT et OAuth

  1. OAuth 2.0 définit un protocole et JWT définit un format de jeton.

  2. OAuth peut utiliser JWT comme format de jeton ou jeton d'accès qui est un jeton porteur.

  3. La connexion OpenID utilise principalement JWT comme format de jeton.


6

JWT est une norme ouverte qui définit un moyen compact et autonome de transmission sécurisée d'informations entre les parties. Il s'agit d'un protocole d'authentification dans lequel nous autorisons le transfert de revendications codées (jetons) entre deux parties (client et serveur) et le jeton est émis lors de l'identification d'un client. À chaque demande ultérieure, nous envoyons le jeton.

Tandis qu'OAuth2 est un cadre d'autorisation, où il a des procédures générales et des configurations définies par le cadre. JWT peut être utilisé comme mécanisme dans OAuth2.

Vous pouvez en savoir plus à ce sujet ici

OAuth ou JWT? Lequel utiliser et pourquoi?


5

La question est courante, mais elle n'est pas tout à fait sensée. JWT est un type de jeton et OAuth est un framework qui décrit comment distribuer des jetons.

Qu'entendons-nous par «cadre»? Juste la séquence de demandes et de réponses, et les formats de celles-ci, qui peuvent et doivent être utilisés pour demander des jetons. OAuthv2 décrit des «flux» distincts ou des types d'octroi pour différents scénarios et possède différentes extensions (comme PKCE) pour étendre la sécurité de flux particuliers.

Le résultat d'une demande de jeton via une autorisation OAuthV2 est ... un jeton. Cette chose est ensuite utilisée comme un "jeton porteur", ce qui signifie que toute partie qui détient le jeton peut le présenter lors d'une demande de service api (par exemple, "quel est le solde sur ma carte de valeur stockée?"). En tant que jeton au porteur, cela fonctionne comme de l'argent liquide. Si vous le tenez, vous pouvez l'utiliser. (Bien que contrairement à l'argent comptant, un jeton ne soit pas utilisé et perdu. Peut-être une meilleure analogie est-elle un billet pour une journée dans le système de transport en commun ou un billet toute la journée à Disneyworld.)

JWT est un type particulier de jeton, et JWT peut absolument être utilisé comme jeton OAuth Bearer. En fait, c'est la pratique la plus courante. À la lumière de cela, "JWT vs OAuth" est une comparaison de pommes et de charrettes à pommes.

Souvent, les gens pensent que le "jeton OAuth" implique toujours un jeton opaque - une séquence aléatoire de caractères alphanumériques qui ne contient aucune signification inhérente - qui est accordé par un dispensaire de jetons OAuth, qui ne peut ensuite être validé que par ce même système de dispensaires OAuth. Mais ce n'est pas le seul type de jeton OAuth. Un jeton opaque est une sorte de jeton; JWT peut être utilisé comme un autre type de jeton OAuth.

Les JWT, en revanche, ne sont pas opaques. Le JWT n'est pas un "pointeur" ou une référence à l'information. Il contient en fait de nombreuses informations spécifiques, qui peuvent être extraites et interprétées par toute partie disposant du jeton. Étant donné que le JWT contient des informations réelles, un JWT peut être volumineux; 300 octets, 500 octets ou plus, selon les revendications qu'il contient et l'algorithme utilisé pour le signer. Lorsque les gens disent que «les JWT s'auto-valident», ce qu'ils veulent dire, tout détenteur du JWT peut l'ouvrir, le valider, puis prendre des décisions d'autorisation en fonction des revendications qui y sont présentées. Valider le JWT signifie: vérifier sa structure, décoder l'encodage base64, vérifier que la clé est correcte, vérifier la signature, puis vérifier que les revendications requises sont présentes dans le jeton, vérifier l'expiration. Ce n'est pas une chose simple, plutôt un processus en plusieurs étapes, mais bien sûr, il y a beaucoup de bibliothèques dans divers langages de programmation qui gèrent cela, et bien sûr il y a la politique VerifyJWT qui vous aide à le faire dans un proxy API Apigee Edge. Le fait est que tout détenteur ou récepteur peut vérifier un jeton. Pour cette raison, nous disons que JWT prend en charge la "Fédération" - n'importe qui peut générer un jeton, et n'importe qui peut lire et valider un jeton.

revendications personnalisées. Les jetons JWT et OAuth opaques peuvent porter des revendications personnalisées sur le sujet. Sécurité. Les deux sont des jetons au porteur. Les deux doivent être protégés en tant que secrets. expiration. Les deux peuvent être marqués d'une expiration. Les deux peuvent être rafraîchis. Le mécanisme ou l'expérience d'authentification. Les deux peuvent présenter la même expérience utilisateur.


0

Jwt est un ensemble strict d'instructions pour l'émission et la validation de jetons d'accès signés. Les jetons contiennent des revendications qui sont utilisées par une application pour limiter l'accès à un utilisateur

D'un autre côté, OAuth2 n'est pas un protocole, c'est un cadre d'autorisation délégué. pensez à des directives très détaillées, pour permettre aux utilisateurs et aux applications d'autoriser des autorisations spécifiques à d'autres applications dans les paramètres privés et publics. OpenID Connect qui se trouve au-dessus de OAUTH2 vous donne l'authentification et l'autorisation.

Remarque oauth2 peut fonctionner avec jwt, une implémentation flexible, extensible à différentes applications


Il semble que vous ayez cela exactement à l'envers.
jbruni
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.