AccueilđŸ‡«đŸ‡·Chercher

JSON Web Token

JSON Web Token (JWT) est un standard ouvert dĂ©fini dans la RFC 7519[1]. Il permet l'Ă©change sĂ©curisĂ© de jetons (tokens) entre plusieurs parties. Cette sĂ©curitĂ© de l’échange se traduit par la vĂ©rification de l'intĂ©gritĂ© et de l'authenticitĂ© des donnĂ©es. Elle s’effectue par l'algorithme HMAC ou RSA.

JSON Web Token (JWT)
Date de premiĂšre version Mai 2015
Auteur M. Jones, J. Bradley and N. Sakimura
DĂ©veloppeur IETF
Normes RFC 7519[1]
Site web jwt.io

Structure

Un jeton se compose de trois parties :

  • Un en-tĂȘte (header), utilisĂ© pour dĂ©crire le jeton. Il s'agit d'un objet JSON.
  • Une charge utile (payload) qui reprĂ©sente les informations embarquĂ©es dans le jeton. Il s'agit Ă©galement d'un objet JSON.
  • Une signature numĂ©rique.

Il existe des outils en ligne permettant de les déchiffrer[2].

Exemple

En-tĂȘte

{"typ": "jwt", "alg": "HS512"}

Charge utile

{"name":"Wikipedia", "iat":1525777938}

Dans l'exemple ci-dessus, on voit dans l’en-tĂȘte que le jeton est un JSON Web Token (JWT) et que l'algorithme utilisĂ© pour la signature est HMAC-SHA512.

Obtention de la signature

Pour obtenir la signature, il faut tout d'abord encoder sĂ©parĂ©ment l'en-tĂȘte et la charge utile avec Base64url dĂ©fini dans la RFC 4648[3]. Ensuite, on les concatĂšne en les sĂ©parant par un point. On obtient la signature de ce rĂ©sultat avec l'algorithme choisi. Cette signature est ajoutĂ©e au rĂ©sultat de la mĂȘme maniĂšre (encodĂ©e et sĂ©parĂ©e par un point).

À noter que pour l'encodage en Base64url, le caractĂšre de remplissage '=' n'est pas obligatoire et ne sera pas utilisĂ© dans la crĂ©ation du JSON Web Token pour faciliter la transmission dans une URL.

Procédure étape par étape

À partir de l'exemple ci-dessus, voici les diffĂ©rentes Ă©tapes pour obtenir un JSON Web Token.

Encodage de l'en-tĂȘte

eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzUxMiJ9

Encodage de la charge utile

eyJuYW1lIjoiV2lraXBlZGlhIiwiaWF0IjoxNTI1Nzc3OTM4fQ

ConcatĂ©nation de l'en-tĂȘte et de la charge utile, sĂ©paration par un point

eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzUxMiJ9.eyJuYW1lIjoiV2lraXBlZGlhIiwiaWF0IjoxNTI1Nzc3OTM4fQ

Obtention du code d'authentification de message avec l'algorithme HMAC-SHA512[4].

HMACSHA512(concatenation, 'ma super clé secrÚte')

Encodage du code (toujours avec Base64url)

iu0aMCsaepPy6ULphSX5PT32oPvKkM5dPl131knIDq9Cr8OUzzACsuBnpSJ_rE9XkGjmQVawcvyCHLiM4Kr6NA

Concaténation des deux éléments, séparation par un point

eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzUxMiJ9.eyJuYW1lIjoiV2lraXBlZGlhIiwiaWF0IjoxNTI1Nzc3OTM4fQ.iu0aMCsaepPy6ULphSX5PT32oPvKkM5dPl131knIDq9Cr8OUzzACsuBnpSJ_rE9XkGjmQVawcvyCHLiM4Kr6NA

Champs standards (claims)

La spécification de JWT propose différents champs (ou paramÚtres) standards, appelés Claims[5] :

  • iss : crĂ©ateur (issuer) du jeton
  • sub : sujet (subject) du jeton
  • aud : audience du jeton
  • exp : date d'expiration du jeton
  • nbf : date avant laquelle le jeton ne doit pas ĂȘtre considĂ©rĂ© comme valide (not before)
  • iat : date Ă  laquelle a Ă©tĂ© crĂ©Ă© le jeton (issued at)
  • jti : identifiant unique du jeton (JWT ID)

Tous ces paramÚtres sont optionnels. Ils permettent simplement de définir plus précisément un jeton et de renforcer sa sécurité (e.g. en limitant la durée de vie d'un jeton).

Implémentation

L'implémentation de JWT peut se faire à travers une pléthore de bibliothÚques[6] disponibles dans de nombreux langages de programmation.

Voici une liste non exhaustive de langages de programmation pour lesquels il existe une librairie JWT : .NET, 1C, Ada, C, C++, Clojure, Crystal, D, Delphi, Elixir, Erlang, Go, Groovy, Haskell, Haxe, Java, JavaScript, kdb+/Q, Kotlin, Lua, Node.js, Objective-C, Perl, PHP, PostgreSQL, Python, Ruby, Rust, Scala, Swift.

Il est Ă©galement possible d'implĂ©menter soi-mĂȘme la spĂ©cification RFC 7519[1] dĂ©crivant JWT.

Vulnérabilités

Les JWT sont un moyen d'authentification sécurisé. Il existe néanmoins certaines vulnérabilités, qui sont évitables en les considérant avec précaution. En voici une liste non exhaustive :

  • Un JWT peut ĂȘtre soit encodĂ© soit chiffrĂ©[4]. Un JWT uniquement encodĂ©, comme c'est le cas de la majoritĂ© des JWT en circulation[4], devra donc transiter par un protocole de communication sĂ©curisĂ© (i.e. HTTPS) pour le rendre inutilisable par un utilisateur mal intentionnĂ© qui serait parvenu Ă  l'intercepter[7].
  • La clĂ© secrĂšte doit ĂȘtre conservĂ©e de façon extrĂȘmement sĂ©curisĂ©e. Tout utilisateur (ou systĂšme) en possession de la clĂ© secrĂšte d'un serveur serait en mesure de gĂ©nĂ©rer des JWT reconnus comme valides par ce serveur[4] - [7].

Notes et références

  1. (en) « JSON Web Token (JWT) », Request for comments no 7519.
  2. (en) « Jwt Tool »
  3. (en) « The Base16, Base32, and Base64 Data Encodings », Request for comments no 4648.
  4. (en-US) auth0.com, « JWT.IO - JSON Web Tokens Introduction », sur jwt.io (consulté le )
  5. (en) John Bradley et Nat Sakimura, « JSON Web Token (JWT) », sur tools.ietf.org (consulté le )
  6. https://jwt.io/#libraries-io
  7. « JSON Web Token (JWT) : Le guide complet », sur primfx.com, (consulté le )

Voir aussi

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.