web-dev-qa-db-fra.com

Stocker le jeton d'authentification dans un cookie ou un en-tête?

Je comprends qu'un en-tête est la solution la plus "propre" pour transporter un jeton d'authentification d'un système approuvé à un autre dans un appel REST. Mais lorsque vous êtes en code JavaScript côté client, le le monde me semble différent.

Les cookies peuvent être marqués comme "uniquement http" et ne peuvent donc pas être facilement volés par JavaScript. Un en-tête doit même être défini par JavaScript, donc le jeton d'authentification doit être accessible à partir de JavaScript. Mais pourtant, les gens utilisent des en-têtes d'authentification pour soumettre leurs jetons d'authentification à partir d'un JavaScript client non fiable au serveur.

Qu'est-ce qui a changé du bon vieux "utiliser des cookies avec http uniquement et un indicateur sécurisé" pour "laisser le JavaScript gérer le jeton d'authentification"? Ou la bonne façon devrait-elle être que "du côté client, utilisez des cookies et dès que vous entrez dans le monde de confiance, passez à l'auth-header"?

PS: Je sais qu'il existe de nombreuses réponses à des questions similaires, mais je pense que mes questions sont d'un point de vue différent "ce qui a changé, est différent".

21
rdmueller

Authentification basée sur les cookies

Avantages

  1. Indicateur HttpOnly : Les cookies de session peuvent être créés avec l'indicateur HttpOnly qui sécurise les cookies de JavaScript malveillant (XSS-Cross-Site Scripting).

  2. Drapeau sécurisé : Les cookies de session peuvent être créés avec Drapeau sécurisé qui empêche la transmission de cookies sur un canal non crypté.

Contre

  1. [~ # ~] csrf [~ # ~] : les cookies sont vulnérables/sensibles aux attaques CSRF car les cookies tiers sont envoyés par défaut au troisième -partie qui provoque l'exploitation de la vulnérabilité CSRF.

  2. Performances et évolutivité : l'authentification basée sur les cookies est une authentification avec état telle que le serveur doit stocker les cookies dans un fichier/DB afin de maintenir l'état de tous les utilisateurs. À mesure que la base d'utilisateurs augmente, le serveur principal doit maintenir un système distinct afin de stocker les cookies de session.

Authentification basée sur les jetons:

Avantages

  1. Performances et évolutivité : les jetons contiennent les métadonnées et leur valeur signée (pour la protection contre les falsifications). Ils sont autonomes et il n'est donc pas nécessaire de maintenir l'état sur le serveur. Cela améliore les performances et donc l'évolutivité lorsque l'extension est requise.

  2. [~ # ~] csrf [~ # ~] : contrairement à l'authentification basée sur les cookies, l'authentification basée sur les jetons n'est pas sensible à la falsification de requêtes intersites car les jetons ne sont pas envoyés par défaut aux applications Web tierces.

Contre

  1. [~ # ~] xss [~ # ~] : Étant donné que les jetons de session sont stockés dans le stockage de données local du navigateur et qu'il est accessible au JS du même domaine. Par conséquent, il n'y a pas d'option pour sécuriser l'identifiant de session contre les attaques XSS contrairement au drapeau de sécurité HTTPOnly qui est disponible dans l'authentification basée sur les cookies.

Conclusion

Les deux mécanismes ont leurs propres avantages et inconvénients, comme mentionné. Dans l'ère actuelle de Cadres de développement d'applications , contre tels que XSS et CSRF sont pris en charge par le cadre sous-jacent lui-même et je pense donc que c'est sans aucun doute un compromis clair sur lequel les développeurs et les parties prenantes prennent la décision.

17
Shiv Sahni

La réponse acceptée est de confondre l'authentification basée sur la session - où une session est maintenue dans la base de données principale et est avec état avec les cookies, qui sont un mécanisme de transport et donc les avantages et les inconvénients sont défectueux.

Quant à savoir si un jeton d'authentification doit être stocké dans un cookie ou un en-tête, cela dépend du client. Si le client est un autre REST api, alors le passer via l'en-tête est logique.

Si le client est un navigateur, vous pouvez stocker le jeton dans le stockage local/session, puis envoyer le jeton via l'en-tête (comme le dit la réponse acceptée), mais comme vous l'avez mentionné - cela a des vulnérabilités et n'est pas recommandé (voir plus à ce sujet ici: https://auth0.com/docs/security/store-tokens ).

Si le client est un SPA, vous pouvez simplement stocker les jetons en mémoire - ce qui est probablement l'option la plus sûre, mais vous devrez alors récupérer de nouveaux jetons entre les pages.

Si vous avez besoin de persistance entre les pages, "à l'ancienne" peut toujours être la meilleure option - à condition que vos cookies soient uniquement http, sécurisés et que vous ayez mis en place une protection csrf (bien que cela ne soit bientôt plus nécessaire en raison du même site) propriété). Si vous implémentez la protection csrf, vous bénéficierez de tous les avantages de l'authentification basée sur les jetons sans cookie et d'une protection supplémentaire contre XSS.

9
Melbourne2991