J'essaie d'implémenter JWT dans mon système d'authentification et j'ai quelques questions. Pour stocker le jeton, je peux utiliser des cookies, mais il est également possible d'utiliser localStorage
ou sessionStorage
.
Quel serait le meilleur choix?
J'ai lu que JWT protège le site de CSRF. Cependant, je ne peux pas imaginer comment cela fonctionnerait en supposant que je sauvegarde le jeton JWT dans le stockage des cookies.
Comment le protégerait-il de CSRF?
Mise à jour 1
J'ai vu quelques exemples d'utilisation comme suit:
curl -v -X POST -H "Authorization: Basic VE01enNFem9FZG9NRERjVEJjbXRBcWJGdTBFYTpYUU9URExINlBBOHJvUHJfSktrTHhUSTNseGNh"
Comment puis-je l'implémenter lorsque je lance une requête sur le serveur depuis le navigateur? J'ai également vu que certains implémentent le jeton dans l'URL:
http://exmple.com?jwt=token
Si je faisais une demande via AJAX, je pourrais définir un en-tête comme jwt: [token]
et puis je pourrais lire le jeton de l'en-tête.
Mise à jour 2
J'ai installé l'extension Google Chrome Advanced REST Client et j'ai pu passer le jeton comme en-tête personnalisé. Est-il possible de définir ces données d'en-tête via Javascript lorsque vous faites une requête GET au serveur?
Regardez ce site web: https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
Si vous souhaitez les stocker, vous devez utiliser le stockage localStorage ou la session si disponible ou les cookies. Vous devriez également utiliser l'en-tête de l'autorisation, mais au lieu du schéma de base, utilisez le support:
curl -v -X POST -H "Authorization: Bearer YOUR_JWT_HERE"
Avec JS, vous pouvez utiliser le code suivant:
<script type='text/javascript'> // define vars var url = 'https://...'; // ajax call $.ajax({ url: url, dataType : 'jsonp', beforeSend : function(xhr) { // set header if JWT is set if ($window.sessionStorage.token) { xhr.setRequestHeader("Authorization", "Bearer " + $window.sessionStorage.token); } }, error : function() { // error handler }, success: function(data) { // success handler } }); </script>
Choisir le stockage est plus sur les compromis que d'essayer de trouver un meilleur choix définitif. Passons par quelques options:
localStorage
ou sessionStorage
) Authorization
avec un système de Bearer
) example.com
ne peut pas être lue par sub.example.com
) Authorization
) Vous exploitez le navigateur localStorage
ou sessionStorage
API pour stocker, puis récupérez le jeton lors de l'exécution des requêtes.
localStorage.setItem('token', 'asY-x34SfYPk'); // write console.log(localStorage.getItem('token')); // read
Authorization
plus approprié Vous n'avez besoin de rien faire du côté du client car le navigateur prend automatiquement soin de vos affaires.
Authorization
avec un système de Bearer
) Authorization
) Vous exploitez l'API document.cookie
du navigateur pour stocker, puis récupérer le jeton lors de l'exécution des requêtes. Cette API n'est pas aussi fine que le stockage Web (vous obtenez tous les cookies) afin que vous ayez besoin d'un travail supplémentaire pour analyser les informations dont vous avez besoin.
document.cookie = "token=asY-x34SfYPk"; // write console.log(document.cookie); // read
Cela peut sembler une option bizarre, mais il a le bénéfice agréable que vous pouvez avoir le stockage à la disposition d'un domaine de premier niveau et de tous les sous-domaines, ce qui est quelque chose que le stockage Web ne vous donnera pas. Cependant, il est plus complexe à mettre en œuvre.
Ma recommandation pour les scénarios les plus communs serait d'aller avec l'option 1 , surtout parce que:
Notez également que les options basées sur les cookies sont également très différentes, car les cookies de l'option 3 sont utilisés uniquement comme un mécanisme de stockage, de sorte que ce soit presque comme un détail de mise en œuvre du client. Cependant, l'option 2 signifie une manière plus traditionnelle de traiter l'authentification; Pour une lecture supplémentaire sur ces cookies vs token, vous pouvez trouver cet article intéressant: Cookies vs Tokens: The Definitive Guide .
Enfin, aucune des options ne le mentionne, mais l'utilisation de HTTPS est obligatoire, bien sûr, ce qui signifie que des cookies devraient être créés de manière appropriée pour tenir compte de cela.
Ce blog affiche une excellente comparaison côte-à-côte du stockage du navigateur par rapport aux cookies et aborde chaque attaque potentielle dans chaque cas. https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
La réponse / spoiler plus courte: cookies et ajoutez un jeton xsrf dans le jwt. Une explication détaillée dans la publication du blog.