Jeton opaque vs JWT
Comprendre les différences entre les jetons opaques et les JWT, leurs cas d'utilisation, et comment ils sont validés dans les systèmes basés sur l'OIDC.
Comprendre les différences entre les jetons opaques et les JWT, leurs cas d'utilisation, et comment ils sont validés dans les systèmes basés sur l'OIDC.
Dans Logto, en tant que plateforme CIAM basée sur l’OIDC, les jetons d’autorisation jouent un rôle crucial dans la sécurisation des interactions utilisateur et la gestion de l’accès aux ressources. Parmi les différents types de jetons utilisés pour l'autorisation, les jetons opaques et les JWTs (JSON Web Tokens) sont les plus importants.
Nous avons reçu plusieurs questions de notre communauté, telles que : Quelle est la différence entre un jeton opaque et un JWT ? Pourquoi ne puis-je pas décoder le jeton d'accès que j'ai reçu, et pourquoi la longueur du jeton semble-t-elle courte ? Cet article de blog vise à clarifier ces concepts et à vous aider à comprendre les distinctions entre les jetons opaques et les JWTs, leurs cas d'utilisation, et pourquoi vous pourriez rencontrer des comportements différents en travaillant avec eux.
Un jeton opaque est un type de jeton d'accès qui, comme son nom l'indique, est opaque ou non transparent pour le client ou toute partie externe. Cela signifie que le jeton lui-même ne contient aucune information lisible sur l'utilisateur ou l'autorisation accordée.
Lorsque vous recevez un jeton opaque, il apparaît souvent comme une suite apparemment aléatoire de caractères, et toute tentative de le décoder ne donnera pas de données significatives.
Voici un exemple de jeton opaque :
Étant donné que le contenu réel du jeton n'est connu que du serveur d'autorisation qui l'a émis, pour valider un jeton opaque, le client doit le renvoyer au serveur, qui vérifie ensuite son authenticité et détermine les autorisations associées. Cette approche garantit que les informations sensibles restent cachées, offrant une couche de sécurité supplémentaire, mais elle nécessite également une communication serveur supplémentaire pour valider le jeton.
Avantages :
Inconvénients :
Contrairement aux jetons opaques, un JWT (JSON Web Token) est un jeton autonome et sans état qui transporte des informations dans un format structuré et lisible.
Un JWT est composé de trois parties : un header, un payload, et une signature, chacune encodée en Base64URL.
Voici un exemple de JWT :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cheader contient des informations sur le type de jeton et l'algorithme utilisé pour la signature. Par exemple, {"alg": "HS256", "typ": "JWT"}.payload contient des claims—des informations sur l'utilisateur ou l'autorisation—telles que l'ID utilisateur, le temps d'expiration, et les portées. Comme ces données sont encodées mais non cryptées, quiconque possède le jeton peut le décoder pour voir les claims, bien qu'il ne puisse pas les modifier sans invalider la signature. Selon la spécification et la configuration du serveur d'autorisation, divers claims peuvent être inclus dans le payload. Cela donne au jeton sa nature autonome. Par exemple, {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}.signature est générée en combinant le header, le payload, et une clé secrète en utilisant l'algorithme spécifié. Cette signature est utilisée pour vérifier l'intégrité du jeton et assurer qu'il n'a pas été altéré.Les JWTs sont couramment utilisés car ils peuvent être vérifiés localement par le client ou tout service, sans nécessité d'interagir avec le serveur d'autorisation. Cela rend les JWTs particulièrement efficaces pour les systèmes distribués, où plusieurs services pourraient avoir besoin de vérifier l'authenticité du jeton indépendamment.
Cependant, cette commodité s'accompagne également de la responsabilité d'assurer que les claims du jeton ne sont pas excessivement exposées, car elles sont visibles pour quiconque ayant accès au jeton. De plus, les JWTs ont généralement une durée de vie courte, et le temps d'expiration est inclus dans les claims du jeton pour s'assurer que le jeton n'est pas valide indéfiniment.
Avantages :
Inconvénients :
Un jeton d'accès opaque est validé en le renvoyant au serveur d'autorisation pour vérification. Le serveur d'autorisation maintient l'état des tokens émis et peut déterminer la validité du token en fonction de son stockage interne.
Un jeton d'accès JWT peut être validé hors ligne par le client ou tout service ayant accès à la clé publique du jeton.
Dans le contexte de l'OIDC (OpenID Connect), les jetons opaques et les JWTs ont des finalités différentes et sont utilisés dans des scénarios distincts.
Par défaut, lorsqu'un client demande un jeton d'accès sans spécifier une ressource et inclut le champ openid, le serveur d'autorisation émet un jeton d'accès opaque. Ce jeton est principalement utilisé pour récupérer des informations de profil utilisateur depuis le point de terminaison /oidc/userinfo de l'OIDC. Lors de la réception d'une requête avec le jeton d'accès opaque, le serveur d'autorisation vérifie son stockage interne pour récupérer les informations d'autorisation associées et vérifie la validité du jeton avant de répondre avec les détails du profil utilisateur.
Les jetons de rafraîchissement sont conçus pour être échangés uniquement entre le client et le serveur d'autorisation, sans besoin d'être partagés avec les fournisseurs de ressources. En tant que tels, les jetons de rafraîchissement sont généralement émis sous forme de jetons opaques. Lorsque le jeton d'accès actuel expire, le client peut utiliser le jeton de rafraîchissement opaque pour obtenir un nouveau jeton d'accès, garantissant un accès continu sans ré-authentifier l'utilisateur.
Dans l'OIDC, le token d'ID est un JWT qui contient des informations utilisateur et est utilisé pour authentifier l'utilisateur. Généralement émis en parallèle avec le jeton d'accès, le token d'ID permet au client de vérifier l'identité de l'utilisateur. Par exemple :
Le client peut valider l'ID token pour confirmer l'identité de l'utilisateur et extraire des informations utilisateur pour la personnalisation ou les fins d'autorisation. Le token d'ID est à usage unique et ne doit pas être utilisé pour l'autorisation des ressources API.
Lorsqu'un client demande un jeton d'accès avec un indicateur de ressource spécifique, le serveur d'autorisation émet un jeton d'accès JWT destiné à accéder à cette ressource. Le JWT contient des claims que le fournisseur de ressources peut utiliser pour autoriser l'accès du client. Par exemple :
Le fournisseur de ressources peut valider la requête en vérifiant les claims :
iss : Confirme que le jeton a été émis par un serveur d'autorisation de confiance.sub : Identifie l'utilisateur associé au jeton.aud : Assure que le jeton est destiné à la ressource spécifique.scope : Vérifie les permissions accordées à l'utilisateur.En résumé, les jetons opaques et les JWTs ont des finalités différentes dans les systèmes basés sur l'OIDC, avec les jetons opaques fournissant une approche sécurisée et étatful de l'autorisation et les JWTs offrant une alternative sans état et autonome. Comprendre les distinctions entre ces types de jetons et leurs cas d'utilisation est essentiel pour concevoir des mécanismes d'authentification et d'autorisation sécurisés et efficaces dans vos applications.
Découvrez plus de fonctionnalités de jetons d'accès dans Logto :