web-dev-qa-db-fra.com

Authentification par jetons et cookies

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

J'essaie d'implémenter le Ember Auth Rails Démo mais je ne comprends pas les raisons pour lesquelles l'authentification par jeton est décrite à la Ember Auth FAQ = sur la question "Pourquoi l'authentification par jeton?"

108
John

Une application Web typique est principalement sans état , en raison de sa demande la nature. Le protocole HTTP est le meilleur exemple de protocole sans état . Mais comme la plupart des applications Web ont besoin de l’état pour pouvoir conserver l’état , entre serveur et client, les cookies sont utilisés de manière à ce que le serveur puisse renvoyer chaque réponse au client. Cela signifie que la prochaine demande émanant du client inclura ce cookie et sera donc reconnue par le serveur. De cette façon, le serveur peut gérer une session avec le client sans état , en sachant principalement tout ce qui concerne l'état de l'application , mais stocké sur le serveur. Dans ce scénario, le client ne détient à aucun moment l'état , ce qui n'est pas comment Ember.js .

Dans Ember.js, les choses sont différentes. Ember.js facilite le travail du programmeur, car il contient bien l’état pour vous, dans le client, sachant à tout moment qu’il en est ainsi state sans avoir à demander au serveur de demander des données d'état .

Cependant, le fait de conserver l'état dans le client peut également parfois entraîner des problèmes de simultanéité qui ne sont tout simplement pas présents dans sans état situations. Cependant, Ember.js traite également de ces problèmes pour vous, en particulier les données sur les braises sont conçues 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 typique sans état où la session , l’état et les cookies correspondants sont gérés presque complètement par le serveur. Ember.js conserve son état complètement en javascript (dans la mémoire du client, et non dans le DOM, contrairement à certains autres frameworks) et n'a pas besoin du serveur pour gérer la session. Ainsi, Ember.js est plus polyvalent dans de nombreuses situations, par exemple. lorsque votre application est en mode hors connexion.

É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é , le serveur peut ainsi rechercher le jeton d'envoi (initialement émis par serveur) et vérifiez si elle est valide avant de renvoyer une réponse au client.

À mon avis, la raison principale pour laquelle un jeton d'authentification est utilisé à la place des cookies, comme indiqué dans Ember Auth FAQ , est principalement due à la nature du cadre Ember.js et également parce qu'il correspond mieux à la paradigme de l'application Web avec état . Par conséquent, le mécanisme des 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.

28
intuitivepixel

Http est apatride. Pour vous autoriser, vous devez "signer" chaque requête 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 la définition d'en-têtes http spécifiques. Toutefois, ils peuvent être envoyés dans n'importe quelle partie de la demande http (corps du POST, etc.).

  • Avantages:

    • Vous pouvez autoriser uniquement les demandes que vous souhaitez autoriser. (Cookies - même le cookie d'autorisation est envoyé pour chaque requête.)
    • Immunisé contre XSRF (Petit exemple de XSRF - Je vous enverrai un lien dans un courrier électronique qui ressemblera à <img src="http://bank.com?withdraw=1000&to=myself" />, Et si vous êtes connecté via une authentification par cookie sur bank.com, et bank.com ne le fait pas. N'ayant aucun moyen de protection XSRF, je retirerai de l'argent de votre compte simplement parce que votre navigateur déclenchera une demande GET autorisée à cette URL.) Notez qu'il existe des mesures anti-falsification que vous pouvez utiliser avec l'authentification par cookie - mais vous devez les mettre en œuvre.
    • 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, alors que vous pouvez envoyer des jetons vers le domaine de votre choix. Ceci est particulièrement utile pour les applications à page unique qui utilisent plusieurs services nécessitant une autorisation. Par conséquent, je peux 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 "hors de la boîte". 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 supprimé après la fermeture de la fenêtre du navigateur, con: ouvrir un lien dans un nouvel onglet rendra cet onglet anonymes) et des 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 à l'abri de 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 unique. 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 faire une attaque XSS contre l’authentification par jeton (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 par cookie n’est pas une solution miracle non plus. http-only ne peut pas être lu par le client, celui-ci peut toujours faire des demandes en votre nom qui incluent automatiquement le cookie d'autorisation.)
    • Les demandes de téléchargement d'un fichier, censé fonctionner uniquement pour les utilisateurs autorisés, nécessitent l'utilisation de l'API de fichier. La même demande fonctionne immédiatement pour l'authentification basée sur les cookies.

