Le fonctionnement de la connexion — authentification, session et Cookie

Cet article fait partie du cours Les bases de l'informatique, qui construit depuis zéro les connaissances informatiques pratiques indispensables pour programmer et faire du vibe coding.
La fonction de connexion se compose de l'authentification, qui vérifie que l'utilisateur est bien celui qu'il prétend être, et de la session, qui permet ensuite au serveur de continuer à reconnaître cette même personne. Les schémas montrent le rôle du hachage et celui du Cookie.

Cet article traite du fonctionnement de la connexion.

La connexion se compose de deux mécanismes : l'un vérifie que l'utilisateur est bien celui qu'il prétend être, l'autre permet de continuer à reconnaître cette même personne ensuite.

« Hachage », « authentification par session » et « JWT » désignent une seule et même fonction de connexion, nommée différemment selon le contexte.

La connexion repose sur deux mécanismes
tanakase connecteVérifierl'identitéReconnaîtrela même personneComparer leshachagesID de sessiondans le Cookie
La connexion unique de gauche se divise vers le haut et vers le bas. En haut, la vérification faite une seule fois au début ; en bas, celle faite à chaque requête ensuite. La colonne de droite donne les termes traités dans cet article.

La branche du haut est la vérification faite une seule fois ; celle du bas, la vérification faite à chaque requête ensuite.

L'authentification vérifie qui tu es, l'autorisation décide ce que tu peux faire

L'authentification (authentication ; vérifier que l'utilisateur est bien celui qu'il prétend être) est la décision prise au moment de la connexion.

L'autorisation (authorization ; décider ce que l'utilisateur vérifié a le droit de faire) est une autre décision, prise ensuite.

Les deux décisions que le serveur prend au cours d'une seule requête de suppression de réservation
Une requête : « supprimer cette réservation »
1re décision — authentification (est-ce bien tanaka ?)
  • Ce qu'elle utilise — l'identifiant et le mot de passe ; après la connexion, l'ID de session du Cookie
  • En cas d'échec — retour à l'écran de connexion
  • Le mot de passe n'est vérifié qu'une fois ; ensuite, c'est l'ID de session
2e décision — autorisation (cette réservation peut-elle être supprimée ?)
  • Ce qu'elle utilise — à qui appartient la réservation, et si l'utilisateur est administrateur
  • En cas d'échec — renvoyer « tu n'as pas les droits »
  • Vérifiée à chaque opération
Le cadre extérieur est une requête. Elle contient deux décisions, dans l'ordre de haut en bas. Même si la première est franchie, le refus peut venir de la seconde.

Même pour une action du même tanaka, les deux sont décidées séparément.

Le même tanaka peut être arrêté à l'authentification ou à l'autorisation
Ouvrir la listesans connexionConnecté, supprimesa réservationConnecté, supprimecelle d'un autreNonauthentifiéAuthentifiéAuthentifiéN'atteint pasla décisionPropriétaire→ autoriséAutre propriétaire→ refuséÉcran de connexionSuppriméPas les droits
Chaque ligne est une opération. Elle passe l'authentification puis l'autorisation en partant de la gauche, et dès qu'elle échoue, l'écran de droite est renvoyé. La ligne du haut n'atteint jamais l'autorisation.

Certaines lignes s'arrêtent à l'authentification, d'autres la passent puis s'arrêtent à l'autorisation.

Les réglages du type « réservé aux administrateurs » ou « tu ne vois que tes propres données » relèvent de l'autorisation.

Vérifier qui tu es, c'est l'authentification ; décider ce que tu peux faire, c'est l'autorisation

Pouvoir se connecter et avoir le droit d'effectuer une opération sont deux choses décidées séparément.

L'authentification vérifie si l'utilisateur est bien celui qu'il prétend être, l'autorisation décide s'il a le droit d'effectuer cette opération, et l'autorisation est vérifiée côté serveur à chaque opération.

Le mot de passe est stocké sous forme de hachage, et ce sont les hachages que l'on compare

La première chose à retenir sur l'authentification, c'est que le serveur ne stocke pas le mot de passe lui-même.

Ce qui est stocké, c'est un hachage (hash ; chaîne produite à partir de la chaîne d'origine par une procédure fixe, et impossible à retransformer en l'original).

