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.
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 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.
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
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).
{
"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.
{
"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é.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret_key
)
Création et vérification 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 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 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));
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