web-dev-qa-db-fra.com

Et si JWT est volé?

J'essaie d'implémenter une authentification sans état avec JWT pour mes API RESTful.

Autant que je sache, JWT est fondamentalement une chaîne chiffrée passée en tant qu'en-tête HTTP lors d'un appel REST.

Mais que se passe-t-il s'il y a un indiscret qui voit la demande et vole le jeton? Il pourra alors simuler une demande avec mon identité?

En fait, cette préoccupation concerne tous les authentification par jeton.

Comment prévenir ça? Un canal sécurisé comme HTTPS?

157
smwikipedia

Je suis l'auteur d'une bibliothèque de nœuds qui traite l'authentification de manière assez approfondie, express-stormpath , je vais donc vous donner quelques informations ici.

Premièrement, les fichiers JWT sont généralement PAS cryptés. Bien qu'il existe un moyen de chiffrer les fichiers JWT (voir: JWEs ), cela n’est pas très courant dans la pratique pour de nombreuses raisons.

Ensuite, toute forme d'authentification (avec ou sans JWT) est sujette aux attaques MitM (homme du milieu). Ces attaques se produisent lorsqu'un attaquant peut consulter le trafic de votre réseau lorsque vous effectuez des demandes sur Internet. C’est ce que votre FAI peut voir, la NSA, etc.

C’est ce que SSL évite: en chiffrant le trafic RÉSEAU de votre ordinateur -> sur un serveur lors de l’authentification, un tiers surveillant votre trafic réseau NE peut PAS voir vos tokens, mots de passe ou autre chose de ce type, à moins d’être 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 capable d'exploiter votre SSL et de visualiser votre jeton: la réponse à votre question est que OUI, l'attaquant pourra pouvoir utiliser ce jeton pour vous faire passer pour de l'identité et envoyer des requêtes à votre serveur.

Maintenant, c’est là que les protocoles entrent en jeu.

Les JWT ne sont qu'un standard pour un jeton d'authentification. Ils peuvent être utilisés pour à peu près n'importe quoi. Les JWT sont plutôt cool parce que vous pouvez y intégrer des informations supplémentaires, et vous pouvez valider que personne ne les a dérangés (signature).

Cependant, 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 d'API: il s'agit uniquement de chaînes aléatoires que vous utilisez pour vous authentifier quelque part sur un serveur.

Ce qui rend votre question plus intéressante 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 une authentification pendant une courte période 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 authentifier régulièrement auprès du serveur en fournissant votre nom d'utilisateur/mot de passe OR 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 changeront fréquemment, ce qui rendra plus difficile pour les attaquants de vous imiter sans cesse, sans passer par de grandes difficultés.

Espérons que cela aide ^^

243
rdegges

Je sais que c’est une vieille question, mais je pense que je peux laisser tomber mes 0,50 $ ici. Quelqu'un peut probablement s’améliorer ou fournir un argument pour décliner totalement mon approche. J'utilise JWT dans une API RESTful sur HTTPS (ofc).

Pour que cela fonctionne, vous devez toujours émettre des jetons éphémères (cela dépend de la plupart des cas, dans mon application, je règle en fait la revendication exp sur 30 minutes, et ttl sur 3 jours. peut actualiser ce jeton tant que sa ttl est toujours valide et que le jeton n'a pas été blacklisted)

Pour le authentication service, afin d'invalider les jetons, j'aime utiliser une couche de cache en mémoire ( redis dans mon cas) en tant que JWT blacklist/ban-list devant, en fonction de certains critères: (Je sais que cela enfreint la philosophie RESTful, mais les documents stockés sont vraiment de courte durée, car je mets en liste noire leur durée de vie restante - ttl revendication-)

Remarque: les jetons de la liste noire ne peuvent pas être actualisés automatiquement

  • Si user.password ou user.email a été mis à jour (nécessite une confirmation du mot de passe), le service auth renvoie un jeton actualisé et invalide (liste noire) le ou les précédents, ainsi, si votre client détecte que l'identité de cet utilisateur a été compromise. , vous pouvez demander à cet utilisateur de changer son mot de passe. Si vous ne souhaitez pas utiliser la liste noire, vous pouvez (mais je ne vous encourage pas à valider) valider la revendication iat (émise à) contre le champ user.updated_at (si jwt.iat < user.updated_at alors JWT n'est pas valide).
  • Utilisateur délibérément déconnecté.

Enfin, vous validez le jeton normalement, comme tout le monde.

Note 2: Au lieu d'utiliser le jeton lui-même (ce qui est très long) comme clé du cache, je suggère de générer et d'utiliser un jeton UUID pour la revendication jti. Ce qui est bien et je pense (je ne suis pas sûr car cela m'est venu à l'esprit) que vous pouvez également utiliser ce même UUID comme jeton CSRF, en renvoyant un cookie secure/non-http-only avec ce dernier et correctement. implémenter l'en-tête X-XSRF-TOKEN en utilisant js. De cette façon, vous évitez le travail informatique consistant à créer un autre jeton pour les contrôles CSRF.

26
Frondor

Désolé d'être un peu en retard sur ce point, mais nous avions des préoccupations similaires et souhaitons maintenant apporter quelque chose à ce sujet.

1) rdegges ajoute un excellent point: JWT n’a rien à voir avec la "sécurité" et valide simplement si quelqu'un a gâché la charge utile ou non (signature); ssl aide à prévenir les violations.

2) Maintenant, si le SSL est également compromis, tout espion peut voler notre jeton porteur (JWT) et usurper l'identité de l'utilisateur authentique. Une étape suivante consiste à rechercher le " preuve de possession " de JWT par le client.

3) Maintenant, avec cette approche, le présentateur du JWT possède une clé POP (Preuve de possession) particulière, que le destinataire peut de manière cryptographique confirmer si la demande provient du même utilisateur authentique ou non.

Je me suis référé preuve de possession article pour cela et je suis convaincu de la démarche.

Je serai ravi, si capable de contribuer n'importe quoi.

À la vôtre

4
yanky_cranky