Ce que tu tapesHaché immédiatementComparé au hachage stockéRésultat
hanabi2026 (correct)a3f9...c1Identique à a3f9...c1Connexion réussie
hanabi2025 (un caractère de différence)7b20...e4Différent de a3f9...c1Échec de la connexion
Hanabi2026 (majuscule différente)d15c...8aDifférent de a3f9...c1Échec de la connexion

Un seul caractère de différence produit un hachage totalement différent.

La vérification reste possible bien que le hachage soit irréversible, parce que l'élément de comparaison est lui aussi un hachage.

Le serveur ne détient qu'une chaîne irréversible.

Ce qui est stocké dans la base de données et ce qui ne l'est pas
La base de données de my-app
Une ligne de la table users (tanaka)
  • email — tanaka@example.com
  • password_hash — a3f9...c1
  • created_at — date et heure de l'inscription
Ce que cette ligne ne contient pas
  • Les caractères tapés « hanabi2026 »
  • Toute donnée permettant de retrouver les caractères tapés
  • L'état « connecté ou non » à cet instant
À l'intérieur de la base de données de my-app. La ligne de tanaka contient seulement une adresse e-mail, un hachage et la date d'inscription.

Le hachage sert à se prémunir contre une fuite du contenu de la base de données.

Les chaînes courantes se devinent, donc on ajoute avant le hachage une chaîne différente pour chaque utilisateur (un sel).

Le HTTPS de l'envoi empêche la lecture en cours de route ; c'est une question distincte de la forme de stockage.

Ce qui se passe ensuite dépend de la correspondance des hachages
tanaka appuiesur ConnexionComparer leshachagesIdentiquesDifférentsCréer la session,renvoyer son IDRenvoyer l'écrande connexion
La connexion unique de gauche se divise vers le haut ou vers le bas selon le résultat de la comparaison. Ce n'est qu'en cas de correspondance qu'un enregistrement est créé dans le serveur.

Ce qui est stocké est un hachage, et l'élément de comparaison en est un aussi

Le serveur ne détient pas le mot de passe tapé par l'utilisateur.

Il ne détient qu'une chaîne irréversible : à chaque connexion, il fait passer les caractères tapés par la même procédure et vérifie si la chaîne obtenue est identique à celle qui est stockée.

Après la connexion, c'est l'ID de session du Cookie qui permet au serveur de reconnaître la même personne

Même après une connexion réussie, la requête qui ouvre la page suivante est une autre requête.

HTTP est sans état (stateless ; un échange ne garde pas la mémoire du précédent), donc le serveur ne retient pas qui vient de se connecter.

Le fait que la connexion a réussi est enregistré côté serveur, et le navigateur reçoit une chaîne qui pointe vers cet enregistrement.

L'enregistrement conservé côté serveur est la session (session), la chaîne qui pointe vers lui est l'ID de session (session ID), et le mécanisme qui confie cette chaîne au navigateur et la lui fait envoyer à chaque fois est le Cookie (cookie).

Ce que détiennent le navigateur et le serveur après la connexion
my-app après la connexion
À l'intérieur du navigateur de tanaka
  • Cookie: session_id=3f9a1c...e81b
  • Joint automatiquement à chaque requête vers le même site
  • Rien d'autre que cette chaîne n'est conservé
À l'intérieur du serveur
  • L'enregistrement de session 3f9a1c...e81b, c'est tanaka
  • Cet enregistrement a une date d'expiration
  • La déconnexion supprime cet enregistrement
La même chaîne 3f9a1c...e81b relie le côté navigateur à l'enregistrement côté serveur. Le nom et les droits n'existent que côté serveur.

Côté navigateur, il n'y a que la chaîne 3f9a1c...e81b, sans nom ni droits.

À qui appartient la connexion n'apparaît que lorsque cette chaîne est reliée à l'enregistrement côté serveur.

Seule la ligne du haut est reliée à un enregistrement, donc la liste des réservations revient sans redemander le mot de passe.

Cet échange prend la forme des deux lignes suivantes.

# La ligne que le serveur renvoie quand la connexion réussit
Set-Cookie: session_id=3f9a1c...e81b; HttpOnly; Secure

# Ensuite, la ligne jointe à chaque requête que le navigateur envoie au même site
Cookie: session_id=3f9a1c...e81b

Les deux éléments après Set-Cookie sont des instructions pour le navigateur.

HttpOnly empêche le JavaScript de la page de lire ce Cookie, et Secure ne le fait envoyer qu'en HTTPS.

