Découvrez comment et où stocker les jetons utilisés dans l’authentification par jeton.
Aperçu
Concepts clés
La façon dont vous choisissez de stocker votre jeton est essentielle pour protéger votre application contre les attaques malveillantes.
Examinez les scénarios pour chaque type d’application.
Déterminez quelle méthode convient le mieux à votre technologie.
La sécurisation des SPA qui effectuent des appels d’API s’accompagne de ses propres enjeux. Vous devrez vous assurer que les jetons et les autres données sensibles ne sont pas vulnérables aux scripts intersites (XSS) et ne peuvent pas être lus par un JavaScript malveillant.Pour en savoir plus, consultez le JWT Handbook et The Ultimate Guide to Next.js Authentication with Auth0.
Lorsque vous créez une application Next.js, l’authentification peut être nécessaire dans les cas suivants :
Lors de l’accès à une page
Lors de l’accès à une route d’API
Lorsque votre application appelle, au nom de l’utilisateur, une API hébergée à l’extérieur de votre application Next.js
Lorsqu’un serveur est disponible, votre application peut gérer l’interaction avec Auth0 et créer une session, mais dans ce modèle, nous n’avons pas de backend. Tout se passe côté frontend :
L’utilisateur est redirigé vers Auth0.
Une fois la connexion réussie, il est redirigé vers l’application.
Le côté client effectue l’échange de code avec Auth0 et récupère les id_token et access_token de l’utilisateur, qui sont stockés en mémoire.
Application web traditionnelle
Application native/mobile
Application monopage
Si votre application utilise un scénario de connexion qui ne nécessite pas d’appels d’API, seul un jeton d’identité est requis. Il n’est pas nécessaire de le stocker. Vous pouvez le valider et en extraire les données dont vous avez besoin.Si votre application doit appeler des API au nom de l’utilisateur, des jetons d’accès et, facultativement, des jetons d’actualisation sont requis. Ils peuvent être stockés côté serveur ou dans un cookie de session. Le cookie doit être chiffré et sa taille maximale est de 4 KB. Si les données à stocker sont volumineuses, stocker les jetons dans le cookie de session n’est pas une option viable.Utilisez les types de flux suivants dans ces scénarios :
Stockez les jetons dans un espace de stockage sécurisé fourni par le système d’exploitation et limitez l’accès à cet espace. Par exemple, utilisez KeyStore pour Android et KeyChain pour iOS.Utilisez les types de flux suivants dans ces scénarios :
Nous vous recommandons d’utiliser le SDK SPA d’Auth0 pour gérer le stockage des jetons, la gestion des sessions et d’autres détails pour vous.Lorsque l’application monopage appelle uniquement une API fournie à partir d’un domaine pouvant partager des cookies avec le domaine de l’application, aucun jeton n’est nécessaire. OAuth ajoute des vecteurs d’attaque supplémentaires sans apporter de valeur ajoutée et devrait être évité au profit d’une approche traditionnelle fondée sur les cookies.Lorsque l’application monopage appelle plusieurs API situées sur un domaine différent, des jetons d’accès et, facultativement, des jetons d’actualisation sont nécessaires.
Si le backend de l’application monopage peut gérer les appels d’API, son fonctionnement est alors semblable à celui d’une application web traditionnelle qui gère les jetons côté serveur à l’aide de :
Si le backend de l’application monopage ne peut pas gérer les appels d’API, son fonctionnement est alors semblable à celui d’une application mobile qui stocke les jetons dans le backend de l’application monopage, mais l’application doit récupérer les jetons du backend pour envoyer des requêtes à l’API. Un protocole doit être établi entre le backend et l’application monopage pour permettre le transfert sécurisé du jeton du backend vers l’application.
Si vous avez une application monopage sans serveur backend correspondant, votre application devrait demander de nouveaux jetons à la connexion et les stocker en mémoire, sans aucune persistance. Pour effectuer des appels d’API, votre application utiliserait alors la copie du jeton conservée en mémoire.
Conformément aux spécifications OAuth2, lorsqu’un navigateur demande un jeton d’actualisation au point de terminaison /token, Auth0 ne renverra un jeton d’actualisation que si la rotation des jetons d’actualisation est activée pour ce client.
Scénarios de stockage en mémoire dans le navigateur
Auth0 recommande de stocker les jetons dans la mémoire du navigateur, car c’est l’option la plus sécuritaire. L’utilisation de Web Workers pour gérer la transmission et le stockage des jetons est la meilleure façon de les protéger, puisque les Web Workers s’exécutent dans un contexte global distinct de celui du reste de l’application. Utilisez le SDK SPA d’Auth0, dont l’option de stockage par défaut est le stockage en mémoire au moyen de Web Workers.Si vous ne pouvez pas utiliser les Web Workers, Auth0 recommande comme solution de rechange d’utiliser des closures JavaScript pour simuler des méthodes privées.Utilisez le SDK SPA d’Auth0, dont l’option de stockage par défaut est le stockage en mémoire, afin de tirer parti à la fois des Web Workers et des closures JavaScript selon le type de jeton.
La méthode de stockage en mémoire dans le navigateur n’offre pas de persistance entre les actualisations de la page ni d’un onglet du navigateur à l’autre.
L’utilisation du stockage local dans le navigateur peut constituer une solution de rechange viable aux mécanismes qui exigent de récupérer le à partir d’un iframe, ainsi qu’à l’authentification fondée sur des témoins entre domaines, lorsque ces options sont impossibles en raison des restrictions du navigateur (par exemple, ITP2).
Le stockage de jetons dans le stockage local du navigateur assure leur persistance lors de l’actualisation des pages et d’un onglet à l’autre. Cependant, si un attaquant parvient à exécuter du JavaScript dans la SPA au moyen d’une attaque de type script intersite (XSS), il peut récupérer les jetons stockés localement. Une vulnérabilité menant à une attaque XSS réussie peut se trouver soit dans le code source de la SPA, soit dans tout code JavaScript tiers (comme Bootstrap, jQuery ou Google Analytics) inclus dans la SPA.
Pour réduire les risques de sécurité si votre SPA utilise des flux implicites (nous recommandons plutôt d’utiliser le flux de code d’autorisation avec PKCE) ou hybrides, vous pouvez réduire la durée de validité absolue du jeton. Cela réduit l’impact d’une attaque XSS réfléchie (mais pas d’une attaque persistante). Pour réduire cette durée, allez à Dashboard > APIs > Settings > Token Expiration For Browser Flows (Seconds).Réduisez au strict minimum la quantité de code JavaScript tiers inclus à partir d’une source externe à votre domaine (comme des liens vers jQuery, Bootstrap, Google Analytics, etc.). Réduire le code JS tiers diminue le risque de vulnérabilité XSS. Il est également plus sécuritaire d’effectuer une vérification de Subresource Integrity (SRI) sur les scripts tiers (lorsque possible) afin de vérifier que les ressources récupérées sont livrées sans modification inattendue.