Tout savoir sur le jwt
JSON Web Token
Norme basée sur JSON pour la transmission de revendications entre les parties dans des environnements d’applications Web
JSON Web Token ( JWT , prononciation suggérée , identique au mot « jot » [1] ) est une norme Internet proposée pour la création de données avec une signature facultative et/ou un cryptage facultatif dont la charge utile contient JSON qui affirme un certain nombre de revendications. Les jetons sont signés à l’aide d’un secret privé ou d’une clé publique/privée.
Par exemple, un serveur peut générer un jeton avec la revendication « connecté en tant qu’administrateur » et le fournir à un client. Le client peut ensuite utiliser ce jeton pour prouver qu’il est connecté en tant qu’administrateur. Les jetons peuvent être signés par la clé privée d’une partie (généralement celle du serveur) afin que toute partie puisse vérifier par la suite si le jeton est légitime. Si l’autre partie, par une partie appropriée et digne de confiance, est en possession de la clé publique correspondante, ils sont également en mesure de vérifier la légitimité du jeton. Les jetons sont conçus pour être compacts, [2] sécurisés pour les URL, [3] et utilisables, en particulier dans un contexte de navigateur Web. Les revendications JWT peuvent généralement être utilisées pour transmettre l’identité des utilisateurs authentifiés entre un fournisseur d’identité et un fournisseur de services, ou tout autre type de revendications requis par les processus métier. [4] [5]
JWT s’appuie sur d’autres normes basées sur JSON : JSON Web Signature et JSON Web Encryption. [1] [6] [7]
- En-tête de structure
- Identifie l’algorithme utilisé pour générer la signature. Dans l’exemple ci-dessous, indique que ce jeton est signé à l’aide de HMAC-SHA256.
- Les algorithmes cryptographiques typiques utilisés sont HMAC avec SHA-256 (HS256) et la signature RSA avec SHA-256 (RS256). La RFC 7518 JWA (JSON Web Algorithms) en introduit beaucoup d’autres pour l’authentification et le cryptage. [8]
- {"alg » :"HS256 »,"typ » :"JWT"}
- La charge utile
- Contient un ensemble de revendications. La spécification JWT définit sept noms de revendication enregistrés, qui sont les champs standard généralement inclus dans les jetons. [1] Les réclamations personnalisées sont généralement également incluses, en fonction de l’objectif du jeton.
- Dans cet exemple, il s’agit de la revendication standard Émis à l’heure () et d’une revendication personnalisée ().
- {"loggedInAs » :"admin »,"iat » :1422779638}
- Signature
- en toute sécurité valide le jeton. La signature est calculée en codant l’en-tête et la charge utile à l’aide de l’encodage Base64urlRFC 4648 et en concaténant les deux ensemble avec un séparateur de point. Cette chaîne est ensuite exécutée par l’algorithme cryptographique spécifié dans l’en-tête. Cet exemple utilise HMAC-SHA256 avec un secret partagé (les algorithmes de clé publique sont également définis). L’encodage base64url est similaire à base64, mais utilise des caractères non alphanumériques différents et omet le remplissage.
- HMAC_SHA256(secret,base64urlEncoding(header)+'.'+base64urlEncoding(payload))
Les trois parties sont encodées séparément à l'aide de Base64url EncodingRFC 4648, et concaténées à l'aide de points pour produire le JWT :
Les données ci-dessus et le secret de « secretkey » crée le jeton :
(Les chaînes json ci-dessus sont formatées sans sauts de ligne ni espaces, en tableaux d’octets utf-8. Ceci est important car même de légères modifications dans les données affecteront le jeton résultant)
Ce jeton résultant peut être facilement passé en HTML et HTTP. [3]
Utilisation
Dans l’authentification, lorsqu’un utilisateur se connecte avec succès, un jeton Web JSON (JWT) est souvent renvoyé. Ce jeton doit être envoyé au client à l’aide d’un mécanisme sécurisé tel qu’un . Il est déconseillé de stocker le JWT localement dans les mécanismes de stockage du navigateur, tels que le stockage local ou de session. Pour les processus non assistés, le client peut également s’authentifier directement en générant et en signant son propre JWT avec un secret pré-partagé et en le transmettant à un service conforme à OAuth comme suit :
Si le client passe une assertion JWT valide, le serveur générera un access_token valide pour effectuer des appels à l’application et le repassera au client :
Lorsque le client souhaite accéder à une route ou à une ressource protégée, l’agent utilisateur doit envoyer le JWT, généralement dans l’en-tête HTTP en utilisant le schéma. Le contenu de l’en-tête peut ressembler à ce qui suit :
Autorisation : Bearer eyJhbGci ... < snip>... yu5CSpyHIIl s’agit d’un mécanisme d’authentification sans état car l’état de l’utilisateur n’est jamais enregistré dans la mémoire du serveur. Les routes protégées du serveur vérifieront la présence d’un JWT valide dans l’en-tête Authorization, et s’il s’agit d’un présent, l’utilisateur sera autorisé à accéder aux ressources protégées. Comme les JWT sont autonomes, toutes les informations nécessaires sont là, ce qui réduit le besoin d’interroger la base de données plusieurs fois.
Champs
Nom | de code | Description |
---|---|---|
Champs de revendication standard | Les brouillons Internet définissent les champs standard suivants (« claims ») qui peuvent être utilisés à l’intérieur d’un ensemble de revendications JWT. | |
Émetteur | Identifie le mandant qui a émis le JWT. | |
Objet | Identifie l’objet du JWT. | |
Audience | Identifie les destinataires auxquels le JWT est destiné. Chaque directeur destiné à traiter le JWT doit s’identifier à une valeur dans l’auditoire revendication. Si le débiteur principal qui traite la demande ne s’identifie pas à une valeur dans la demande lorsque celle-ci est présente, le JWT doit être rejeté. | |
Délai d’expiration | Identifie le délai d’expiration au-delà duquel le JWT ne doit pas être accepté pour le traitement. La valeur doit être un NumericDate : [9] soit un entier ou un décimal, représentant les secondes après 1970-01-01 00:00:00Z. | |
Pas avant | Indique le moment où le JWT commencera à être accepté pour le traitement. La valeur doit être une NumericDate. | |
Délivré à | Identifie l’heure à laquelle le JWT a été émis. La valeur doit être une NumericDate. | |
JWT ID | Identifiant unique sensible à la casse du jeton, même entre différents émetteurs. | |
Champs d’en-tête couramment utilisés | Les champs suivants sont couramment utilisés dans l’en-tête d’un type de jeton JWT | |
S’ils sont présents, ils doivent être définis sur un type de média IANA enregistré. | ||
Type de contenu | Si la signature imbriquée ou le chiffrement est utilisé, il est recommandé de définir cette option sur ; sinon, omettez ce champ. [1] | |
Algorithme du code d’authentification du message | L’émetteur peut librement définir un algorithme pour vérifier la signature sur le jeton. Cependant, certains algorithmes pris en charge ne sont pas sécurisés. [10] | |
ID de clé | Indicateur indiquant la clé utilisée par le client pour générer la signature de jeton. Le serveur fera correspondre cette valeur à une clé dans le fichier afin de vérifier que la signature est valide et que la Le jeton est authentique. | |
x.509 Chaîne de certificats Chaîne | de certificats au format RFC4945 correspondant à la clé privée utilisée pour générer la signature du jeton. Le serveur utilisera ces informations pour vérifier que la signature est valide et que le jeton est authentique. | |
x.509 URL de la chaîne de certificats URL | où le serveur peut récupérer une chaîne de certificats correspondant à la clé privée utilisée pour générer la signature du jeton. Le serveur récupère et utilise ces informations pour vérifier l’authenticité de la signature. | |
Critique | Une liste d’en-têtes qui doivent être compris par le serveur afin d’accepter le jeton comme valide Nom de | |
code | Description |
La liste des noms de revendications actuellement enregistrés peut être obtenu à partir du registre des réclamations de jeton Web JSON de l’IANA [11] .
Implémentations
Lesimplémentations JWT existent pour de nombreux langages et frameworks, y compris, mais sans s’y limiter :
Vulnérabilités
Les jetons Web JSON peuvent contenir l’état de la session. Mais si les exigences du projet autorisent l’invalidation de la session avant l’expiration de JWT, les services ne peuvent plus faire confiance aux assertions de jeton par le jeton seul. Pour vérifier que la session stockée dans le jeton n’est pas révoquée, les assertions de jeton doivent être vérifiées par rapport à un magasin de données. Cela rend les jetons non plus sans état, ce qui sape l’avantage principal des JWT. [37]
Le consultant en sécurité Tim McLean a signalé des vulnérabilités dans certaines bibliothèques JWT qui utilisaient le champ pour valider incorrectement les jetons, le plus souvent en acceptant un jeton. Bien que ces vulnérabilités aient été corrigées, McLean a suggéré de déprécier complètement le domaine pour éviter une confusion similaire dans l’implémentation. [10] Pourtant, de nouvelles vulnérabilités sont toujours trouvées dans la nature, avec quatre CVE déposées au cours de la période 2018-2021 ayant cette cause. [38] [ une meilleure source nécessaire ]
Avec une conception appropriée, les développeurs peuvent corriger les vulnérabilités des algorithmes en prenant des précautions : [39] [40]
- Ne laissez jamais l’en-tête JWT seul piloter la vérification
- Connaître les algorithmes (éviter de dépendre uniquement du champ)
- Utilisez une taille
de clé appropriée Plusieurs bibliothèques JWT se sont avérées vulnérables à une attaque à courbe elliptique invalide en 2017. [41]
Certains ont fait valoir que les jetons Web JSON sont difficiles à utiliser en toute sécurité en raison des nombreux algorithmes et options de chiffrement différents disponibles dans la norme, et que des normes alternatives devraient être utilisées à la place pour les frontends web [42] et les backends. [43]
Voir aussi
Références
- ^ a b c d Jones, Michael B. ; Bradley, Bradley ; Sakimura, Sakimura (mai 2015). JSON Web Token (JWT) . IETF. doi :10.17487/RFC7519. ISSN 2070-1721. RFC7519.
- ^ Nickel, Jochen (2016). Maîtriser la gestion des identités et des accès avec Microsoft Azure . Éditions Packt. p. 84. CODE ISBN. Récupérée 20 juillet 2018.
- ^ a b "JWT. IO - Introduction aux jetons Web JSON". jwt.io . (consulté le 20 juillet 2018)
- ^ Sevilleja, Chris. « L’anatomie d’un jeton Web JSON ». (consulté le 8 mai 2015)
- ^ « Documentation Atlassian Connect ». developer.atlassian.com . Archivé de l’original le 18 mai 2015. (consulté le 8 mai 2015)
- ^ Jones, Michael B. ; Bradley, John ; Sakimura, Nat (mai 2015). « draft-ietf-jose-json-web-signature-41 - Signature Web JSON (JWS) ». tools.ietf.org . (consulté le 8 mai 2015)
- ^ Jones, Michael B. ; Hildebrand, Joe (mai 2015). « draft-ietf-jose-json-web-encryption-40 - Cryptage Web JSON (JWE) ». tools.ietf.org . (consulté le 8 mai 2015)
- ^ Jones, Michael B. (mai 2015). « draft-ietf-jose-json-web-algorithms-40 - Algorithmes Web JSON (JWA) ». tools.ietf.org . (consulté le 8 mai 2015)
- ^ Jones, Michael B. ; Bradley, Bradley ; Sakimura, Sakimura (mai 2015). « "exp » (Réclamation de délai d’expiration) ». JSON Web Token (JWT) . IETF. 4.1.4. doi :10.17487/RFC7519. ISSN 2070-1721. RFC7519.
- ^ a b McLean, Tim (31 mars 2015). « Vulnérabilités critiques dans les bibliothèques JSON Web Token ». Auth0. (consulté le 29 mars 2016)
- ^ « Jeton Web JSON (JWT) ». IANA . 23 janvier 2015. Récupéré le 5 décembre 2024.
- ^ jwt-dotnet sur github.com
- ^ libjwt sur github.com
- ^ « liquidz/clj-jwt ». GitHub . (consulté le 7 mai 2018)
- ^ cljwt sur github.com
- ^ JustJWT sur github.com
- ^ « bryanjos/joken ». GitHub . (consulté le 7 mai 2018)
- ^ « golang-jwt/jwt ». GitHub . (consulté le 8 janvier 2018)
- ^ « jose : JSON Object Signing and Encryption (JSON Signature and Crypting) et JSON Web Token (JWT) library ». Piratage . Récupéré le 25 décembre 2022.
- ^ auth0/java-jwt sur github.com
- ^ « kjur/jsrsasign ». GitHub . (consulté le 7 mai 2018)
- ^ « SkyLothar/lua-resty-jwt ». GitHub . (consulté le 7 mai 2018)
- ^ « jsonwebtoken ». npm . (consulté le 7 mai 2018)
- ^ ocaml-jwt sur github.com
- ^ Crypt ::JWT sur cpan.org
- ^ lcobucci/jwt sur github.com
- ^ Egan, Morten (7 février 2019), GitHub - morten-egan/jwt_ninja : Implémentation PLSQL des jetons Web JSON. , récupéré le 14 mars 2019
- ^ « SP3269/posh-jwt ». GitHub . (consulté le 1er août 2018)
- ^ « jpadilla/pyjwt ». GitHub . (consulté le 21 mars 2017)
- ^ net-jwt sur pkgs.racket-lang.org
- ^ JSON-WebToken sur github.com
- ^ ruby-jwt sur github.com
- ^ jsonwebtoken sur github.com
- ^ rust-jwt sur github.com
- ^ jwt-scala sur github.com
- ^ [1] sur github.com
- ^ Slootweg, Sven. « Arrêtez d’utiliser JWT pour les sessions ». joepie91 Divagations . (consulté le 1er août 2018)
- ^ « CVE - Résultats de la recherche ». cve.mitre.org .
- ^ « Vulnérabilités de sécurité courantes de JWT et comment les éviter ». (consulté le 14 mai 2018)
- ^ Andreas, Happe. « JWT : Attaques Signature vs MAC ». snikt.net . Récupéré le 27 mai 2019.
- ^ « Vulnérabilité critique dans le cryptage Web JSON ». Auth0 - Blog . Récupéré le 14 octobre 2023.
- ^ "Pas question, JOSE ! . paragonie.com . Récupéré le 13 octobre 2023.
- ^ « Pièges de l’autorisation JWT ». authzed.com . Récupéré le 16 novembre 2023.
- RFC 7519
- jwt.io – site web spécialisé sur JWT avec des outils et de la documentation, maintenu par Auth0