Chapitre 815 minIntermédiaire
API, jetons et authentification
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- renvoyer le bon code de statut HTTP, notamment 401 ou 403 ;
- choisir entre clé d'API, jeton et session ;
- vérifier un JWT et justifier sa durée de validité ;
- contrôler les droits dans l'API elle-même ;
- choisir une solution de transfert de fichier sécurisée.
4 exercices corrigés1 schéma
Les questions d'API et d'authentification portent sur l'ouverture d'une application à d'autres : des partenaires, une application mobile, un front Web. Elles demandent de choisir comment authentifier l'appelant (clé d'API, jeton, session), de protéger les échanges (HTTPS), de contrôler les droits dans l'API elle-même et de renvoyer le bon code de statut HTTP. Ce chapitre donne ces notions et les raisonnements attendus dans les sujets 2024 (GSIC), 2025 (Casterman, Kirassur).
Une API REST en quelques lignes
Une API REST expose des ressources (des contrats, des factures) à des adresses (/api/contrats/42) et s'utilise avec les méthodes du protocole HTTP. Chaque méthode a un rôle et un niveau de risque.
| Méthode | Rôle | Risque principal |
|---|---|---|
GET | lire | fuite de données (confidentialité) |
POST | créer | ajout frauduleux, saturation |
PUT, PATCH | modifier | altération (intégrité) |
DELETE | supprimer | perte de données (intégrité, disponibilité) |
Les méthodes qui modifient ou suppriment sont les plus dangereuses pour l'intégrité : en 2025, le sujet Casterman faisait expliquer pourquoi DELETE et PUT exigent un contrôle d'autorisation, puis ajouter ce contrôle dans la méthode delete de l'API. La réponse est dans le corrigé du sujet Casterman.
Les codes de statut à connaître
| Code | Signification | Quand le renvoyer |
|---|---|---|
| 200 OK | succès | lecture ou modification réussie |
| 201 Created | ressource créée | POST réussi |
| 204 No Content | succès sans contenu | DELETE réussi |
| 400 Bad Request | requête mal formée | paramètre manquant ou invalide |
| 401 Unauthorized | non authentifié | jeton absent, invalide ou expiré |
| 403 Forbidden | authentifié mais non autorisé | l'utilisateur est identifié, mais n'a pas le droit pour cette action ou cette ressource |
| 404 Not Found | ressource inexistante | identifiant inconnu |
| 405 Method Not Allowed | méthode non acceptée sur cette route | DELETE sur une route en lecture seule |
| 429 Too Many Requests | trop de requêtes | limitation de débit atteinte |
| 500 Internal Server Error | erreur du serveur | exception non gérée |
Clé d'API, jeton, session : qui authentifie qui
| Mécanisme | Ce qu'il identifie | Durée de vie | Exemple |
|---|---|---|---|
| Clé d'API | une application ou une organisation partenaire | longue, révocable | la société partenaire qui commercialise les contrats (2025, Kirassur) |
| Jeton d'accès | un utilisateur, pour une durée et un périmètre limités | courte (minutes) | l'assuré qui consulte son contrat via le site du partenaire |
| Session et cookie | un utilisateur d'un site Web classique | le temps de la navigation | l'espace client d'un site PHP |
Le sujet Kirassur combinait les deux premiers : la société partenaire s'authentifie avec sa clé d'API pour obtenir un jeton temporaire au nom d'un assuré, et l'assuré utilise ce jeton.
Pourquoi ne pas donner la clé d'API à l'assuré, même en HTTPS ? Parce que HTTPS protège le transport, pas ce que le destinataire fait de la clé. La clé est permanente et donne accès à toutes les interfaces du partenaire, pour tous ses clients : remise à un assuré, elle peut être copiée, publiée ou réutilisée pour consulter les contrats des autres. Le jeton applique le moindre privilège : un seul utilisateur, un seul périmètre, quelques minutes.
HTTPS : ce qu'il protège
En HTTP, les échanges circulent en clair : quiconque se place sur le chemin (Wi-Fi public, équipement compromis) peut les lire et les modifier. C'est une attaque de l'homme du milieu : vol de la clé d'API ou du jeton, puis usurpation de l'appelant. HTTPS ajoute la couche TLS, qui apporte trois garanties :
- la confidentialité : les échanges sont chiffrés ;
- l'intégrité : toute modification en transit est détectée ;
- l'authentification du serveur : son certificat, signé par une autorité de certification, prouve que tu parles bien au vrai serveur.
Utilise TLS 1.2 au minimum, TLS 1.3 de préférence ; les versions 1.0 et 1.1 sont abandonnées.
Transférer un fichier volumineux en sécurité
Transférer un fichier en sécurité, c'est garantir qu'il n'est lu que par son destinataire (confidentialité), qu'il arrive sans modification (intégrité) et qu'il vient bien de l'expéditeur (authenticité). Le sujet 2025 (cas Casterman, question B3.3) demandait une solution « sécurisée et adaptée à la taille des fichiers » pour envoyer à un imprimeur sous-traitant un PDF de 2 Go, trop lourd pour un courriel.
| Solution | Ce qu'elle apporte | Ce qu'il faut préciser |
|---|---|---|
| SFTP (transfert de fichiers par SSH) | échanges chiffrés, authentification par clé, pas de limite de taille pratique | un compte dédié à l'imprimeur, limité à son dossier ; jamais FTP, qui transmet tout en clair |
| Plateforme d'échange en HTTPS | dépôt et téléchargement chiffrés par TLS, sans installation chez le destinataire | authentification du destinataire, lien qui expire, nombre de téléchargements limité, journal des accès |
| Chiffrement du fichier lui-même | le fichier reste illisible même si le serveur de dépôt est compromis | chiffrer avec la clé publique GPG de l'imprimeur, ou une archive chiffrée en AES-256 dont le mot de passe passe par un autre canal |
| Empreinte ou signature | l'imprimeur vérifie que le fichier reçu est intact et vient de l'éditeur | empreinte SHA-256 comparée à l'arrivée, ou signature GPG de l'éditeur (le sujet en prévoyait une) |
Réponse modèle :
« Un serveur SFTP hébergé par Casterman, avec un compte réservé à l'imprimeur, authentifié par clé et limité à un dossier de dépôt. Le transfert est chiffré par SSH, ce qui garantit la confidentialité, et la taille du fichier ne pose pas de problème. L'imprimeur vérifie ensuite la signature GPG du PDF avec la clé publique de l'éditeur : il s'assure ainsi que le fichier est intact et que c'est bien la version finale. »
Les jetons JWT
Un JWT (JSON Web Token) est un jeton en trois parties séparées par des points : un en-tête (l'algorithme de signature), une charge utile (les informations sur l'utilisateur et la date d'expiration exp) et une signature calculée avec une clé secrète du serveur.
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0MiIsInJvbGUiOiJhc3N1cmUiLCJleHAiOjE4MDAwMDAwMDB9.<signature>
en-tête (base64url) charge utile (base64url) signature
Trois idées à retenir pour l'examen :
- La charge utile n'est pas chiffrée, seulement encodée en base64url : n'importe qui peut la lire. On n'y met jamais de mot de passe ni de donnée sensible.
- La signature garantit l'intégrité : si un utilisateur change
"role":"assure"en"role":"admin", la signature ne correspond plus. À condition que le serveur vérifie la signature, avec un algorithme imposé, et refuse un jeton expiré. - Un jeton d'accès vit peu de temps (quelques minutes), un jeton de rafraîchissement plus longtemps : il sert à obtenir un nouveau jeton d'accès sans redemander le mot de passe. Une erreur
invalid_tokenaprès une pause signale typiquement un jeton d'accès expiré : le client doit utiliser son jeton de rafraîchissement.
En Node.js, avec la bibliothèque jsonwebtoken :
// middleware Express : refuse toute requête sans jeton valide
const jwt = require('jsonwebtoken');
function exigerJeton(req, res, next) {
const entete = req.headers.authorization ?? '';
const jeton = entete.startsWith('Bearer ') ? entete.slice(7) : null;
if (!jeton) return res.status(401).json({ erreur: 'Jeton manquant' });
try {
// verify contrôle la signature ET l'expiration ; decode ne contrôle rien
req.utilisateur = jwt.verify(jeton, process.env.JWT_SECRET, { algorithms: ['HS256'] });
next();
} catch {
return res.status(401).json({ erreur: 'Jeton invalide ou expiré' });
}
}
Authentification unique et multifacteur
L'authentification unique (SSO, single sign-on) permet de s'authentifier une fois auprès d'un fournisseur d'identité pour accéder à plusieurs applications. Le protocole le plus répandu est OpenID Connect, construit sur OAuth 2.0 : le fournisseur d'identité délivre un jeton d'identité (au format JWT) et un jeton d'accès. Le sujet 2024 (cas GSIC) portait sur sa mise en place.
Avantages pour la sécurité : un seul mot de passe à protéger, une politique de mots de passe centralisée, une désactivation immédiate de tous les accès au départ d'un salarié. Inconvénient : le compte SSO devient une cible de grande valeur, d'où l'authentification multifacteur (MFA), qui combine au moins deux facteurs de natures différentes :
- ce que l'on sait : un mot de passe, un code PIN ;
- ce que l'on possède : un téléphone qui génère un code temporaire, une clé de sécurité physique ;
- ce que l'on est : une empreinte digitale, la reconnaissance faciale.
Un mot de passe et une question secrète sont deux facteurs de la même nature : ce n'est pas du multifacteur. Les données biométriques servant à identifier une personne sont des données sensibles au sens de l'article 9 du RGPD, ce que le sujet 2024 faisait relever pour une authentification biométrique sur mobile.
Contrôler les droits dans l'API
L'authentification dit qui appelle ; l'autorisation dit ce qu'il a le droit de faire. Une API doit vérifier les deux elle-même, à chaque requête : une API est joignable sans passer par l'application qui l'utilise, avec Postman ou un simple curl.
Le sujet Kirassur montrait un journal de serveur Web où un partenaire, avec sa clé valide, consultait des contrats en incrémentant leur numéro. Les réponses attendues :
- le diagnostic : l'API vérifie la clé (authentification) mais pas que le contrat demandé appartient au partenaire (autorisation). C'est un contrôle d'accès défaillant ;
- la correction, sans coder : à chaque requête, vérifier que le contrat est rattaché au partenaire titulaire de la clé et renvoyer 403 sinon ; utiliser des identifiants non prévisibles (UUID) en défense complémentaire ; limiter le nombre de requêtes par clé ;
- la parade réseau : bloquer l'adresse IP sur le pare-feu, ou utiliser un outil qui bannit automatiquement une adresse au comportement anormal à partir des journaux (comme fail2ban), ou un pare-feu applicatif (WAF).
Une dernière idée, posée en 2025 (Casterman) : pour publier un catalogue en lecture, il vaut mieux créer une API publique séparée en lecture seule que d'ouvrir l'API authentifiée existante. Les routes de modification n'existent tout simplement pas dans l'API publique : la surface d'attaque est réduite, et une faille dans l'API publique ne permet aucune écriture.
Le cours Node.js et Express montre l'authentification par JWT et les middlewares de contrôle dans une application complète.
Pour aller plus loin. Le cours Authentification détaille les sessions et JWT, OAuth 2.0 et OpenID Connect et la MFA ; le chapitre Sécuriser une API REST du cours Sécurité applicative et le chapitre TLS 1.3 et HTTPS complètent ce chapitre.
Exercices
Exercice 1 sur 4 Le bon code de statut Réussi À revoir
Une API de gestion de réservations reçoit les requêtes suivantes. Donne le code de statut à renvoyer.
GET /api/reservations/88sans en-têteAuthorization.DELETE /api/reservations/88avec un jeton valide d'un client qui n'est pas titulaire de la réservation 88.POST /api/reservationsavec un jeton valide, réservation créée.GET /api/reservations/9999, jeton valide, la réservation n'existe pas.DELETE /api/catalogue/3sur l'API publique en lecture seule.GET /api/reservations/88avec un jeton expiré depuis deux minutes.
Voir la réponseMasquer la réponse de l'exercice 1
- 401 : l'appelant n'est pas authentifié.
- 403 : il est authentifié, mais n'a pas le droit sur cette réservation. Certaines API renvoient 404 pour ne pas révéler l'existence de la ressource ; 403 est la réponse attendue à l'examen.
- 201 : ressource créée.
- 404 : ressource inexistante.
- 405 : la méthode
DELETEn'est pas acceptée sur cette route. - 401 : un jeton expiré n'authentifie plus ; le client doit en obtenir un nouveau, par exemple avec son jeton de rafraîchissement.
Tu avais trouvé ?
Exercice 2 sur 4 Contrôler l'expiration d'un jeton Réussi À revoir
Dans une API PHP, la table Jeton (valeur, idAssure, dateHeureLimite) stocke chaque jeton avec sa date limite de validité. Un jeton vaut 10 minutes.
- Pourquoi limiter la durée de validité d'un jeton ?
- Écris l'instruction PHP qui calcule la date limite au moment où le jeton est créé, au format
Y-m-d H:i:s. - Écris la requête préparée qui vérifie qu'un jeton reçu est encore valide.
Voir la réponseMasquer la réponse de l'exercice 2
-
Un jeton volé (copie d'un lien, historique de navigation, journal mal protégé) ne sert que quelques minutes : la fenêtre d'usurpation est réduite. Le jeton expire aussi si l'utilisateur oublie de se déconnecter.
-
$dateHeureLimite = date('Y-m-d H:i:s', time() + 600);(10 minutes = 600 secondes). -
La vérification :
$stmt = $pdo->prepare("SELECT idAssure FROM Jeton WHERE valeur = :valeur AND dateHeureLimite > NOW()"); $stmt->execute([':valeur' => $jetonRecu]); $ligne = $stmt->fetch(PDO::FETCH_ASSOC); if (!$ligne) { http_response_code(401); exit; }Le serveur PHP et le serveur MySQL doivent être réglés sur le même fuseau horaire, sinon la comparaison est faussée.
Tu avais trouvé ?
Exercice 3 sur 4 Lire un JWT Réussi À revoir
Un développeur colle dans un outil en ligne ce jeton reçu par l'application mobile : sa charge utile décodée est {"sub":"1187","email":"l.roux@exemple.fr","role":"client","mdp":"Soleil2027","exp":1806000000}.
- Quelle erreur de conception relèves-tu ?
- Un client modifie
"role":"client"en"role":"admin"et renvoie le jeton. Que doit-il se passer, et à quelle condition ?
Voir la réponseMasquer la réponse de l'exercice 3
- Le mot de passe figure en clair dans la charge utile, qui n'est pas chiffrée : quiconque intercepte ou lit le jeton (journal, appareil, outil en ligne) le récupère. L'adresse électronique est aussi une donnée personnelle inutile ici (minimisation). La charge utile doit se limiter à l'identifiant, au rôle et à l'expiration.
- Le serveur doit rejeter le jeton avec une erreur 401 : la signature ne correspond plus à la charge utile modifiée. Cela suppose que le serveur vérifie la signature (par exemple
jwt.verify, avec un algorithme imposé) au lieu de simplement décoder le jeton.
Tu avais trouvé ?
Exercice 4 sur 4 Envoyer des pièces comptables Réussi À revoir
Chaque mois, un cabinet comptable envoie à un commissaire aux comptes une archive de 5 Go contenant des pièces comptables et des bulletins de paie. Aujourd'hui, une secrétaire la dépose sur un service de stockage en ligne gratuit et envoie le lien public par courriel.
- Quels risques présente la pratique actuelle ? Cite les critères de sécurité concernés.
- Propose une solution de transfert sécurisée, en justifiant chaque élément.
Voir la réponseMasquer la réponse de l'exercice 4
- Le lien public permet à toute personne qui l'obtient (courriel transféré, boîte piratée, lien deviné ou indexé) de télécharger l'archive : atteinte à la confidentialité de données personnelles, dont les salaires. Rien ne garantit que l'archive reçue est celle envoyée (intégrité), et le service gratuit n'offre aucune garantie contractuelle, ce qui pose aussi un problème de sous-traitance au sens du RGPD.
- Par exemple :
- un serveur SFTP ou une plateforme d'échange en HTTPS maîtrisée par le cabinet, avec un compte nominatif pour le commissaire aux comptes : échanges chiffrés, accès authentifié ;
- des liens ou accès qui expirent après le téléchargement : la fenêtre d'exposition est réduite ;
- l'archive chiffrée (AES-256 ou GPG avec la clé publique du destinataire), le secret étant transmis par un autre canal : le fichier reste protégé même si le serveur est compromis ;
- une empreinte SHA-256 communiquée à part et vérifiée à l'arrivée : l'intégrité est contrôlée ;
- un journal des dépôts et des téléchargements : la traçabilité est assurée.
Tu avais trouvé ?