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:
Quelques avantages:
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.
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.
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.
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.
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.