web-dev-qa-db-fra.com

JWT vs cookies pour l'authentification par jeton

J'ai lu quelques articles sur "JWT vs Cookie" mais ils m'ont seulement rendu plus confus ...

  1. Je veux un peu de clarification, lorsque les gens parlent de "authentification par jeton vs cookies", cookies ne fait ici que se référer à cookies de session ? D'après ce que j'ai compris, le cookie est comme un média, il peut être utilisé pour mettre en œuvre une authentification basée sur un jeton (enregistrez quelque chose qui puisse identifier l'utilisateur connecté du côté client) ou une authentification basée sur la session (stocke une constante côté client qui correspond aux informations de session du côté serveur)

  2. Pourquoi avons-nous besoin de jeton Web JSON? J'utilisais le cookie standard pour implémenter l'authentification par jeton ( n'utilisant pas d'identifiant de session, n'utilisant pas la mémoire du serveur ou le stockage de fichiers): Set-Cookie: user=innocent; preferred-color=Azure, et la seule différence que j’ai observée est que JWT contient à la fois charge utile et signature ... alors que vous pouvez choisir entre signé ou en texte brut cookie pour http entête. À mon avis, un cookie signé (cookie:'time=s%3A1464743488946.WvSJxbCspOG3aiGi4zCMMR9yBdvS%2B6Ob2f3OG6%2FYCJM') est plus économe en espace, le seul inconvénient est que le client ne peut pas lire le jeton, seul le serveur peut ... mais je pense que ça va parce que , réclamer dans JWT est facultatif, il n'est pas nécessaire que le jeton ait un sens

63
watashiSHUN

La plus grande différence entre les jetons au porteur et les cookies est que le navigateur va envoyer automatiquement des cookies, où les jetons au porteur doivent être ajouté explicitement à la requête HTTP.

Cette fonctionnalité fait des cookies un bon moyen de sécuriser des sites Web, où un utilisateur se connecte et navigue entre les pages en utilisant des liens.

Le navigateur qui envoie automatiquement des cookies a également un gros inconvénient: CSRF attaque. Lors d'une attaque CSRF, un site Web malveillant tire parti du fait que votre navigateur joindra automatiquement les cookies d'authentification aux demandes de ce domaine et incitera votre navigateur à exécuter une demande.

Supposons que le site Web à l’adresse https://www.example.com autorise les utilisateurs authentifiés à modifier leur mot de passe en POST- le nouveau mot de passe en https: // www .example.com/changepassword sans exiger que le nom d'utilisateur ou l'ancien mot de passe soit publié.

Si vous êtes toujours connecté à ce site Web lorsque vous visitez un site Web malveillant qui charge une page de votre navigateur qui déclenche un POST à cette adresse, votre navigateur joindra fidèlement les cookies d'authentification, permettant ainsi à attaquant pour changer votre mot de passe.

Les cookies peuvent également être utilisés pour protéger les services Web, mais de nos jours, les jetons supports sont utilisés le plus souvent. Si vous utilisez des cookies pour protéger votre service Web, ce service doit résider sur le domaine pour lequel les cookies d'authentification sont définis, car politique de même origine n'enverra pas de cookies à un autre domaine.

De plus, les cookies rendent plus difficile l'utilisation de votre API par les applications autres que les navigateurs (comme les applications mobiles pour tablettes).

97
MvdD

Vue d'ensemble

Ce que vous demandez, c'est la différence entre les cookies et les jetons porteurs pour l'envoi de jetons Web JSON (JWT) du client au serveur.

Les cookies et les jetons porteurs envoient des données.

Une différence réside dans le fait que les cookies servent à l’envoi et au stockage de données arbitraires, alors que les jetons supports sont spécifiquement destinés à l’envoi de données d’autorisation.

Ces données sont souvent codées en tant que JWT.

Cookie

Un cookie est une paire nom-valeur, stockée dans un navigateur Web, avec une date d'expiration et un domaine associé.

Nous stockons les cookies dans un navigateur Web avec JavaScript ou avec un en-tête de réponse HTTP.

document.cookie = 'my_cookie_name=my_cookie_value'   // JavaScript
Set-Cookie: my_cookie_name=my_cookie_value           // HTTP Response Header

Le navigateur Web envoie automatiquement des cookies avec chaque demande au domaine du cookie.

GET http://www.bigfont.ca
Cookie: my_cookie_name=my_cookie_value               // HTTP Request Header

jeton porteur

Un jeton porteur est une valeur qui entre dans l'en-tête Authorization de toute requête HTTP. Il n'est pas automatiquement stocké nulle part, il n'a pas de date d'expiration ni de domaine associé. C'est juste une valeur. Nous stockons manuellement cette valeur dans nos clients et ajoutons manuellement cette valeur à l'en-tête HTTP Authorization.

GET http://www.bigfont.ca
Authorization: Bearer my_bearer_token_value          // HTTP Request Header

JWT et authentification basée sur les jetons

Lorsque nous effectuons une authentification basée sur des jetons, telle que OpenID, OAuth ou OpenID Connect, nous recevons un access_token (et parfois id_token) d'une autorité de confiance. Habituellement, nous souhaitons le stocker et l’envoyer avec les requêtes HTTP pour les ressources protégées. Comment fait-on cela?

L'option 1 consiste à stocker le ou les jetons dans un cookie. Ceci gère le stockage et envoie automatiquement le ou les jetons au serveur dans l'en-tête Cookie de chaque demande. Le serveur analyse ensuite le cookie, vérifie le ou les jetons et répond en conséquence.

Une autre option consiste à stocker le jeton dans le stockage local/de session, puis à définir manuellement l'en-tête Authorization de chaque demande. Dans ce cas, le serveur lit l'en-tête et procède comme avec un cookie.

Il vaut la peine de lire les RFC liées pour en savoir plus.

58
Shaun Luttin

Outre ce que MvdD a déclaré à propos des cookies envoyés automatiquement:

  1. Un cookie peut être un média, mais sa fonction la plus importante est la manière dont il interagit avec le navigateur. Les cookies sont configurés par le serveur et envoyés aux demandes de manière très spécifique. JWT, par contre, est exclusivement un média, c’est une affirmation de certains faits dans une structure particulière. Si vous le souhaitez, vous pouvez utiliser un JWT comme cookie d’authentification. Lorsque vous lisez des articles les comparant, ils parlent généralement d'utiliser un JWT envoyé en tant que jeton porteur par code frontal contre un cookie d'authentification qui correspond à une session en mémoire cache ou à des données utilisateur sur le back-end.
  2. JWT offre de nombreuses fonctionnalités et les met dans une norme afin de pouvoir les utiliser entre les parties. Un JWT peut agir comme une affirmation signée de certains faits dans de nombreux endroits. Un cookie, quelles que soient les données que vous y avez insérées ou si vous le signez, n’a vraiment de sens que de l’utiliser entre un navigateur et un back-end spécifique. JWT peut être utilisé depuis le navigateur vers le back-end, entre les back-end contrôlés par différentes parties (OpenId Connect en est un exemple) ou au sein des services back-end d'une partie. En ce qui concerne votre exemple spécifique de vos cookies signés, vous pouvez probablement obtenir les mêmes fonctions ("ne pas utiliser l'identifiant de session, ni utiliser la mémoire du serveur ou le stockage de fichiers") comme JWT dans ce cas d'utilisation, mais vous perdez des bibliothèques et une révision par les pairs. la norme, en plus des questions relatives à la CSRF abordées dans l’autre réponse.

En résumé: les publications que vous lisez comparent probablement JWT en tant que jeton porteur à un cookie d'authentification pour l'authentification du navigateur au serveur. Mais JWT peut faire beaucoup plus, il apporte une standardisation et des fonctionnalités à utiliser en dehors du cas d'utilisation auquel vous songez probablement.

12
kag0