Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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éthodeRôleRisque principal
GETlirefuite de données (confidentialité)
POSTcréerajout frauduleux, saturation
PUT, PATCHmodifieraltération (intégrité)
DELETEsupprimerperte 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

CodeSignificationQuand le renvoyer
200 OKsuccèslecture ou modification réussie
201 Createdressource crééePOST réussi
204 No Contentsuccès sans contenuDELETE réussi
400 Bad Requestrequête mal forméeparamètre manquant ou invalide
401 Unauthorizednon authentifiéjeton absent, invalide ou expiré
403 Forbiddenauthentifié mais non autorisél'utilisateur est identifié, mais n'a pas le droit pour cette action ou cette ressource
404 Not Foundressource inexistanteidentifiant inconnu
405 Method Not Allowedméthode non acceptée sur cette routeDELETE sur une route en lecture seule
429 Too Many Requeststrop de requêteslimitation de débit atteinte
500 Internal Server Errorerreur du serveurexception non gérée

Clé d'API, jeton, session : qui authentifie qui

MécanismeCe qu'il identifieDurée de vieExemple
Clé d'APIune application ou une organisation partenairelongue, révocablela société partenaire qui commercialise les contrats (2025, Kirassur)
Jeton d'accèsun utilisateur, pour une durée et un périmètre limitéscourte (minutes)l'assuré qui consulte son contrat via le site du partenaire
Session et cookieun utilisateur d'un site Web classiquele temps de la navigationl'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.

AssuréSite du partenaireAPI de l'assureurson navigateurson serveurcontrats1. consulter mon contrat2. clé d'API, en HTTPS3. jeton : 600 s, ce contrat4. lien + jeton, jamais la clé5. appel avec le jeton6. contrat, ou 401 si expiré
Une clé d'API pour le partenaire, un jeton temporaire pour l'assuré

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.

SolutionCe qu'elle apporteCe qu'il faut préciser
SFTP (transfert de fichiers par SSH)échanges chiffrés, authentification par clé, pas de limite de taille pratiqueun compte dédié à l'imprimeur, limité à son dossier ; jamais FTP, qui transmet tout en clair
Plateforme d'échange en HTTPSdépôt et téléchargement chiffrés par TLS, sans installation chez le destinataireauthentification du destinataire, lien qui expire, nombre de téléchargements limité, journal des accès
Chiffrement du fichier lui-mêmele fichier reste illisible même si le serveur de dépôt est compromischiffrer 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 signaturel'imprimeur vérifie que le fichier reçu est intact et vient de l'éditeurempreinte 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.

text
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0MiIsInJvbGUiOiJhc3N1cmUiLCJleHAiOjE4MDAwMDAwMDB9.<signature>
   en-tête (base64url)           charge utile (base64url)                              signature

Trois idées à retenir pour l'examen :

  1. 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.
  2. 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é.
  3. 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_token aprè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 :

js
// 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.

  1. GET /api/reservations/88 sans en-tête Authorization.
  2. DELETE /api/reservations/88 avec un jeton valide d'un client qui n'est pas titulaire de la réservation 88.
  3. POST /api/reservations avec un jeton valide, réservation créée.
  4. GET /api/reservations/9999, jeton valide, la réservation n'existe pas.
  5. DELETE /api/catalogue/3 sur l'API publique en lecture seule.
  6. GET /api/reservations/88 avec un jeton expiré depuis deux minutes.
Voir la réponseMasquer la réponse de l'exercice 1
  1. 401 : l'appelant n'est pas authentifié.
  2. 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.
  3. 201 : ressource créée.
  4. 404 : ressource inexistante.
  5. 405 : la méthode DELETE n'est pas acceptée sur cette route.
  6. 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.

  1. Pourquoi limiter la durée de validité d'un jeton ?
  2. Écris l'instruction PHP qui calcule la date limite au moment où le jeton est créé, au format Y-m-d H:i:s.
  3. É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
  1. 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.

  2. $dateHeureLimite = date('Y-m-d H:i:s', time() + 600); (10 minutes = 600 secondes).

  3. La vérification :

    php
    $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}.

  1. Quelle erreur de conception relèves-tu ?
  2. 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
  1. 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.
  2. 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.

  1. Quels risques présente la pratique actuelle ? Cite les critères de sécurité concernés.
  2. Propose une solution de transfert sécurisée, en justifiant chaque élément.
Voir la réponseMasquer la réponse de l'exercice 4
  1. 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.
  2. 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é ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Journalisation et tests de sécuritéRevoir le sommaire du cours