Aller au contenu
Réussir mon BTS SIO

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

Par exemple

Chapitre 1123 minIntermédiaire

Authentification (A07) : mots de passe, sessions, JWT et MFA

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • freiner la force brute et le credential stuffing ;
  • gérer une session côté serveur sans fixation ;
  • émettre et vérifier un JWT en évitant ses pièges ;
  • choisir entre session et JWT ;
  • concevoir une réinitialisation de mot de passe sûre.

4 exercices corrigés1 schéma

Les défaillances d'authentification (Authentication Failures, A07:2025) regroupent tout ce qui permet à un attaquant de se faire passer pour un autre utilisateur : mots de passe faibles acceptés, essais illimités, session mal gérée, jeton mal vérifié, récupération de compte fragile. Ce chapitre présente les attaques contre l'authentification et leurs parades : politique de mots de passe, limitation des tentatives, sessions côté serveur, jetons JWT, double authentification, réinitialisation de mot de passe et authentification unique (SSO).

Les attaques contre l'authentification

AttaquePrincipeParade principale
Force bruteEssayer un grand nombre de mots de passe sur un compteLimiter les tentatives, mots de passe longs
Attaque par dictionnaireEssayer les mots de passe les plus courants (123456, azerty, Gsb2026!)Refuser les mots de passe courants ou compromis
Credential stuffingRéutiliser en masse des couples identifiant/mot de passe volés sur d'autres sitesMFA, détection des connexions anormales, refus des mots de passe compromis
Password sprayingEssayer un même mot de passe courant sur beaucoup de comptes, pour rester sous le seuil de blocage de chacunLimitation par adresse IP et globale, journalisation, alertes
Hameçonnage (phishing)Faire saisir le mot de passe sur un faux siteMFA résistante à l'hameçonnage (clés d'accès)
Vol ou fixation de sessionVoler le cookie de session (XSS, réseau non chiffré) ou imposer un identifiant de session connu à la victime avant qu'elle se connecteCookie HttpOnly et Secure, nouvel identifiant de session à la connexion
Énumération des comptesDéduire qu'un identifiant existe d'après la réponse (« mot de passe incorrect » contre « compte inconnu »)Message identique dans tous les cas

Une politique de mots de passe à jour

Les règles d'hier (huit caractères, une majuscule, un chiffre, changement tous les 90 jours) produisent des mots de passe comme Gsb2026!, puis Gsb2026!! trois mois plus tard. Les recommandations actuelles misent sur la longueur et sur le refus des mots de passe connus.

La CNIL, dans sa recommandation de 2022 sur les mots de passe, raisonne en entropie, c'est-à-dire en nombre de combinaisons possibles exprimé en bits. Pour un mot de passe utilisé seul, elle retient un minimum de 80 bits, ce qui correspond par exemple à 12 caractères mêlant majuscules, minuscules, chiffres et caractères spéciaux. Quand l'accès est restreint par des mesures complémentaires (blocage temporaire après plusieurs échecs, captcha), un niveau de 50 bits peut suffire.

RèglePourquoi
Longueur minimale élevée (12 caractères ou plus), longueur maximale généreuse (au moins 64)La longueur compte plus que la complexité ; une phrase de passe est longue et mémorisable
Tous les caractères acceptés, espaces comprisNe pas empêcher les phrases de passe ni les gestionnaires de mots de passe
Refus des mots de passe courants ou présents dans des fuites connuesCe sont ceux que testent les attaquants en premier
Pas de changement périodique imposé sans raison ; changement obligatoire en cas de compromissionLe changement forcé produit des variantes prévisibles ; le NIST américain le déconseille aussi
Pas d'indice ni de question secrèteLes réponses se devinent ou se trouvent sur les réseaux sociaux
Le collage autorisé dans le champPour les gestionnaires de mots de passe

Pour vérifier qu'un mot de passe n'a pas fuité, le service Pwned Passwords de Have I Been Pwned permet une vérification sans transmettre le mot de passe : on envoie les cinq premiers caractères de son empreinte SHA-1, le service renvoie toutes les empreintes qui commencent ainsi, et la comparaison se fait localement.

Limiter les tentatives de connexion

