Authentification par jeton et cookies


141

Quelle est la différence entre l'authentification par jeton et l'authentification à l'aide de cookies?

J'essaie d'implémenter la démo Ember Auth Rails mais je ne comprends pas les raisons de l'utilisation de l'authentification par jeton comme décrit dans la FAQ Ember Auth sur la question «Pourquoi l'authentification par jeton?»


4
Un jeton peut être donné à votre application mobile et stocké dans une variable (par vous) pour une utilisation ultérieure ou enregistré (par vous) via JavaScript dans votre navigateur pour une utilisation dans les demandes SPA. Un cookie est généralement utilisé dans un navigateur (par le navigateur).
Tino Mclaren

Réponses:


33

Une application Web typique est principalement sans état , en raison de sa nature de demande / réponse . Le protocole HTTP est le meilleur exemple de protocole sans état . Mais comme la plupart des applications Web ont besoin d'un état , afin de conserver l' état , entre le serveur et le client, les cookies sont utilisés de telle sorte que le serveur puisse renvoyer chaque réponse au client. Cela signifie que la prochaine demande faite par le client inclura ce cookie et sera donc reconnue par le serveur. De cette façon, le serveur peut maintenir une session avec le client sans état , sachant presque tout sur l' état de l'application , mais stocké sur le serveur. Dans ce scénario, à aucun moment le client ne tientstate , ce qui n'est pas ainsi que fonctionne Ember.js

Dans Ember.js, les choses sont différentes. Ember.js facilite le travail du programmeur car il contient en effet l' état pour vous, dans le client, en sachant à chaque instant son état sans avoir à faire une requête au serveur demandant des données d' état .

Cependant, la conservation de l' état dans le client peut également parfois introduire des problèmes de concurrence qui ne sont tout simplement pas présents dans les situations sans état . Cependant, Ember.js traite également ces problèmes pour vous, en particulier les données de braise sont construites dans cet esprit. En conclusion, Ember.js est un framework conçu pour les clients avec état .

Ember.js ne fonctionne pas comme une application Web sans état typique où la session , l' état et les cookies correspondants sont gérés presque entièrement par le serveur. Ember.js conserve son état complètement en javascript (dans la mémoire du client, et non dans le DOM comme certains autres frameworks) et n'a pas besoin du serveur pour gérer la session. Cela se traduit par Ember.js plus polyvalent dans de nombreuses situations, par exemple lorsque votre application est en mode hors ligne.

Évidemment, pour des raisons de sécurité, il a besoin d'une sorte de jeton ou de clé unique à envoyer au serveur chaque fois qu'une demande est faite afin d'être authentifié , de cette façon le serveur peut rechercher le jeton d'envoi (qui a été initialement émis par le serveur) et vérifiez s'il est valide avant de renvoyer une réponse au client.

À mon avis, la principale raison pour laquelle utiliser un jeton d'authentification au lieu de cookies comme indiqué dans la FAQ Ember Auth est principalement à cause de la nature du cadre Ember.js et aussi parce qu'il correspond davantage au paradigme de l'application Web avec état . Par conséquent, le mécanisme de cookies n'est pas la meilleure approche lors de la création d'une application Ember.js.

J'espère que ma réponse donnera plus de sens à votre question.


84
Je ne comprends toujours pas pourquoi un jeton est meilleur / différent d'un cookie. D'une manière ou d'une autre, vous envoyez quelque chose au serveur api qui identifie une session valide. En supposant que vous exécutez tout sur un seul domaine (et même si ember et votre api sont sur des serveurs différents, tout ce que vous avez à faire pour ce faire est d'exécuter derrière un cdn, ce que vous devriez probablement faire de toute façon) quel avantage les jetons offrent-ils qui justifie le travail de configuration supplémentaire et vulnérabilité supplémentaire aux attaques de synchronisation?
Michael Johnston

46
D'accord avec Michael Johnston. Cette réponse continue d'expliquer ce qu'est l'authentification basée sur les jetons, mais n'a en fait pas répondu à la question. L'information pertinente la plus proche que je peux voir se trouve dans le dernier bit "à cause de la nature du framework ember.js et aussi parce qu'elle correspond davantage au paradigme de l'application web statefull" mais ce n'est pas du tout une réponse. J'ai la même question.
Daniel

