J'essaie d'implémenter JWT dans mon système d'authentification et j'ai quelques questions. Pour stocker le jeton, je pourrais 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 contre CSRF. Cependant, je ne peux imaginer comment cela fonctionnerait en supposant que j'enregistre le jeton JWT dans le stockage des cookies.
Comment pourrait-il alors se protéger du CSRF?
mise à jour 1
J'ai vu quelques exemples d'utilisation comme suit:
curl -v -X POST -H "Authorization: Basic VE01enNFem9FZG9NRERjVEJjbXRBcWJGdTBFYTpYUU9URExINlBBOHJvUHJfSktrTHhUSTNseGNh"
Comment puis-je implémenter cela lorsque je fais une demande au serveur à partir du 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 alors je pourrais définir un en-tête comme jwt: [token]
puis je pouvais lire le jeton depuis l'en-tête.
mise à jour 2
J'ai installé Advanced REST Client Google Chrome extension and was able to pass the token as a custom header. Est-il possible de définir ces données d'en-tête via Javascript lorsque faire 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 localStorage ou sessionStorage si disponible ou des cookies. Vous devez également utiliser l'en-tête Authorization, mais au lieu du schéma Basic, utilisez celui Bearer:
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 une question de compromis que d'essayer de trouver le meilleur choix définitif. Passons en revue quelques options:
localStorage
ou sessionStorage
)Authorization
avec un schéma Bearer
)example.com
ne peut pas être lu par sub.example.com
)Authorization
)Vous tirez parti du navigateur localStorage
ou sessionStorage
API pour stocker, puis récupérer le jeton lors de l'exécution des demandes.
localStorage.setItem('token', 'asY-x34SfYPk'); // write
console.log(localStorage.getItem('token')); // read
Authorization
le plus appropriéVous n'avez rien à faire côté client car le navigateur s'occupe automatiquement des choses pour vous.
Authorization
avec un schéma Bearer
)Authorization
)Vous tirez parti du navigateur document.cookie
API pour stocker puis récupérer le jeton lors de l'exécution des demandes. Cette API n'est pas aussi fine que le stockage Web (vous obtenez tous les cookies), vous avez donc 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 étrange, mais cela a l'avantage de vous permettre d'avoir du stockage disponible pour un domaine de premier niveau et tous les sous-domaines, ce que le stockage Web ne vous donnera pas. Cependant, sa mise en œuvre est plus complexe.
Ma recommandation pour les scénarios les plus courants serait d'aller avec l'option 1 , principalement parce que:
Notez également que les options basées sur les cookies sont également très différentes, pour l'option 3, les cookies sont utilisés uniquement comme mécanisme de stockage, c'est donc presque comme s'il s'agissait d'un détail d'implémentation côté client. Cependant, l'option 2 signifie une manière plus traditionnelle de gérer l'authentification; pour une lecture plus approfondie de cette chose cookies vs jetons, 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 signifierait que les cookies devraient être créés de manière appropriée pour prendre cela en considération.
Cet article de blog propose une excellente comparaison côte à côte du stockage du navigateur par rapport aux cookies et s'attaque à chaque attaque potentielle dans chaque cas. https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
La réponse la plus courte/spoiler: les cookies et ajouter un jeton xsrf dans le jwt. Explication détaillée dans le billet de blog.