Dans le contexte des JWT , Stormpath a écrit un article assez utile décrivant les moyens possibles de les stocker et les (dés) avantages liés à chaque méthode.
Il a également un bref aperçu des attaques XSS et CSRF, et comment vous pouvez les combattre.
J'ai joint quelques courts extraits de l'article ci-dessous, au cas où leur article serait mis hors ligne / leur site tomberait en panne.
Stockage local
Problèmes:
Le stockage Web (localStorage / sessionStorage) est accessible via JavaScript sur le même domaine. Cela signifie que tout JavaScript exécuté sur votre site aura accès au stockage Web et, de ce fait, peut être vulnérable aux attaques de script intersite (XSS). XSS en bref est un type de vulnérabilité où un attaquant peut injecter du JavaScript qui s'exécutera sur votre page. Les attaques XSS de base tentent d'injecter JavaScript via des entrées de formulaire, où l'attaquant met en alerte («Vous êtes piraté»); dans un formulaire pour voir s'il est exécuté par le navigateur et peut être consulté par d'autres utilisateurs.
La prévention:
Pour empêcher XSS, la réponse courante consiste à échapper et à coder toutes les données non fiables. Mais c'est loin d'être l'histoire complète. En 2015, les applications Web modernes utilisent JavaScript hébergé sur des CDN ou une infrastructure extérieure. Les applications Web modernes incluent des bibliothèques JavaScript tierces pour les tests A / B, l'entonnoir / l'analyse du marché et les annonces. Nous utilisons des gestionnaires de packages comme Bower pour importer le code d'autres personnes dans nos applications.
Que faire si un seul des scripts que vous utilisez est compromis? Un code JavaScript malveillant peut être intégré à la page et le stockage Web est compromis. Ces types d'attaques XSS peuvent obtenir le stockage Web de tout le monde qui visite votre site, à leur insu. C'est probablement pourquoi un tas d'organisations conseillent de ne pas stocker quoi que ce soit de valeur ou de faire confiance à aucune information dans le stockage Web. Cela inclut les identifiants de session et les jetons.
En tant que mécanisme de stockage, Web Storage n'applique aucune norme sécurisée lors du transfert. Quiconque lit Web Storage et l'utilise doit faire preuve de diligence raisonnable pour s'assurer qu'il envoie toujours le JWT via HTTPS et jamais HTTP.
Biscuits
Problèmes:
Les cookies, lorsqu'ils sont utilisés avec l'indicateur de cookie HttpOnly, ne sont pas accessibles via JavaScript et sont immunisés contre XSS. Vous pouvez également définir l'indicateur de cookie sécurisé pour garantir que le cookie est uniquement envoyé via HTTPS. C'est l'une des principales raisons pour lesquelles les cookies ont été exploités dans le passé pour stocker des jetons ou des données de session. Les développeurs modernes hésitent à utiliser des cookies car ils exigeaient traditionnellement que l'état soit stocké sur le serveur, ce qui enfreint les meilleures pratiques RESTful. Les cookies en tant que mécanisme de stockage n'exigent pas que l'état soit stocké sur le serveur si vous stockez un JWT dans le cookie. En effet, le JWT encapsule tout ce dont le serveur a besoin pour répondre à la demande.
Cependant, les cookies sont vulnérables à un autre type d'attaque: la contrefaçon de demande intersite (CSRF). Une attaque CSRF est un type d'attaque qui se produit lorsqu'un site Web, un e-mail ou un blog malveillant oblige le navigateur Web d'un utilisateur à effectuer une action indésirable sur un site de confiance sur lequel l'utilisateur est actuellement authentifié. Il s'agit d'un exploit de la façon dont le navigateur gère les cookies. Un cookie ne peut être envoyé qu'aux domaines dans lesquels il est autorisé. Par défaut, il s'agit du domaine qui a initialement défini le cookie. Le cookie sera envoyé pour une demande, que vous soyez sur galaxies.com ou hahagonnahackyou.com.
La prévention:
Les navigateurs modernes prennent en charge le SameSite
drapeau , en plus de HttpOnly
et Secure
. Le but de cet indicateur est d'empêcher la transmission du cookie dans les requêtes intersites, empêchant de nombreux types d'attaques CSRF.
Pour les navigateurs qui ne prennent pas en charge SameSite
, CSRF peut être empêché en utilisant des modèles de jetons synchronisés. Cela semble compliqué, mais tous les cadres Web modernes prennent en charge cela.
Par exemple, AngularJS a une solution pour valider que le cookie n'est accessible que par votre domaine. Directement à partir des documents AngularJS:
Lors de l'exécution de requêtes XHR, le service $ http lit un jeton à partir d'un cookie (par défaut, XSRF-TOKEN) et le définit comme un en-tête HTTP (X-XSRF-TOKEN). Étant donné que seul JavaScript qui s'exécute sur votre domaine peut lire le cookie, votre serveur peut être assuré que le XHR provient de JavaScript exécuté sur votre domaine. Vous pouvez rendre cette protection CSRF apatride en incluant une xsrfToken
revendication JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Tirer parti de la protection CSRF de votre infrastructure d'application Web rend les cookies solides pour le stockage d'un JWT. CSRF peut également être partiellement empêché en vérifiant l'en-tête HTTP Referer et Origin de votre API. Les attaques CSRF auront des en-têtes Referer et Origin sans rapport avec votre application.
L'article complet peut être trouvé ici:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
Ils ont également un article utile sur la meilleure façon de concevoir et de mettre en œuvre des JWT, en ce qui concerne la structure du jeton lui-même:
https://stormpath.com/blog/jwt-the-right-way/