Sans limite, un script essaie des milliers de mots de passe par minute. Plusieurs mécanismes se combinent :

  • une limite par compte : après un nombre d'échecs (par exemple 10), un délai croissant ou un blocage temporaire ;
  • une limite par adresse IP, contre le password spraying qui vise beaucoup de comptes depuis la même source ;
  • un captcha après quelques échecs ;
  • une alerte quand les échecs dépassent un seuil anormal (chapitre 12).

Avec Express, le middleware express-rate-limit limite le nombre de requêtes par client sur une fenêtre de temps :

js
import rateLimit from 'express-rate-limit';

const limiteConnexion = rateLimit({
  windowMs: 15 * 60 * 1000,   // fenêtre de 15 minutes
  limit: 10,                   // 10 tentatives par adresse IP et par fenêtre
  standardHeaders: 'draft-8',
  legacyHeaders: false,
  message: { erreur: 'Trop de tentatives, réessaie plus tard' },
});

app.post('/api/connexion', limiteConnexion, connexion);

Un blocage définitif après quelques échecs est une mauvaise idée : n'importe qui pourrait bloquer le compte du comptable la veille de la clôture, ce qui est un déni de service. On préfère un blocage temporaire qui s'allonge, et une alerte.

Contre l'énumération des comptes, la réponse est la même dans tous les cas d'échec, et elle prend le même temps :

js
const [lignes] = await pool.execute('SELECT id, role, mdp_hash FROM utilisateur WHERE login = ? AND actif = 1', [login]);
const utilisateur = lignes[0];
// Même si le compte n'existe pas, on fait une vérification : le temps de réponse ne trahit rien
const valide = await argon2.verify(utilisateur?.mdp_hash ?? HASH_FACTICE, mdp);
if (!utilisateur || !valide) {
  journaliser('connexion', login, req.ip, 'echec');
  return res.status(401).json({ erreur: 'Identifiant ou mot de passe incorrect' });
}

HASH_FACTICE est une empreinte Argon2id calculée une fois au démarrage, pour que la vérification dure autant qu'avec un vrai compte.

Les sessions côté serveur

Avec une session, le serveur garde l'état de la connexion (qui est connecté, avec quel rôle) dans un stockage qui lui appartient : fichiers, base de données, Redis. Le navigateur ne reçoit qu'un identifiant de session aléatoire, dans un cookie. C'est le fonctionnement par défaut de PHP ($_SESSION) et d'express-session.

Les règles :

  1. Changer d'identifiant à la connexion. Sinon, un attaquant qui a imposé un identifiant à la victime avant qu'elle se connecte (fixation de session) se retrouve connecté avec elle.
  2. Protéger le cookie : Secure, HttpOnly, SameSite (attributs des cookies).
  3. Expirer : après une période d'inactivité (par exemple 30 minutes pour une application de gestion) et après une durée maximale absolue.
  4. Détruire la session à la déconnexion, côté serveur, pas seulement le cookie.
  5. Redemander le mot de passe avant une action sensible (changer d'adresse mail ou de mot de passe, consulter un RIB).
php
// Connexion réussie
session_regenerate_id(true);           // nouvel identifiant, l'ancien est supprimé
$_SESSION['id'] = $utilisateur['id'];
$_SESSION['role'] = $utilisateur['role'];
$_SESSION['derniere_activite'] = time();

// À chaque requête : expiration après 30 minutes d'inactivité
if (time() - ($_SESSION['derniere_activite'] ?? 0) > 1800) {
    session_unset();
    session_destroy();
    http_response_code(401);
    exit;
}
$_SESSION['derniere_activite'] = time();

// Déconnexion
$_SESSION = [];
session_destroy();

Avec express-session, req.session.regenerate() crée le nouvel identifiant après la vérification du mot de passe, et req.session.destroy() termine la session. Le cours PHP et MySQL détaille les sessions et les cookies en PHP et le circuit d'inscription et de connexion.

JWT : fonctionnement et pièges

Un JWT (JSON Web Token) est un jeton qui contient lui-même les informations sur l'utilisateur, signées par le serveur. Le serveur n'a rien à stocker : à chaque requête, il vérifie la signature et lit le contenu. C'est le mode d'authentification courant des API REST, et celui de la version Node.js d'AppliFrais.

Un JWT est formé de trois parties encodées en Base64URL et séparées par des points : l'en-tête (l'algorithme de signature), la charge utile (les informations, appelées claims) et la signature.

