Logo JWT

JSON Web Tokens (JWT)

Une méthode sécurisée et compacte pour l'échange d'informations entre parties sous forme d'objet JSON signé numériquement.

Pour les non-initiés

Qu'est-ce qu'un JWT ?

Imaginez que vous avez un badge d'accès à un bâtiment sécurisé. Ce badge contient des informations sur vous (votre nom, vos autorisations) et est signé par une autorité qui confirme son authenticité.

Un Icône JSON Web Token (JWT)JSON Web Token (JWT) fonctionne de la même manière, mais dans le monde numérique. C'est un jeton d'identification qui :

Pourquoi utiliser des JWT ?

Sécurisé

Signé numériquement et vérifiable, il est difficile à falsifier et peut être chiffré pour une sécurité renforcée.

Autonome

Contient toutes les informations nécessaires, éliminant le besoin de consulter une base de données à chaque requête.

En termes simples, les JWT sont largement utilisés pour l'authentification et l'autorisation dans les applications web modernes, permettant à un utilisateur de prouver son identité sans avoir à renvoyer ses identifiants à chaque interaction.

Pour les développeurs

Structure et fonctionnement

Un JSON Web Token est une chaîne de caractères composée de trois parties séparées par des points (.) : Header, Payload et Signature.

Structure d'un JWT
// Structure d'un JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. // Header (encodé en Base64Url) eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4g // Payload (encodé en Base64Url) RG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c // Signature

Les composants d'un JWT

Header

Généralement composé de deux parties : le type de token (JWT) et l'algorithme de signature utilisé (comme HMAC SHA256 ou RSA).

En-tête JWT
{ "alg": "HS256", "typ": "JWT" }

Payload

Contient les "claims" (assertions) qui sont des déclarations sur une entité (généralement l'utilisateur) et des métadonnées additionnelles.

Payload JWT
{ "sub": "1234567890", // Sujet (généralement l'identifiant de l'utilisateur) "name": "John Doe", // Données personnalisées "role": "admin", // Rôle de l'utilisateur "iat": 1516239022, // Émis à (timestamp de création) "exp": 1516242622 // Expiration (timestamp) }

Signature

Utilisée pour vérifier que l'expéditeur du JWT est bien celui qu'il prétend être et que le message n'a pas été modifié.

Calcul de la signature
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key )

Création et vérification d'un JWT

Création d'un JWT
// Création d'un JWT en Node.js const jwt = require('jsonwebtoken'); // Données à inclure dans le token (payload) const payload = { userId: "12345", role: "admin", permissions: ["read", "write", "delete"] }; // Options supplémentaires const options = { expiresIn: '2h', // Expiration après 2 heures issuer: 'votre-api.com', // Source du token audience: 'site-client.com', // Destinataire prévu subject: payload.userId.toString() // Sujet du token (généralement l'ID utilisateur) }; // Génération du token avec une clé secrète const token = jwt.sign(payload, 'votre_clé_secrète', options); console.log(token);

Voici comment vérifier un JWT reçu :

Vérification d'un JWT
// Vérification d'un JWT en Node.js avec jsonwebtoken const jwt = require('jsonwebtoken'); try { // Vérification et décodage du token const decoded = jwt.verify(token, 'votre_clé_secrète'); // Les données du payload sont maintenant disponibles console.log(decoded.userId); console.log(decoded.role); // Vérification de l'expiration const currentTime = Math.floor(Date.now() / 1000); if (decoded.exp < currentTime) { throw new Error('Token expiré'); } } catch (error) { console.error('Token invalide:', error.message); }

Utilisation dans une requête HTTP

Les JWT sont généralement utilisés dans l'en-tête d'autorisation avec le schéma "Bearer" :

Utilisation d'un JWT dans une requête
// Utilisation d'un JWT dans une requête HTTP fetch('https://api.exemple.com/donnees-protegees', { method: 'GET', headers: { 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVC...', 'Content-Type': 'application/json' } }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Erreur:', error));
Applications concrètes

Cas d'usage

Authentification

Mécanisme d'authentification sans état pour les applications web et mobiles, permettant aux utilisateurs de rester connectés sans sessions côté serveur.

Autorisation

Permet de stocker les informations d'autorisation (rôles, permissions) directement dans le token, facilitant le contrôle d'accès aux ressources.

Échange d'informations sécurisé

Transmission sécurisée de données entre services dans une architecture de microservices, garantissant l'intégrité des données.

API sans état (Stateless)

Idéal pour les architectures RESTful et les APIs sans état, permettant une meilleure scalabilité horizontale et réduisant la charge sur les bases de données.

Bonnes pratiques de sécurité

  • Utilisez des clés secrètes fortes pour la signature des tokens
  • Définissez des durées d'expiration courtes pour les tokens
  • Ne stockez pas d'informations sensibles dans le payload (qui est encodé, mais pas chiffré)
  • Utilisez HTTPS pour la transmission des tokens
  • Implémentez un mécanisme de révocation des tokens (comme une liste noire)
  • Préférez les JWT signés avec des algorithmes asymétriques (RS256) pour les environnements hautement sécurisés