J'ai lu quelques articles sur "JWT vs Cookie" mais ils m'ont seulement rendu plus confus ...
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)
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
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).
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.
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
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
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.
Outre ce que MvdD a déclaré à propos des cookies envoyés automatiquement:
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.