web-dev-qa-db-fra.com

Stockage d'informations dans la charge utile JWT

Actuellement, le jeton d'accès expire dans 15 minutes et la seule information stockée dans la charge utile est l'ID utilisateur.

Chaque utilisateur dispose d'un solde qu'il peut utiliser dans l'application. Dois-je interroger la base de données sur chaque demande pour pouvoir tirer le solde? Serait-il dangereux de stocker la charge utile?

17
civ15

tl/dr : Bien que vous puissiez stocker le solde dans votre JWT et qu'il soit à l'abri de la falsification, il existe de nombreuses façons dont le solde dans le JWT peut être techniquement valide mais toujours incorrect. Par conséquent, il est probablement préférable de vérifier le solde de la base de données à chaque fois, et vous devez certainement le vérifier avant d'effectuer toute transaction

Il existe deux types de JWT:

  1. JWS: la charge utile est en "texte brut" et possède une signature pour confirmer son contenu
  2. JWE: La charge utile est entièrement cryptée.

Ceux-ci ont des cas d'utilisation légèrement différents. Si tout ce que vous devez faire est de vérifier que les données stockées dans le JWT sont correctes et n'ont pas été falsifiées, alors un JWS est correct (en supposant que vous l'implémentez correctement et vérifiez la signature sur toutes les demandes). Par conséquent, vous pouvez stocker le solde dans un JWS et confirmer ultérieurement que le solde signalé correspond à ce que vous aviez initialement stocké.

Si vous souhaitez également garder les données privées, vous pouvez utiliser un JWE. Le cryptage garantira également que les données ne seront pas modifiées (encore une fois, en supposant que vous implémentez correctement le JWE). Notez que la seule personne qui a normalement accès au JWT est l'utilisateur final, nous parlons donc de le garder privé d'eux - probablement pas nécessaire pour votre cas d'utilisation (h/t EdC ).

Par conséquent, la balance est à l'abri de toute altération.

Dans les deux cas, vous devez vérifier le solde avec la base de données avant d'effectuer une transaction réelle car:

Le solde peut encore être erroné. Si une autre transaction a été effectuée sans mettre à jour un JWT, ou si un ancien JWT est présenté (alias une attaque par rejeu), alors vous pouvez avoir un JWT valide dont le solde est incorrect. Ceci est très probable même sans attaquants actifs. Considérez un utilisateur qui utilise plus d'une application. Dans votre scénario hypothétique, que se passe-t-il si un solde est stocké dans un JWT sur un appareil, puis que l'utilisateur se connecte à un autre appareil et effectue une transaction? Les données du JWT pour le premier appareil sont désormais incorrectes, même si le JWT lui-même est valide et n'a pas expiré. Ce n'est là qu'une des nombreuses façons dont des JWT valides mais incorrects peuvent se produire.

Il existe de nombreuses façons de résoudre les problèmes de données obsolètes dans un JWT, mais à la fin, ces correctifs pourraient être plus complexes que de simplement vérifier la base de données à chaque fois. Cependant, c'est un jeu d'équilibre qui dépend en fin de compte de vous! Il n'y a pas de bonne réponse.

30
Conor Mancone

Oui, vous devez interroger la base de données à chaque demande. L'utilisation d'une approche JWT signifie que vous comptez sur le client pour envoyer le JWT correct. Si vous proposez de stocker le solde sur le JWT, je suppose que votre idée est de générer un nouveau JWT chaque fois que le solde change. Le problème est de faire confiance au client pour envoyer le JWT correct.

Exemple

  • 00:00 - J'accède à l'application. Un JWT est généré avec mon solde (10 $) et un temps de vie de 15 minutes. Appelons cela "jeton 1".
  • 00:05 - Je fais un achat de 5 $. Cela entraîne probablement le serveur pour générer un nouveau JWT, avec un solde de 5 $. Appelons cela "jeton 2".
  • 00:10 - J'essaie de faire un achat de 10 $. Cependant, j'ai modifié mon application pour envoyer le jeton 1 (plutôt que le jeton 2). Il est toujours efficace et il a un solde de 10 $. Sans vérifier la base de données, pourquoi la transaction ne serait-elle pas terminée?
18
Andy N

L'interrogation de la base de données sur chaque demande annulerait le principal avantage de l'utilisation d'un JWT - vous n'avez pas besoin d'accéder à la base de données. En supposant que vous tilisez correctement JWT , il est sûr de stocker des informations à l'intérieur. Puisqu'il est signé, un attaquant ne peut pas jouer avec le contenu.

Edit: Bien que la signature s'assure que la charge utile n'est pas manipulée, elle ne garantit pas c'est toujours d'actualité. Voir la très bonne réponse d'Andy N .

4
Anders