web-dev-qa-db-fra.com

Cette méthode d'authentification hybride (cookie, JWT) pour les applications Web connues et pratiques?

J'ai travaillé avec des applications Web pendant un moment, il y a quelques mois, j'ai trouvé une approche possible pour obtenir les avantages de la sécurité des navigateurs lors de l'utilisation de cookies pour authentifier les demandes, avec les avantages apatrides de JSON-Web-Jetons (JWT).

Je cherche à connaître si cette approche est connue et peut-être rompu.

Détails:

Il est connu que l'authentification basée sur les cookies peut être sécurisée contre XSS mais introduit la complexité du CSRF, également, JWT est pratique à moins que vous n'ayez besoin d'invalider les jetons (XSS est également un problème).

L'approche:

  • Lorsque vous vous connectez, l'utilisateur reçoit un JWT qui présente une période de validité très courte (comme 3 minutes).
  • Une fois connecté, l'utilisateur reçoit également un cookie qui permet de renouveler le JWT.
  • L'utilisateur continue d'appeler le serveur de fixation du JWT (le cookie est connecté par le navigateur), le serveur authentifie les demandes à l'aide de ce jeton.
  • Lorsque le serveur obtient un jeton expiré, il charge la session du cookie et renvoie une nouvelle JWT (ou la demande est rejetée et l'utilisateur renouvelle le jeton avec une autre demande), puis la demande d'origine est récupérée avec un jeton valide.

Quelques avantages:

  • Invalidation des jetons, si le JWT est déjà compromis, il vit une très courte période.
  • Protection CSRF, sur une attaque CSRF réussie, le navigateur obtient un nouveau jeton vécu court sans effectuer aucune opération sensible sur le serveur. - Il pourrait y avoir beaucoup de demandes authentifiées apatrides efficaces.
4
AlexITC

Rafraîchir les jetons

Ceci est assez similaire au motif de jeton de rafraîchissement. En cela, vous avez deux JWTS - une courte durée pour les demandes ordinaires et une longue habitude de renouveler la courte durée. La courte durée ne peut pas être révoquée, mais la vie longue dure. Il s'agit d'un modèle couramment utilisé, ce qui donne un bon compromis entre la révocation et la performance.

Votre approche est différente en ce que le jeton de longue durée a été changé pour un cookie. Pensons à certains des avantages et des inconvénients de cela.

CSRF

Si vous vérifiez que le jeton expiré est valide avant d'en publier un nouveau sur le cookie, il devrait vous protéger techniquement du CSRF. Un attaquant CSRF ne pouvait pas créer de jeton et, partant, ne pas faire une attaque réussie.

Néanmoins, je me sens un peu inquiet à ce sujet. Premièrement, vous devez faire un chèque spécial JWT qui accepte les jetons expirés. C'est un peu désordonné avec une place pour des erreurs de mise en œuvre. Deuxièmement, les jetons expirés deviennent soudainement des données sensibles. Cela ne se sent pas aussi bon.

XSS

Vous pouvez marquer le cookie comme http uniquement, ce qui limite quelque peu la puissance d'une attaque XSS. Cela semble être ce qui motive votre système?

Je dirais que cela ne vaut pas beaucoup, cependant. L'attaquant pourrait faire beaucoup avec le jeton pendant quelques minutes. Si nécessaire de plus de temps, lancez simplement des JS sur le client sur les jetons actuellement rafraîchissant, en envoyant de nouveaux à l'attaquant. Ou il suffit de courir toutes les demandes que vous souhaitez exécuter du client.

Fondamentalement, si vous avez une vulnérabilité XSS, c'est le jeu. Vous ne pouvez pas vraiment limiter l'impact de cela avec un schéma comme celui-ci. Vous pouvez arrêter un script kiddie, mais pas plus que cela.

Conclusion

Je ne trouve pas de faute exploitable avec votre schéma, alors je ne l'étiqueterais pas "non sécurisé". Mais je ne peux pas vraiment voir un grand avantage non plus. Mais peut-être que je manque quelque chose.

Ce que vous créez, cependant, c'est plus de complexité. Vous créez de nouveaux modèles, de nouvelles choses à mettre en œuvre et vous mélangez différentes solutions (cookies, jetons) ensemble. Ce n'est pas très propre, car un manque de meilleur mot.

Donc, pour cette raison, j'irais avec quelque chose de plus standard à la place, comme les jetons d'actualisation.

4
Anders

Pour jetons JWT, il y a un jeton access et un jeton refresh.

Traditionnellement, vous stockez les deux jetons dans des cookies ou les deux en stockage local. Le choix dépend du vecteur d'attaque que vous souhaitez défendre contre (CSRF vs. XSS).

Ce que vous proposez consiste à stocker le jeton refresh comme cookie, mais le jeton access dans le stockage local - à certains égards, cela atténue l'attaque, mais je sens que vous êtes maintenant susceptible de la CSRF et XSS, comme l'une ou l'autre attaque vous obtiendrait un jeton.

Mon opinion personnelle à ce sujet, est de stocker les deux jetons sur des cookies. En utilisant HttpOnly et Same-Site Les directives rendent les cookies assez difficiles à craquer, en particulier pour le jeton de rafraîchissement où vous pouvez aller tout d'entre eux avec un strict Same-Site directive et limitez-la à un chemin très spécifique de votre API.

En ce qui concerne le jeton d'accès, cela dépend des risques/caractéristiques de la directive au même site.

Encore une fois, ma vue personnelle, mais en utilisant une approche de cookie uniquement, vous permet d'oublier des XSS (au moins juste pour les jetons) et de vous concentrer sur le CSRF. Mélanger des biscuits et des jetons vous obligerait à garder les deux.

0
keithRozario