web-dev-qa-db-fra.com

Est-il judicieux de stocker JWT dans une base de données?

J'ai implémenté un système d'authentification de base avec Spring Boot, Spring Security, OAUTH2 et JWT en tant que jetons d'authentification. Cela fonctionne bien, mais je me demandais s'il était logique de stocker JWT dans une base de données et de vérifier si un jeton existait à chaque fois qu'une personne fait une demande authentifiée en l'utilisant? Je pensais plus précisément au scénario suivant: l'utilisateur est authentifié sur un appareil mobile et le perd, ce qui lui donne le droit de retirer l'autorisation de cet appareil. Ils pourraient alors émettre une opération qui efface les jetons émis à leur identifiant utilisateur et annule l'autorisation de tous les jetons qui lui sont attribués. Une autre manière? Est-ce que je pense que c'est faux ou que je complique les choses?

Ceci est destiné à sécuriser une API REST) appelée à être appelée à partir d'une application mobile.

26
laurentius

Vous pouvez stocker le JWT dans la base de données, mais vous perdez certains des avantages d'un JWT. JWT vous donne l'avantage de ne pas avoir besoin de vérifier le jeton dans une base de données à chaque fois, car vous pouvez simplement utiliser la cryptographie pour vérifier que le jeton est légitime. Si vous devez rechercher le jeton dans la base de données, vous pouvez aussi simplement utiliser un jeton opaque qui ne porte pas d’information et laisser le serveur et la base de données vous fournir les informations. Par contre, si vous allez stocker un jeton dans la base de données, je ne pense pas qu'un JWT soit un mauvais choix pour votre type de jeton. Comme vous le dites, la révocation présente des avantages si vous stockez votre jeton dans la base de données. Tout dépend de ce que vous voulez atteindre (autorisation plus rapide, etc. vs possibilité de révocation à la demande).

Vous pouvez toujours utiliser JWT avec OAuth2 sans stocker de jetons dans la base de données si vous le souhaitez. Les JWT ont un délai d'expiration configurable que vous pouvez définir, après quoi ils ne sont pas valides. Les jetons d'accès (qu'ils soient JWT ou non) doivent généralement être de courte durée pour la sécurité. Si le problème concerne le vol de téléphone et l'obtention de jetons d'accès, je pense que la solution consiste à faire expirer ces jetons rapidement (30 minutes?). Si vous utilisez oauth2, le moyen d'empêcher quelqu'un de continuer à utiliser l'application consiste pour le propriétaire réel à désautoriser le client de l'application mobile sur le serveur d'autorisations afin d'éviter la distribution de jetons d'accès.

37
sdoxsee

Vous pouvez définir la date d'expiration (pour mobile 1 semaine). Ajoutez un champ personnalisé refreshId pour l'utilisateur (vous pouvez utiliser uuid pour cela). Jeu suivant Paramètre Issued at Claims ("iat"). Stockez refreshId dans la base de données et définissez-le comme paramètre de revendication. Ensuite, chaque fois que vous validez le jeton, vous devez vérifier son "âge". Si elle date plus d'une heure, vous devez charger les données de la base de données et vérifier la valeur refreshId, créer un nouveau jeton avec la valeur "iat" actuelle et l'envoyer au périphérique mobile. Lorsque vous devez désactiver les jetons, générez simplement une nouvelle valeur pour refreshId dans la base de données. Au bout d'une heure, tous les jetons seront incorrects. Par conséquent, l'utilisateur devra se connecter à nouveau sur chaque appareil. Vous pouvez créer une solution plus personnalisée si vous en avez besoin.

14
Jan Pavtel