J'essaie d'implémenter l'authentification sans état avec JWT pour mes API RESTful.
AFAIK, JWT est essentiellement une chaîne chiffrée transmise en tant qu'en-têtes HTTP lors d'un appel REST.
Mais que se passe-t-il s'il y a un espion qui voit la demande et vole le jeton ? Ensuite, il pourra faire une fausse demande avec mon identité?
En fait, cette préoccupation s'applique à toutes les authentifications basées sur des jetons .
Comment éviter ça? Un canal sécurisé comme HTTPS?
authentication
access-token
jwt
smwikipedia
la source
la source
trade-off
entrehaving finer control of token expiration
ethaving better scalability
.Réponses:
Je suis l'auteur d'une bibliothèque de nœuds qui gère l'authentification dans une certaine profondeur, express-stormpath , donc je vais apporter des informations ici.
Tout d'abord, les JWT ne sont généralement PAS cryptés. Bien qu'il existe un moyen de chiffrer les JWT (voir: JWE ), ce n'est pas très courant dans la pratique pour de nombreuses raisons.
Ensuite, toute forme d'authentification (utilisant ou non des JWT) est soumise à des attaques MitM (man-in-the-middle). Ces attaques se produisent lorsqu'un attaquant peut CONSULTER le trafic DE VOTRE RÉSEAU lorsque vous effectuez des requêtes sur Internet. C'est ce que peut voir votre FAI, la NSA, etc.
C'est ce que SSL aide à éviter: en chiffrant le trafic RÉSEAU de votre ordinateur -> un serveur lors de l'authentification, un tiers qui surveille votre trafic réseau NE peut PAS voir vos jetons, mots de passe ou quoi que ce soit à moins qu'ils ne soient en mesure de le faire pour obtenir une copie de la clé SSL privée du serveur (peu probable). C'est la raison pour laquelle SSL est OBLIGATOIRE pour toutes les formes d'authentification.
Disons cependant que quelqu'un est en mesure d'exploiter votre SSL et est en mesure d'afficher votre jeton: la réponse à votre question est que OUI , l'attaquant sera en mesure d'utiliser ce jeton pour usurper votre identité et faire des demandes à votre serveur.
Maintenant, c'est là qu'interviennent les protocoles.
Les JWT ne sont qu'un standard pour un jeton d'authentification. Ils peuvent être utilisés pour à peu près n'importe quoi. La raison pour laquelle les JWT sont plutôt cool est que vous pouvez y incorporer des informations supplémentaires, et vous pouvez valider que personne ne les a gâchées (signature).
TOUTEFOIS, les JWT eux-mêmes n'ont rien à voir avec la «sécurité». À toutes fins utiles, les JWT sont plus ou moins la même chose que les clés API: juste des chaînes aléatoires que vous utilisez pour vous authentifier auprès d'un serveur quelque part.
Ce qui rend votre question plus intéressante, c'est le protocole utilisé (très probablement OAuth2).
La façon dont OAuth2 fonctionne est qu'il a été conçu pour donner aux clients des jetons TEMPORAIRES (comme les JWT!) Pour l'authentification pour une COURTE PÉRIODE DE TEMPS SEULEMENT!
L'idée est que si votre jeton est volé, l'attaquant ne peut l'utiliser que pendant une courte période.
Avec OAuth2, vous devez vous réauthentifier de temps en temps avec le serveur en fournissant votre nom d'utilisateur / mot de passe OU les informations d'identification de l'API, puis en récupérant un jeton en échange.
Parce que ce processus se produit de temps en temps, vos jetons changent fréquemment, ce qui rend plus difficile pour les attaquants de vous imiter constamment sans avoir de gros ennuis.
J'espère que cela aide ^^
la source
Je sais que c'est une vieille question mais je pense que je peux laisser tomber mes 0,50 $ ici, probablement quelqu'un peut améliorer ou fournir un argument pour décliner totalement mon approche. J'utilise des JWT dans une API RESTful sur HTTPS (ofc).
Pour que cela fonctionne, vous devez toujours émettre des jetons de courte durée (cela dépend de la plupart des cas, dans mon application, je règle la
exp
revendication à 30 minutes etttl
à 3 jours, afin que vous puissiez actualiser ce jeton tant qu'ilttl
est toujours valide et le jeton n'a pas été mis sur liste noire )Pour le
authentication service
, afin d'invalider les jetons, j'aime utiliser une couche de cache en mémoire ( redis dans mon cas) comme unJWT blacklist
/ban-list
en face, en fonction de certains critères: (je sais que cela rompt avec la philosophie RESTful, mais les documents stockés sont vraiment de courte durée, comme je liste noire pour leur durée de vie restante -ttl
revendication-)Remarque: les jetons sur liste noire ne peuvent pas être actualisés automatiquement
user.password
ouuser.email
a été mis à jour (nécessite la confirmation du mot de passe), le service d'authentification renvoie un jeton actualisé et invalide (liste noire) les précédents, donc si votre client détecte que l'identité de l'utilisateur a été compromise d'une manière ou d'une autre, vous pouvez demander à cet utilisateur de changer son mot de passe . Si vous ne souhaitez pas utiliser la liste noire pour cela, vous pouvez (mais je ne vous encourage pas à) valider le champ (iat
émis à) de la revendicationuser.updated_at
(sijwt.iat < user.updated_at
JWT n'est pas valide).Enfin, vous validez le jeton normalement comme tout le monde.
Remarque 2: au lieu d'utiliser le jeton lui-même (qui est vraiment long) comme clé du cache, je suggère de générer et d'utiliser un jeton UUID pour la
jti
revendication. Ce qui est bien et je pense (je ne suis pas sûr car cela vient à l'esprit) que vous pouvez également utiliser ce même UUID que le jeton CSRF, en renvoyant unsecure
/non-http-only
cookie avec lui et en implémentant correctement l'en-X-XSRF-TOKEN
tête à l'aide de js. De cette façon, vous évitez le travail informatique de création d'un autre jeton pour les contrôles CSRF.la source
Désolé d'être un peu en retard à ce sujet, mais j'avais les mêmes préoccupations et je veux maintenant contribuer quelque chose.
1) rdegges a ajouté un excellent point, que JWT n'a rien à voir avec la "sécurité" et valide simplement, si quelqu'un a foiré la charge utile ou non (signature); ssl aide à prévenir les violations.
2) Maintenant, si SSL est également compromis d'une manière ou d'une autre, tout espion peut voler notre jeton de porteur (JWT) et usurper l'identité de l'utilisateur authentique, une étape de niveau supérieure ce qui peut être fait est de rechercher la "preuve de possession" de JWT auprès du client. .
3) Maintenant, avec cette approche, le présentateur du JWT possède une clé de preuve de possession (POP) particulière, que le destinataire peut confirmer cryptographiquement si la demande provient du même utilisateur authentique ou non.
Pour cela, j'ai référé un article sur la preuve de possession et je suis convaincu par l'approche.
Je serai ravi, si je peux apporter quelque chose.
Santé (y)
la source
Ne pouvons-nous pas simplement ajouter l'ip de l'hôte initial qui a demandé de générer ce jeton JWT dans le cadre de la revendication? Maintenant, lorsque le JWT est volé et utilisé sur une autre machine, lorsque le serveur valide ce jeton, nous pouvons vérifier si l'IP de la machine demandée correspond à celle définie dans le cadre de la revendication. Cela ne correspondrait pas et le jeton peut donc être rejeté. De plus, si l'utilisateur essaie de manipuler le jeton en définissant sa propre ip sur le jeton, le jeton sera rejeté car le jeton est modifié.
la source