JSON Web Token - Sécurisez vos APIs

JSON Web Token - Sécurisez vos API
JWT JSON Web Token, qu'est-ce que c'est ?
JSON Web Token est un standard ouvert (RFC 7519) qui définit un moyen de transmettre de manière sécurisée des données entre serveurs & clients sous la forme d’un objet JSON. Le JWT peut être signé en utilisant un secret avec l'algorithme HMAC ou une partie de clés public / privé avec RSA.
Il existe 2 conceptions principales concernant JWT :
- Compact : Grâce à la taille plus petite, le JWT peut être envoyé via une URL, un paramètre POST ou directement à l'intérieur d'un entête http ;
- Autonome (self-contained) : Le Payload contient toutes les informations requises sur l'utilisateur afin d'éviter d'avoir besoin d'interroger plus d'une fois.
Comment ça fonctionne ?
Le mécanisme d'authentification du JWT ressemble beaucoup à celui d'OAuth 2. Mais attention, ils ne sont pas identiques.
Le client envoie dans un premier temps son identifiant et son mot de passe au serveur. Une fois que l'authentification est effectuée sur le serveur, il renvoie un JWT avec un secret dedans. Les appels d'API ultérieurs sont envoyés avec un header d'autorisation de JWT qui permet au serveur / application de vérifier la signature afin de récupérer les informations attachées au token JWT.
Pourquoi sécuriser les API avec JWT ?
Avant de répondre à cette question, il est nécessaire d'expliquer quelques caractéristiques d'une API Web.
Une API Web :
- expose des informations
- permet de manipuler ces informations
- est normalement stateless
Cela signifie que les appels d'une API Web sont isolés et sans session. C'est important de pouvoir sécuriser l'API pour éviter les piratages ou les abus.
Il y a quelques solutions utilisées pour sécuriser une API :
- Authentification avec la session
- Authentification avec les clés d'API
Mais les inconvénients sont aussi très clairs :
- la gestion des clés en base de données
- pas de mécanisme d'expiration
- un token non-exploitable
Le JWT peut donc être utilisé dans ces deux scénarios principaux :
- Authentification : C'est le scénario le plus courant pour l'utilisation de JWT. Le JWT est attaché à chaque requête une fois que l'utilisateur est connecté, permettant à l'utilisateur d'accéder aux ressources autorisées avec ce token.
- Echange d'informations critiques : Grâce à la conception autonome, le Payload permet de transmettre de manière sécurisée les informations critiques, par exemple les données sensibles, entre les parties (serveurs / clients). Signé par la clé privé / public, on peut être sûr de la sécurisation des données. D'ailleurs, on peut éventuellement vérifier la cohérence des données.
Structure de JWT
Le JWT se compose de trois parties séparées :
- Header
- Payload
- Signature
Un JWT complet est comme le format ci-dessous: > xxxxxx.yyyyyy.zzzzzz
Header
Le Header d'un JWT se compose de deux parties : le type (typ) du token, qui est JWT dans ce contexte et l'algorithme (hashing) utilisé, par exemple HS256 ou RSA, pour la partie alg.
{
"alg" : "HS256",
"typ" : "JWT"
}
Attention : cette première partie de JWT doit être encodée en Base64Url
Payload
Cette partie, la plus intéressante, contient les Claims qui sont des déclarations concernant les entités et des métadonnées supplémentaires. Il existe trois types de claim : reserved, public, private. C'est la partie plus importante dans JWT.
- Reserved claims :
– (issuer), (temps d'expiration), (sujet) etc.
{
"sub" : "JWT-exemple-client",
"name" : "John Doe",
"roles" : ["ADMIN", "USER", "REPORTER"]
}
La partie Payload doit être aussi encodée en Base64Url
Signature
Pour créer la signature, il faut signer le token complet : header + payload + secret en utilisant l'algorithme alg, défini dans la partie Header.
JWT ou OAuth 2 ?
Même si le processus d'authentification de JWT et celui d'OAuth 2 sont très similaires, c'est important de comprendre qu'ils ne sont pas identiques ou même incompatibles.
- Le JWT est un protocole d'authentification : cela signifie qu'il est utilisé seulement pour l'accès limité à un serveur / une application par ses clients.
- Par contre, OAuth 2 est un framework d'authentification : qui permet aux utilisateurs et aux serveurs / applications d'autoriser les permissions spécifiques aux autres applications de manière publique et de manière privée.
Réf. :
- https://jwt.io Site officiel de JWT
- https://oauth.net/2/ Site officiel d'OAuth 2
- http://www.seedbox.com/en/blog/2015/06/05/oauth-2-vs-json-web-tokens-comment-securiser-un-api/ Article sur la comparaison entre JWT et OAuth 2 (Anglais) OAuth 2 VS JSON Web Tokens: How to secure an API
Qing Z
Ajouter un commentaire