Le contenu d'un Cookie peut être modifié par l'utilisateur, donc le résultat change selon qu'on lui fait confiance ou non.

Le résultat change selon qu'on fait confiance ou non à la valeur du Cookie
is_admin=true(valeur « admin »)ajouté et envoyéFaire confianceà la valeur reçueL'écran admins'afficheLire la sessiondepuis session_idReste unutilisateur normal
Quand arrive un Cookie modifié par l'utilisateur. Le chemin du haut décide à partir de la valeur reçue, celui du bas à partir de l'enregistrement du serveur.

Le Cookie est stocké dans le navigateur, donc l'utilisateur peut en modifier le contenu avant de l'envoyer.

Ne mets dans le Cookie que l'ID de session, et prends la décision à partir de l'enregistrement côté serveur.

Dans le cadre de gauche, il n'y a qu'une chaîne sans signification propre.

Tout ce qui détermine qui est l'utilisateur et ce qu'il peut faire se trouve dans le cadre de droite.

Le navigateur ne reçoit qu'une seule chaîne, qui pointe vers l'enregistrement

Au moment où une requête arrive, le serveur ne sait pas de qui elle vient.

Il le sait parce que l'enregistrement créé à la connexion et la chaîne envoyée à chaque fois par le navigateur sont reliés ; si l'enregistrement est supprimé ou expire, envoyer la même chaîne ramène à l'écran de connexion.

Authentification par session et JWT — l'enregistrement est-il détenu par le serveur ou par la chaîne ?

« Authentification par session ou JWT » revient à choisir lequel des deux détient la preuve que tu es connecté.

L'autre approche ne laisse aucun enregistrement sur le serveur et confie la preuve elle-même au navigateur.

Cette chaîne de preuve jointe à chaque envoi est un jeton (token), et le JWT (JSON Web Token ; chaîne qui regroupe l'ID de l'utilisateur, une date d'expiration et une signature) en est le format le plus répandu.

Le contenu de l'unique JWT reçu par le navigateur
Une seule chaîne jointe à chaque envoi par le navigateur (JWT)
Contenu — à qui il appartient, jusqu'à quand il est valide
  • L'ID utilisateur de tanaka
  • Date d'expiration (utilisable jusqu'à cette heure)
Signature — une valeur que seul le serveur peut produire
  • Une chaîne calculée à partir du contenu
  • Si le contenu est modifié, le calcul ne correspond plus
Le cadre extérieur est l'unique chaîne envoyée à chaque fois. Le contenu s'y trouve sous une forme lisible, et c'est la signature qui permet de détecter une modification.

Grâce à la signature, le serveur reconnaît que la chaîne reçue est bien celle qu'il a émise, sans la comparer à un enregistrement.

CritèreAuthentification par sessionJWT
Ce qui est remis en cas de connexion réussiesession_id=3f9a1c...e81beyJhbGci... ID, expiration et signature
Où se trouve la base de la décisionUn enregistrement dans le serveurLe contenu de la chaîne elle-même
La vérification à chaque foisComparer à l'enregistrementVérifier la signature

Le JWT porte son contenu, donc il est accepté sans enregistrement côté serveur.

Avec l'authentification par session, supprimer l'enregistrement suffit à bloquer la requête suivante.

Le JWT passe jusqu'à son expiration, donc pour l'arrêter tout de suite, on tient à part une liste des jetons révoqués.

Dans cet article, l'authentification par session a été représentée avec un Cookie et le JWT sous forme de chaîne, mais en pratique il existe aussi des configurations qui placent le JWT dans un Cookie.

Même si l'emplacement change, la différence reste la même : comparer à un enregistrement ou vérifier une signature.

Le serveur détient-il l'enregistrement, ou la chaîne porte-t-elle son contenu ?

Dans les deux approches, le navigateur joint et envoie une chaîne à chaque fois.

Ce qui diffère, c'est ce que fait le serveur à la réception : l'authentification par session consulte son propre enregistrement, le JWT vérifie la signature jointe à la chaîne.

QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quand le serveur stocke le mot de passe d'un utilisateur, qu'est-ce qui est placé dans la base de données ?

Question 2Quand tu ouvres une autre page après t'être connecté, pourquoi le serveur sait-il qu'il s'agit du même utilisateur ?

Question 3Un utilisateur connecté a tenté de supprimer la réservation d'une autre personne et le serveur a refusé. De quelle décision s'agit-il ?