text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsInJvbGUiOiJ2aXNpdGV1ciIsImlhdCI6MTc3MzMwNjAwMCwiZXhwIjoxNzczMzA2OTAwfQ.HZsnhRiNap-wV-wtmQEkETW9XOyyfJVrDDdvQw9wIyg

Décodées, les deux premières parties donnent :

json
{ "alg": "HS256", "typ": "JWT" }
{ "sub": "42", "role": "visiteur", "iat": 1773306000, "exp": 1773306900 }

sub (subject) est l'identifiant de l'utilisateur, iat (issued at) la date d'émission et exp la date d'expiration, en secondes depuis le 1er janvier 1970 : ici, émis le 12 mars 2026 à 9 h 00 UTC, il expire 15 minutes plus tard. La signature est un HMAC-SHA256 des deux premières parties, calculé avec un secret que seul le serveur connaît.

en-têtealg: HS256typ: JWT.charge utilesub: 42, role: visiteurexp: dans 15 minutes.signatureHMAC-SHA256calculée avec le secretlisible par tous (Base64URL), pas chiffréempêche toute modificationClientServeur1. POST /api/connexion (identifiant, mot de passe)2. vérifie, puis signe le jetonjeton JWT, valable 15 minutes3. Authorization: Bearer <jeton>, à chaque requête4. vérifie signature, algorithme, expréponse si le jeton est valide, 401 sinon
Un JWT est signé, pas chiffré : tout le monde peut le lire, personne ne peut le modifier sans le secret

Avec la bibliothèque jsonwebtoken :

js
import jwt from 'jsonwebtoken';

// À la connexion
const jeton = jwt.sign(
  { sub: String(utilisateur.id), role: utilisateur.role },
  process.env.JWT_SECRET,
  { algorithm: 'HS256', expiresIn: '15m' }
);

// Middleware de vérification
function authentifier(req, res, next) {
  const [type, jeton] = (req.get('Authorization') ?? '').split(' ');
  if (type !== 'Bearer' || !jeton) return res.status(401).json({ erreur: 'Authentification requise' });
  try {
    const charge = jwt.verify(jeton, process.env.JWT_SECRET, { algorithms: ['HS256'] });
    req.utilisateur = { id: Number(charge.sub), role: charge.role };
    next();
  } catch {
    return res.status(401).json({ erreur: 'Jeton invalide ou expiré' });   // échec : on refuse
  }
}

Les pièges classiques :