authentification par cookie

  • Une demande au serveur est toujours connectée par un cookie d'autorisation.
  • Avantages:
    • Les cookies peuvent être marqués comme "http uniquement", ce qui les rend impossible à 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. (Ainsi, 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 requêtes entre sites.
    • Sont envoyées pour chaque requête unique (même pour les requêtes ne nécessitant pas d'authentification).

Globalement, je dirais que les jetons vous offrent une meilleure flexibilité (puisque vous n'êtes pas lié au domaine unique). L'inconvénient est que vous devez coder vous-même.

256
Ondrej Svejdar
  • 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 fonctionne pas sur plusieurs domaines, utilisez un cookie de marqueur

  • Les demandes de contrôle en amont seront envoyées pour chaque demande de la SCRO

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

  • Il est plus facile de traiter avec XSS que XSRF

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

  • Si vous stockez des informations confidentielles, chiffrez 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 des autorisations.

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/

31
user3490126

Je crois qu'il y a une certaine confusion ici. La différence significative entre l'authentification basée sur les cookies et ce qui est maintenant possible avec HTML5 Web Storage est 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éfinies. Vous ne pouvez pas empêcher cela sans désactiver les cookies. Les navigateurs n'envoient pas de données à partir de Web Storage sauf si le code de la page 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).

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

8
martinp999

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 redimensionner une application sans se soucier du lieu de connexion de l'utilisateur. Il existe une affinité Web Server Framework pour les cookies, bien que ce ne soit pas un problème lié aux 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 sur 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-lar-all-angularjs

4
Afz

Utiliser un jeton quand ...

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

L'asynchronisme est requis. Par exemple, vous voulez que le client envoie une demande, puis stocke cette demande quelque part, afin que ce dernier soit traité "ultérieurement" par un système distinct. Ce système distinct n’aura pas de connexion synchrone avec le client et n’aura peut-être pas de connexion directe avec un dispensaire de jetons central. un système de traitement asynchrone peut lire un fichier JWT pour déterminer si l'élément de travail peut et doit être rempli ultérieurement. Ceci est en quelque sorte lié à l’idée de la 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 fichier JWT, les revendications ne doivent plus être approuvées.

Cient La demande signée 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
Bharat Vasant

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

Étant donné que les cookies sont uniquement envoyés vers et à partir d'un hôte particulier, cet hôte doit supporter l'authentification de l'utilisateur et ce dernier doit créer un compte avec des données de sécurité avec cet hôte pour pouvoir être vérifié.

Les jetons d’autre part sont émis et ne sont pas soumis à la même politique d’origine. L'émetteur peut être littéralement n'importe qui et c'est à l'hôte de décider à quels émetteurs faire confiance. Un émetteur tel que Google et Facebook jouit généralement d'une bonne confiance. Un hôte peut donc confier la tâche de l'authentification de l'utilisateur (y compris le stockage de toutes les données de sécurité de l'utilisateur) à un tiers. L'utilisateur peut ainsi consolider ses données personnelles sous un émetteur spécifique sans avoir à se souvenir d'un utilisateur. tas de mots de passe différents pour chaque hôte avec lequel ils interagissent.

Cela permet des scénarios de signature unique qui réduisent le frottement global dans l'expérience utilisateur. En théorie, le Web devient également plus sécurisé au fur et à mesure que les fournisseurs d’identité spécialisés proposent des services d’authentification au lieu de laisser chaque site Web ma et pa créer ses propres systèmes d’authentification, probablement à moitié cuits. Et au fur et à mesure que ces fournisseurs émettent le coût de la mise à disposition de ressources Web sécurisées pour des tendances même très élémentaires en matière de ressources, des tendances à zéro.

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

1
rism