Pourquoi JWT dans la plupart des services OAuth 2.0
Cet article explique pourquoi JWT est largement adopté comme format pour les jetons d'accès dans OAuth 2.0, en mettant en avant ses avantages et ses limitations.
OAuth 2.0 est largement utilisé aujourd'hui. En tant que framework central pour les services d'autorisation, l'une des principales responsabilités d'OAuth 2.0 est d'émettre des jetons d'accès pour les utilisateurs. Nous avons remarqué que de nombreux fournisseurs de services OAuth sur le marché émettent des jetons d'accès au format JWT.
Dans cet article, nous allons introduire ce qu'est JWT et pourquoi il est largement adopté comme format pour les jetons d'accès émis par OAuth 2.0.
Introduction à JWT
JWT signifie JSON Web Token, et il est défini par RFC 7519 comme suit :
JSON Web Token (JWT) est un moyen compact et sûr d'URL de représenter des revendications à transférer entre deux parties.
Cette définition rend clair que JWT est un jeton utilisé pour transmettre des revendications entre différentes parties.
Parce que les JWT sont échangés entre plusieurs parties, ils sont signés pour garantir l'intégrité et l'authenticité des données.
Un JWT signé a le format suivant :
Il se compose de trois parties séparées par .
: l'en-tête, la charge et la signature.
Voici un exemple de JWT dans le monde réel :
Vous pouvez essayer de le décoder sur https://jwt.io:
Comme illustré sur l'image, la section en-tête
du JWT contient des informations sur l'algorithme de signature utilisé et le type de jeton. La section charge
contient les revendications portées par le JWT, et la signature
est utilisée pour vérifier l'intégrité du JWT.
Maintenant que nous comprenons ce qu'est JWT et la signification de ses différentes parties, passons à expliquer pourquoi de nombreux services d'autorisation OAuth choisissent JWT comme leur jeton d'accès.
Avantages de l'utilisation de JWT
Les distinctions clés entre JWT et les jetons basés sur des chaînes générées aléatoirement traditionnels sont que les JWT peuvent transporter des informations et être validés par décodage. Ces différences apportent deux avantages significatifs :
- Efficacité des ressources : Les JWT peuvent transporter des informations sur l'utilisateur ou la session, éliminant ainsi le besoin de requêtes fréquentes à la base de données. Cette efficacité peut réduire la consommation de ressources des services.
- Amélioration de la disponibilité et de la scalabilité : Les JWT réduisent la dépendance à la gestion de l'état côté serveur. Cela permet aux services d'être plus sans état, améliorant leur disponibilité et scalabilité.
Lors de l'utilisation de jetons traditionnels basés sur des chaînes aléatoires, le processus typique de vérification et d'authentification est le suivant :
Comme illustré dans le diagramme, lorsqu'un système a de nombreux utilisateurs et différents Serveur de Ressources, cela peut entraîner de nombreuses demandes de validation de jeton au Serveur Auth.
Au fil du temps, à mesure que le système se développe, le Serveur Auth peut facilement devenir un goulet d'étranglement, posant un défi à la disponibilité générale du service.
Cependant, lorsque les JWT sont introduits, le processus de validation se transforme en :
Grâce à la caractéristique des JWT qui permet la validation par décodage, le Serveur de Ressources peut vérifier l'intégrité des JWT et extraire les informations utilisateur sans avoir besoin d'interagir avec le Serveur Auth (Pour plus de détails sur le décodage et la validation des JWT, vous pouvez vous référer à la documentation de Logto).
Limitations du JWT
Bien que les JWT offrent des avantages significatifs dans les architectures logicielles modernes, ils présentent également des limitations à considérer.
Charge facilement espionnée
Comme mentionné précédemment, un JWT se compose de trois parties: l'en-tête
, la charge
et la signature
.
Comment ces composants sont-ils générés? Prenons le JWT de l'exemple précédent et montrons le processus de génération du JWT :
Comme le montre le code ci-dessus, l'en-tête et la charge du JWT sont simplement encodés sous forme de chaînes de base64.
Cela signifie que tant que quelqu'un a accès au jeton, il peut facilement décoder la chaîne base64 de la charge du JWT et accéder aux informations qu'il contient. Inversement, il est également relativement facile de falsifier une charge et de remplacer la charge originale du JWT par une version manipulée.
Bien qu'il soit vrai que la charge d'un JWT puisse être relativement facilement falsifiée, il est important de noter que la partie de signature du JWT ne peut pas être remplacée par un contenu falsifié, car elle nécessite la clé de signature secrète. Par conséquent, sans la signature correcte, le JWT ne peut pas passer la validation.
Ainsi, lors de l'utilisation des JWT, il est important de garder à l'esprit les considérations suivantes :
- Utilisez toujours SSL : Pour garantir que les informations JWT ne soient pas divulguées lors de la transmission, il est essentiel d'utiliser SSL (Secure Sockets Layer) ou son successeur, TLS (Transport Layer Security), pour chiffrer les données en transit.
- Évitez de stocker des données sensibles : Il n'est pas recommandé de stocker des données sensibles dans la charge du JWT. La charge peut être facilement décodée, comme mentionné précédemment, et devrait principalement contenir des revendications pertinentes non sensibles.
- Validez les JWT : Avant de se fier aux informations contenues dans un JWT, assurez-vous qu'il a passé un processus de validation valide et sécurisé, y compris la vérification de la signature et la vérification de l'expiration du jeton. Cela aide à prévenir l'utilisation de jetons falsifiés ou non autorisés.
Difficile à révoquer
En général, les jetons d'accès ont généralement un temps d'expiration. Si le jeton d'accès est représenté sous forme de chaînes aléatoires sans aucune information, nous pouvons vérifier si le jeton a été révoqué lors de chaque validation dans le Serveur Auth.
Quant aux JWT, en raison du fait que les JWT contiennent des informations d'expiration en eux-mêmes, et le fait que la validation des JWT ne repose pas sur le Serveur Auth, une fois qu'un Serveur Auth émet un jeton d'accès au format JWT, il devient impossible de changer l'état du jeton pendant son utilisation.
Après qu'un jeton JWT expire naturellement, nous pouvons obtenir un nouveau JWT du serveur d'autorisation en utilisant un jeton de rafraîchissement (vous pouvez vous référer au blog de Logto pour des informations sur les jetons de rafraîchissement).
Cependant, dans certaines situations, telles que lorsqu'un utilisateur révoque l'autorisation ou change son mot de passe, et que vous devez révoquer un jeton déjà émis mais pas encore expiré, il n'existe pas de solution simple.
Deux approches courantes pour atténuer l'impact de la révocation d'un jeton en cours de route :
- Définissez un temps d'expiration plus court pour le jeton d'accès et reposez-vous sur le mécanisme de rafraîchissement de jeton pour rafraîchir rapidement le statut du jeton.
Parce que le jeton d'accès a un temps d'expiration plus court, lorsqu'un utilisateur découvre que le jeton d'accès a expiré, il peut demander un nouveau jeton d'accès par un jeton de rafraîchissement du service d'autorisation. De cette manière, le statut du jeton côté utilisateur peut se synchroniser avec le backend dès que possible. Cependant, cette approche est assortie de frais généraux supplémentaires que les utilisateurs doivent prendre en compte.
- Maintenez une liste de révocation pour les jetons d'accès et vérifiez si le jeton figure sur la liste lors de chaque validation.
Cette méthode présente certaines limitations. L'un des avantages de JWT est qu'il ne nécessite pas que le serveur stocke des informations d'état, et les JWT sont généralement sans état. Cependant, maintenir une liste de révocation nécessite un stockage et une maintenance efficaces, en s'appuyant sur des mécanismes de stockage supplémentaires. Cela sacrifie essentiellement les avantages de JWT et peut potentiellement conduire à des problèmes de performance. Par conséquent, le mécanisme de révocation de jetons doit être implémenté par les développeurs de manière appropriée pour leur cas d'utilisation spécifique.
Résumé
Dans cet article, nous avons fourni une brève introduction à JWT, en soulignant ses avantages et ses limitations. Dès à présent, vous devriez avoir une compréhension plus approfondie de JWT et des scénarios dans lesquels il est couramment utilisé. Bien que le JWT présente ses défis, les avantages qu'il apporte lorsqu'il est utilisé comme format de jeton dans les services OAuth 2.0 compensent largement ses inconvénients.
Logto, en tant que service d'authentification d'identité en pleine croissance, utilise également JWT comme format pour ses jetons d'accès. Il adhère strictement à divers protocoles d'autorisation et d'authentification, le rendant exceptionnellement facile à intégrer aux services d'authentification d'identité dans vos produits. Logto a officiellement lancé son service SaaS, et vous pouvez l'essayer gratuitement dès aujourd'hui.