PiègeConséquenceBonne pratique
Décoder sans vérifier (jwt.decode au lieu de jwt.verify)N'importe qui forge un jeton administrateurToujours vérifier la signature
Accepter l'algorithme indiqué par le jeton, dont noneUn jeton non signé, ou signé avec une clé publique utilisée comme secret, est acceptéImposer la liste des algorithmes acceptés (algorithms: ['HS256'])
Secret faible (secret, jwt, le nom de l'application)Le secret se retrouve par force brute à partir d'un seul jeton, puis l'attaquant signe ce qu'il veutSecret aléatoire d'au moins 256 bits, stocké hors du code
Pas d'expiration, ou une expiration de plusieurs joursUn jeton volé reste utilisable longtempsJeton d'accès court (5 à 15 minutes) et jeton de rafraîchissement
Données sensibles dans la charge utileElles sont lisibles par tousSeulement un identifiant et un rôle
Jeton dans localStorageLisible par tout script injecté (XSS)Mémoire du front, ou cookie HttpOnly avec protection anti-CSRF

La révocation. Un JWT reste valide jusqu'à son expiration, même si l'utilisateur se déconnecte ou si son compte est désactivé : le serveur ne garde aucune trace des jetons émis. D'où le couple habituel : un jeton d'accès très court, et un jeton de rafraîchissement plus long, stocké côté serveur (donc révocable), envoyé dans un cookie HttpOnly; Secure; SameSite=Strict, qui sert seulement à obtenir un nouveau jeton d'accès. À chaque utilisation, le jeton de rafraîchissement est remplacé par un nouveau (rotation) ; la réutilisation d'un ancien trahit un vol et révoque toute la chaîne.

Le cours Node.js et Express montre la mise en place complète d'une authentification JWT, et le cours React où le front garde la session.

Session ou JWT : que choisir ?

CritèreSession côté serveurJWT
Où est l'étatSur le serveurDans le jeton, chez le client
RévocationImmédiate : on supprime la sessionDifficile avant l'expiration ; il faut une liste de révocation ou un jeton court
Montée en charge sur plusieurs serveursStockage de sessions partagé nécessaire (Redis, base)Simple : chaque serveur vérifie la signature
Exposition à la CSRFOui (cookie) : SameSite et jeton anti-CSRFNon si le jeton est envoyé dans l'en-tête Authorization ; oui s'il est dans un cookie
Exposition au vol par XSSFaible si le cookie est HttpOnlyÉlevée si le jeton est dans localStorage
Usage typiqueApplication web classique, rendue côté serveur (PHP, Symfony, Laravel)API consommée par une application mobile, un front séparé ou d'autres services

Aucune solution n'est « plus sûre » dans l'absolu : la session est plus simple à bien faire pour une application web classique, le JWT s'impose quand plusieurs clients ou plusieurs services consomment la même API.

Double authentification : TOTP, clés d'accès, SMS

L'authentification multifacteur (MFA), ou à deux facteurs (2FA), combine au moins deux facteurs de natures différentes :

FacteurExemples
Ce que je sais (connaissance)Mot de passe, code PIN
Ce que je possède (possession)Téléphone, clé de sécurité physique, carte
Ce que je suis (inhérence)Empreinte digitale, visage

Deux mots de passe ne font pas une MFA : ce sont deux facteurs de la même nature.

MéthodeFonctionnementRésistance
Code par SMSUn code envoyé au numéro de l'utilisateurLa plus faible : détournement de numéro (SIM swapping), interception ; mieux que rien
Code TOTPUne application (Google Authenticator, Microsoft Authenticator, FreeOTP…) calcule un code à 6 chiffres qui change toutes les 30 secondes, à partir d'un secret partagé à l'enrôlement (RFC 6238)Bonne, mais un faux site peut demander le code et le rejouer aussitôt
Notification sur le téléphoneL'utilisateur approuve la connexion dans une applicationBonne, si l'application affiche un code de correspondance (sinon, l'utilisateur lassé par des demandes répétées finit par accepter)
Clé d'accès (passkey, standard FIDO2/WebAuthn)Une paire de clés créée par l'appareil pour ce site ; la clé privée ne quitte jamais l'appareil, débloquée par le visage, l'empreinte ou le code de l'appareilLa meilleure : la clé est liée au vrai nom de domaine, un faux site ne peut rien en tirer ; résistante à l'hameçonnage

Pour AppliFrais, la MFA est indispensable sur les comptes comptable et administrateur, qui déclenchent des paiements et gèrent les droits.

Réinitialiser un mot de passe sans faille

La fonction « mot de passe oublié » est une porte d'entrée vers chaque compte : elle doit être aussi solide que la connexion. Les mauvaises pratiques : renvoyer le mot de passe par mail (il est donc stocké en clair ou chiffré, ce qui est une faille en soi), envoyer un nouveau mot de passe en clair, utiliser une question secrète.

Le processus recommandé, attendu dans le sujet E7 SLAM 2025 (corrigé, dossier D) :

  1. L'utilisateur saisit son adresse mail. La page répond toujours « Si un compte correspond, un mail a été envoyé », pour ne pas révéler quels comptes existent.
  2. Le serveur génère un jeton aléatoire long (random_bytes(32)), en stocke l'empreinte en base avec une expiration courte (15 à 30 minutes) et l'état « non utilisé ».
  3. Il envoie par mail un lien qui contient le jeton en clair : https://frais.gsb.fr/reinitialiser?jeton=….
  4. Au clic, le serveur retrouve l'empreinte, vérifie qu'elle existe, n'a pas expiré et n'a pas servi. L'utilisateur choisit lui-même son nouveau mot de passe, qui est haché.
  5. Le jeton est invalidé, les sessions ouvertes du compte sont fermées, et un mail confirme le changement (sans mot de passe), pour que le vrai titulaire réagisse s'il n'est pas à l'origine de la demande.
  6. Les demandes sont limitées par compte et par adresse IP.
php
// Étape 2 : création du jeton
$jeton = bin2hex(random_bytes(32));
$stmt = $pdo->prepare('INSERT INTO reinit_mdp (id_utilisateur, jeton_hash, expire_le) VALUES (?, ?, NOW() + INTERVAL 30 MINUTE)');
$stmt->execute([$idUtilisateur, hash('sha256', $jeton)]);
// envoi du lien contenant $jeton par mail

// Étape 4 : vérification
$stmt = $pdo->prepare('SELECT id, id_utilisateur FROM reinit_mdp WHERE jeton_hash = ? AND expire_le > NOW() AND utilise = 0');
$stmt->execute([hash('sha256', $_GET['jeton'] ?? '')]);
$demande = $stmt->fetch();
if ($demande === false) {
    exit('Lien invalide ou expiré');
}

Stocker l'empreinte plutôt que le jeton protège les demandes en cours si la table fuite.

SSO, OAuth 2.0 et OpenID Connect en bref

Avec l'authentification unique (SSO, Single Sign-On), l'utilisateur s'authentifie une seule fois auprès d'un fournisseur d'identité (Microsoft Entra ID, Keycloak, Google…) et accède ensuite à plusieurs applications sans ressaisir son mot de passe. Les applications ne voient jamais le mot de passe : elles reçoivent du fournisseur un jeton signé qui atteste de l'identité.

  • OAuth 2.0 est un protocole de délégation d'autorisation : il permet à une application d'obtenir un jeton d'accès pour appeler une API au nom de l'utilisateur, avec des droits limités (scopes).
  • OpenID Connect (OIDC) ajoute à OAuth 2.0 la couche d'authentification : un jeton d'identité (un JWT) qui dit qui est l'utilisateur.
  • Pour une application web ou mobile, le flux recommandé est le code d'autorisation avec PKCE.

Le SSO améliore la sécurité (un seul endroit à protéger par la MFA, un seul compte à désactiver au départ d'un salarié) mais concentre le risque : le compte SSO compromis ouvre toutes les applications. Le sujet E6 SLAM 2024 (aujourd'hui E7) portait sur la mise en place d'un SSO, avec l'analyse d'une erreur invalid_token (corrigé du sujet 2024).

Exercice 1 sur 4 Décoder un JWT Réussi À revoir

Voici la charge utile décodée d'un jeton reçu par l'API : { "sub": "17", "role": "visiteur", "iat": 1773306000, "exp": 1773306900 }.

  1. Combien de temps ce jeton est-il valide ?
  2. Un visiteur modifie la charge utile pour écrire "role": "comptable", réencode la partie en Base64URL et envoie le jeton. Que doit-il se passer, et pourquoi ?
  3. Dans quel cas l'attaque réussit-elle quand même ?
  4. Le développeur veut ajouter l'IBAN du visiteur dans le jeton « pour éviter une requête ». Qu'en penses-tu ?
Voir la réponseMasquer la réponse de l'exercice 1
  1. exp - iat = 1 773 306 900 − 1 773 306 000 = 900 secondes, soit 15 minutes.
  2. Le serveur doit refuser le jeton (401) : la signature a été calculée sur la charge utile d'origine ; elle ne correspond plus à la charge modifiée, et le visiteur ne peut pas recalculer une signature valide sans le secret.
  3. Si le serveur ne vérifie pas la signature (jwt.decode au lieu de jwt.verify), s'il accepte l'algorithme none, ou si le secret est faible et a été retrouvé par force brute. Dans ces trois cas, l'attaquant devient comptable.
  4. C'est une erreur : la charge utile d'un JWT est lisible par tous (simple Base64URL), et le jeton circule à chaque requête, transite par des journaux, des proxys et le stockage du navigateur. L'IBAN serait exposé. Un JWT ne contient que l'identifiant et le rôle.

Tu avais trouvé ?

Exercice 2 sur 4 Corriger une connexion Réussi À revoir

Repère les défauts de cette route de connexion et réécris-la.

js
app.post('/api/connexion', async (req, res) => {
  const [lignes] = await pool.execute('SELECT * FROM utilisateur WHERE login = ?', [req.body.login]);
  if (lignes.length === 0) return res.status(404).json({ erreur: 'Utilisateur inconnu' });
  if (lignes[0].mdp !== req.body.mdp) return res.status(401).json({ erreur: 'Mot de passe incorrect' });
  const jeton = jwt.sign({ id: lignes[0].id, role: lignes[0].role, email: lignes[0].email }, 'gsb');
  res.json({ jeton });
});
Voir la réponseMasquer la réponse de l'exercice 2

Défauts : mots de passe stockés et comparés en clair (A04) ; messages différents selon que le compte existe ou non (énumération) ; aucune limite de tentatives (force brute) ; secret JWT faible et écrit dans le code ; pas d'expiration du jeton ; données inutiles dans le jeton ; pas de vérification que le compte est actif ; aucune journalisation.

js
app.post('/api/connexion', limiteConnexion, async (req, res) => {
  const { login, mdp } = req.body;
  if (typeof login !== 'string' || typeof mdp !== 'string') return res.status(400).end();
  const [lignes] = await pool.execute(
    'SELECT id, role, mdp_hash FROM utilisateur WHERE login = ? AND actif = 1', [login]);
  const utilisateur = lignes[0];
  const valide = await argon2.verify(utilisateur?.mdp_hash ?? HASH_FACTICE, mdp);
  if (!utilisateur || !valide) {
    journaliser('connexion', login, req.ip, 'echec');
    return res.status(401).json({ erreur: 'Identifiant ou mot de passe incorrect' });
  }
  journaliser('connexion', login, req.ip, 'succes');
  const jeton = jwt.sign({ sub: String(utilisateur.id), role: utilisateur.role },
    process.env.JWT_SECRET, { algorithm: 'HS256', expiresIn: '15m' });
  res.json({ jeton });
});

Tu avais trouvé ?

Exercice 3 sur 4 Réinitialisation de mot de passe Réussi À revoir

Une application propose : « Mot de passe oublié ? Saisissez votre identifiant, nous vous envoyons votre mot de passe par mail. »

  1. Qu'apprend-on sur la façon dont les mots de passe sont stockés ?
  2. Cite deux autres problèmes de ce processus.
  3. Décris le processus sécurisé en cinq étapes.
Voir la réponseMasquer la réponse de l'exercice 3
  1. Si l'application peut renvoyer le mot de passe, c'est qu'elle le stocke en clair ou chiffré de façon réversible. C'est déjà une faille grave : il devrait être haché, donc impossible à retrouver.
  2. Le mot de passe voyage en clair par mail (stocké sur des serveurs, lisible si la boîte est compromise) ; quiconque connaît l'identifiant déclenche l'envoi, et si la boîte mail est compromise, le compte l'est aussi ; aucune limite ni expiration ; la page peut révéler quels identifiants existent.
  3. (1) L'utilisateur saisit son adresse, la réponse est la même que le compte existe ou non ; (2) le serveur génère un jeton aléatoire, stocke son empreinte avec une expiration de 15 à 30 minutes ; (3) il envoie un lien à usage unique contenant le jeton ; (4) l'utilisateur choisit un nouveau mot de passe, haché avec Argon2id ou bcrypt ; (5) le jeton est invalidé, les sessions ouvertes sont fermées et un mail de confirmation est envoyé. Les demandes sont limitées, et la MFA peut être exigée pour les comptes sensibles.

Tu avais trouvé ?

Exercice 4 sur 4 Facteurs d'authentification Réussi À revoir

Pour chaque combinaison, dis s'il s'agit d'une authentification multifacteur.

  1. Un mot de passe et la réponse à une question secrète.
  2. Un mot de passe et un code TOTP affiché par une application sur le téléphone.
  3. Une carte à puce et son code PIN.
  4. Une empreinte digitale qui débloque une clé d'accès stockée dans le téléphone.
Voir la réponseMasquer la réponse de l'exercice 4
  1. Non : deux facteurs de connaissance.
  2. Oui : connaissance (mot de passe) et possession (le téléphone qui détient le secret TOTP).
  3. Oui : possession (la carte) et connaissance (le PIN).
  4. Oui : inhérence (l'empreinte) et possession (le téléphone qui détient la clé privée). C'est le principe des clés d'accès : l'empreinte ne quitte pas l'appareil, elle sert seulement à débloquer la clé.

Tu avais trouvé ?

Pour aller plus loin. Le cours Authentification et habilitations va plus loin sur la MFA, les passkeys, les sessions et JWT et OAuth 2.0 et OpenID Connect.

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 (A09) et gestion des erreurs (A10) : analyser les logsRevoir le sommaire du cours