5
Je suis d'accord avec les deux commentaires ici ... En fait, je pense que tout "c'est le chemin de la braise" est un peu une
dérobade

3
Je pense honnêtement que l'état est un hareng rouge en ce qui concerne le cookie par rapport à un jeton soumis par d'autres moyens. Je pense que cela confond les notions de preuve utilisateur avec d'autres informations de profil utilisateur. Je pourrais utiliser un cookie de la même manière qu'un en-tête HTTP ou un autre canal pour soumettre un jeton. Je pense que la différence consiste davantage à éviter les problèmes liés à la politique d'origine unique pour les cookies ou à supprimer le fardeau de la mise en œuvre d'un conteneur de cookies aux clients natifs de votre back-end.
Michael Lang

15
ne faites pas de publicité pour ember.js, concentrez-vous sur la question posée ... désolé d'être impoli.
Vick_Pk

338

Http est apatride. Afin de vous autoriser, vous devez «signer» chaque demande que vous envoyez au serveur.

Authentification par jeton

  • Une demande adressée au serveur est signée par un "jeton" - cela signifie généralement définir des en-têtes http spécifiques, cependant, ils peuvent être envoyés dans n'importe quelle partie de la requête http (corps POST, etc.)

  • Avantages:

    • Vous ne pouvez autoriser que les demandes que vous souhaitez autoriser. (Cookies - même le cookie d'autorisation est envoyé pour chaque demande.)
    • Immunité à XSRF (Court exemple de XSRF - Je vous enverrai un lien dans un e-mail qui ressemblera à <img src="http://bank.com?withdraw=1000&to=myself" />, et si vous êtes connecté via l'authentification par cookie à bank.com, et bank.com n'a aucun moyen de XSRF protection, je retirerai de l'argent de votre compte simplement par le fait que votre navigateur déclenchera une requête GET autorisée à cette URL.) Notez qu'il existe des mesures anti-falsification que vous pouvez faire avec l'authentification basée sur les cookies - mais vous devez les implémenter.
    • Les cookies sont liés à un seul domaine. Un cookie créé sur le domaine foo.com ne peut pas être lu par le domaine bar.com, tandis que vous pouvez envoyer des jetons à n'importe quel domaine de votre choix. Ceci est particulièrement utile pour les applications à page unique qui consomment plusieurs services qui nécessitent une autorisation - je peux donc avoir une application Web sur le domaine myapp.com qui peut envoyer des requêtes côté client autorisées à myservice1.com et à myservice2.com.
  • Les inconvénients:
    • Vous devez stocker le jeton quelque part; tandis que les cookies sont stockés «prêts à l'emploi». Les emplacements qui viennent à l'esprit sont localStorage (con: le jeton est conservé même après la fermeture de la fenêtre du navigateur), sessionStorage (pro: le jeton est rejeté après la fermeture de la fenêtre du navigateur, con: l'ouverture d'un lien dans un nouvel onglet rendra cet onglet anonyme) et les cookies (Pro: le jeton est supprimé après la fermeture de la fenêtre du navigateur. Si vous utilisez un cookie de session, vous serez authentifié lors de l'ouverture d'un lien dans un nouvel onglet, et vous êtes immunisé contre XSRF puisque vous ignorez le cookie pour l'authentification, vous l'utilisez simplement comme stockage de jetons. Con: les cookies sont envoyés pour chaque requête. Si ce cookie n'est pas marqué comme https uniquement, vous êtes ouvert aux attaques de type "homme au milieu".)
    • Il est légèrement plus facile de lancer une attaque XSS contre l'authentification basée sur des jetons (c'est-à-dire que si je suis capable d'exécuter un script injecté sur votre site, je peux voler votre jeton; cependant, l'authentification basée sur les cookies n'est pas non plus une solution miracle - alors que les cookies marqués comme http-only ne peut pas être lu par le client, le client peut toujours faire des demandes en votre nom qui incluront automatiquement le cookie d'autorisation.)
    • Les demandes de téléchargement d'un fichier, qui est censé ne fonctionner que pour les utilisateurs autorisés, vous obligent à utiliser File API. La même demande fonctionne directement pour l'authentification basée sur les cookies.

Authentification des cookies

  • Une demande au serveur est toujours connectée par cookie d'autorisation.
  • Avantages:
    • Les cookies peuvent être marqués comme "http uniquement", ce qui les rend impossibles à lire du côté client. C'est mieux pour la protection contre les attaques XSS.
    • Sort de la boîte - vous n'avez pas à implémenter de code côté client.
  • Les inconvénients:
    • Lié à un seul domaine. (Donc, si vous avez une application d'une seule page qui fait des demandes à plusieurs services, vous pouvez finir par faire des choses folles comme un proxy inverse.)
    • Vulnérable à XSRF. Vous devez mettre en œuvre des mesures supplémentaires pour protéger votre site contre la falsification de demandes intersites.
    • Sont envoyés pour chaque demande (même pour les demandes qui ne nécessitent pas d'authentification).

Dans l'ensemble, je dirais que les jetons vous offrent une meilleure flexibilité (puisque vous n'êtes pas lié à un seul domaine). L'inconvénient est que vous devez coder vous-même.


56
Cette réponse est beaucoup plus proche d'une réponse canonique que celle acceptée.
xlecoustillier

3
Merci @ ondrej-svejdar. C'est de loin la meilleure réponse! Je ne discuterais qu'avec la partie «assez de codage». Il existe un bon nombre de bibliothèques disponibles pour à peu près toutes les langues. Donc, à moins que vous ne souhaitiez vraiment connaître les mécanismes de l'implémentation JWT, il n'est pas nécessaire de partir de zéro.
FullStackForger

2
Are send out for every single requestLes jetons sont également envoyés pour chaque demande
Eugen Konkov

10
@EugenKonkov no. pas nécessairement. Seulement si vous ajoutez l'en-tête. les cookies sont envoyés depuis le navigateur si vous le souhaitez ou si vous ne le souhaitez pas
Royi Namir

2
@Zack - ça compte. Le problème avec les cookies est qu'ils sont ajoutés automatiquement à la demande du navigateur. Les jetons en revanche sont ajoutés à la requête XHR par javascript. Il est impossible pour evildomain.com d'accéder au stockage local pour mysite.com (btw. Je ne recommande pas le stockage local comme lieu de stockage des jetons) ou de ramer (je suppose que vous voulez dire ici la variable javascript contenant le jeton) car la variable est mise en bac à sable dans une fenêtre de navigateur différente.
Ondrej Svejdar

34
  • Les jetons doivent être stockés quelque part (stockage local / de session ou cookies)

  • Les jetons peuvent expirer comme les cookies, mais vous avez plus de contrôle

  • Le stockage local / de session ne fonctionnera pas sur les domaines, utilisez un cookie marqueur

  • Les demandes de contrôle en amont seront envoyées à chaque demande CORS

  • Lorsque vous avez besoin de diffuser quelque chose, utilisez le jeton pour obtenir une demande signée

  • Il est plus facile de gérer XSS que XSRF

  • Le token est envoyé à chaque demande, attention à sa taille

  • Si vous stockez des informations confidentielles, cryptez le jeton

  • Les jetons Web JSON peuvent être utilisés dans OAuth

  • Les jetons ne sont pas des balles d'argent, réfléchissez bien à vos cas d'utilisation d'autorisation

http://blog.auth0.com/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/

http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/


14
On ne sait pas si vos points sont pour des cookies ou des jetons, de quel côté sont-ils?
Pureferret

6
Je ne comprends pas pourquoi vous «avez plus de contrôle» sur les jetons que sur les cookies.
Aaron

@onsmith D'après ce que je comprends, il y a plus qu'un point unique ici. Tout d'abord, un cookie est envoyé à chaque demande. L'envoi de jetons est déclenché par du code javascript. Ils ne sont pas envoyés automatiquement. En outre, conformément à la section 4 de la RFC, il semble que JWT soit conçu comme un conteneur utilisé pour transférer des revendications de sécurité basées entre des parties. Ce qui offre un contrôle plus granulaire et permet de générer des jetons d'authentification pour des tiers avec un ensemble d'autorisations leur permettant de les utiliser en votre nom.
FullStackForger

18

Pour les Googleurs :

  • NE PAS mélanger l' état avec les mécanismes de transfert d'état

ÉTAT

  • Stateful = enregistrer les informations d'autorisation côté serveur, c'est la méthode traditionnelle
  • Stateless = enregistrer les informations d'autorisation côté client, avec une signature pour garantir l'intégrité

MÉCANISMES

  • Cookie = un en-tête spécial avec un traitement spécial (accès, stockage, expiration, sécurité, transfert automatique) par les navigateurs
  • En-têtes personnalisés = par exemple Authorization, ne sont que des en-têtes sans traitement spécial, le client doit gérer tous les aspects du transfert
  • Autre . D'autres mécanismes de transfert peuvent être utilisés, par exemple, la chaîne de requête a été un choix pour transférer l'identifiant d'authentification pendant un certain temps mais a été abandonnée pour son insécurité

COMPARAISON DE L'ÉTAT

  • "Autorisation avec état" signifie que le serveur stocke et gère les informations d'autorisation de l'utilisateur sur le serveur, faisant des autorisations une partie de l'état de l'application
  • Cela signifie que le client doit uniquement conserver un «ID d'authentification» et que le serveur peut lire les détails d'authentification à partir de sa base de données
  • Cela implique que le serveur conserve un pool d'authentifications actives (utilisateurs connectés) et interrogera ces informations pour chaque demande
  • "Autorisation sans état" signifie que le serveur ne stocke pas et ne gère pas les informations d'authentification des utilisateurs, il ne sait tout simplement pas quels utilisateurs sont connectés et compte sur le client pour produire des informations d'authentification.
  • Le client stockera des informations d'authentification complètes telles que qui vous êtes (ID utilisateur), et éventuellement des autorisations, l'heure d'expiration, etc., c'est plus qu'un simple ID d'authentification, il reçoit donc un nouveau jeton de nom
  • De toute évidence, le client ne peut pas être approuvé, les données d'authentification sont donc stockées avec une signature générée à partir de hash(data + secret key), où la clé secrète n'est connue que du serveur, de sorte que l'intégrité des données de jeton peut être vérifiée
  • Notez que le mécanisme de jeton garantit simplement l'intégrité, mais pas la confidentialité, le client doit implémenter cela
  • Cela signifie également que pour chaque demande, le client doit soumettre un jeton complet, ce qui entraîne une bande passante supplémentaire

COMPARAISON MÉCANISME

  • "Cookie" n'est qu'un en-tête, mais avec certaines opérations préchargées sur les navigateurs
  • Le cookie peut être défini par le serveur et enregistré automatiquement par le client, et sera automatiquement envoyé pour le même domaine
  • Le cookie peut être marqué comme httpOnlyempêchant ainsi l'accès JavaScript du client
  • Les opérations préchargées peuvent ne pas être disponibles sur des plates-formes autres que les navigateurs (par exemple, mobiles), ce qui peut entraîner des efforts supplémentaires
  • Les "en-têtes personnalisés" ne sont que des en-têtes personnalisés sans opérations préchargées
  • Le client est responsable de recevoir, stocker, sécuriser, soumettre et mettre à jour la section d'en-tête personnalisée pour chaque demande, cela peut aider à empêcher une simple incorporation d'URL malveillantes

RÉSUMER

  • Il n'y a pas de magie, l'état d'authentification doit être stocké quelque part, au niveau du serveur ou du client
  • Vous pouvez implémenter avec état / sans état avec un cookie ou d'autres en-têtes personnalisés
  • Lorsque les gens parlent de ces choses, leur état d'esprit par défaut est principalement: stateless = jeton + en-tête personnalisé, stateful = authentification ID + cookie; ce ne sont PAS les seules options possibles
  • Ils ont des avantages et des inconvénients, mais même pour les jetons cryptés, vous ne devez pas stocker d'informations sensibles

Lien


1
Merci pour cela, extrêmement utile. Répond à la question ainsi qu'à toute la confusion générée par les autres réponses en parlant soudainement d'état.
MDave le

Très très bien. Apporte plus de détails et explique vraiment le comment et le pourquoi d'une meilleure manière.
colinwong

8

Je pense qu'il y a une certaine confusion ici. La différence significative entre l'authentification basée sur les cookies et ce qui est désormais possible avec le stockage Web HTML5 réside dans le fait que les navigateurs sont conçus pour envoyer des données de cookies chaque fois qu'ils demandent des ressources au domaine qui les a définis. Vous ne pouvez pas empêcher cela sans désactiver les cookies. Les navigateurs n'envoient pas de données à partir du stockage Web à moins que le code de la page ne les envoie . Et les pages ne peuvent accéder qu'aux données qu'elles ont stockées, pas aux données stockées par d'autres pages.

Ainsi, un utilisateur inquiet de la manière dont ses données de cookies pourraient être utilisées par Google ou Facebook pourrait désactiver les cookies. Mais, ils ont moins de raisons de désactiver le stockage Web (jusqu'à ce que les annonceurs trouvent un moyen de l'utiliser également).

C'est donc la différence entre les cookies et les jetons, ce dernier utilise le stockage Web.


5

L'authentification basée sur les jetons est sans état, le serveur n'a pas besoin de stocker les informations utilisateur dans la session. Cela donne la possibilité de mettre à l'échelle l'application sans se soucier de l'endroit où l'utilisateur s'est connecté. Il existe une affinité Web Server Framework pour les cookies, alors que ce n'est pas un problème avec les jetons. Ainsi, le même jeton peut être utilisé pour récupérer une ressource sécurisée à partir d'un domaine autre que celui dans lequel nous sommes connectés, ce qui évite une autre authentification uid / pwd.

Très bon article ici:

http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs


3

Utilisez le jeton lorsque ...

La fédération est souhaitée. Par exemple, vous souhaitez utiliser un fournisseur (Token Dispensor) comme émetteur de jetons, puis utiliser votre serveur api comme validateur de jetons. Une application peut s'authentifier auprès de Token Dispensor, recevoir un jeton, puis présenter ce jeton à votre serveur api pour qu'il soit vérifié. (La même chose fonctionne avec Google Sign-In. Ou Paypal. Ou Salesforce.com. Etc.)

L'asynchronie est requise. Par exemple, vous voulez que le client envoie une demande, puis stocke cette demande quelque part, pour être traitée par un système distinct «plus tard». Ce système séparé n'aura pas de connexion synchrone avec le client et il se peut qu'il ne soit pas connecté directement à un dispensaire central de jetons. un JWT peut être lu par le système de traitement asynchrone pour déterminer si l'élément de travail peut et doit être exécuté ultérieurement. C'est en quelque sorte lié à l'idée de Fédération ci-dessus. Attention cependant: JWT expire. Si la file d'attente contenant l'élément de travail n'est pas traitée pendant la durée de vie du JWT, les revendications ne doivent plus être approuvées.

Une demande signée par le client est requise. Ici, la demande est signée par le client en utilisant sa clé privée et le serveur validerait en utilisant la clé publique déjà enregistrée du client.


1

L'une des principales différences est que les cookies sont soumis à la même politique d'origine alors que les jetons ne le sont pas. Cela crée toutes sortes d'effets en aval.

Étant donné que les cookies ne sont envoyés que vers et depuis un hôte particulier, cet hôte doit supporter la charge de l'authentification de l'utilisateur et l'utilisateur doit créer un compte avec des données de sécurité avec cet hôte afin d'être vérifiable.

Les jetons en revanche sont émis et ne sont pas soumis à la même politique d'origine. L'émetteur peut être n'importe qui et c'est à l'hôte de décider à quels émetteurs faire confiance. Un émetteur comme Google et Facebook bénéficie généralement d'une bonne confiance, de sorte qu'un hôte peut transférer la charge de l'authentification de l'utilisateur (y compris le stockage de toutes les données de sécurité de l'utilisateur) à une autre partie et l'utilisateur peut consolider ses données personnelles sous un émetteur spécifique et ne pas avoir à se souvenir d'un tas de mots de passe différents pour chaque hôte avec lequel ils interagissent.

Cela permet des scénarios d'authentification unique qui réduisent la friction globale dans l'expérience utilisateur. En théorie, le Web devient également plus sécurisé à mesure que des fournisseurs d'identité spécialisés émergent pour fournir des services d'authentification au lieu de laisser chaque site Web ma et pa faire tourner leurs propres systèmes d'authentification, probablement à moitié cuits. Et à mesure que ces fournisseurs émergent, le coût de la fourniture de ressources Web sécurisées, même pour des ressources très basiques, tend vers zéro.

Ainsi, en général, les jetons réduisent la friction et les coûts associés à l'authentification et transfèrent le fardeau des différents aspects d'un Web sécurisé vers des parties centralisées mieux à même de mettre en œuvre et de maintenir des systèmes de sécurité.

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.