Leçon 11 / 12
Leçon 11 · Partie 3 — PHP & le Web

Sessions et cookies

Le problème : le Web a la mémoire courte

Chaque fois que tu charges une nouvelle page, le serveur t'a oublié. Il ne sait pas si tu étais là 5 secondes avant, si tu es connecté, ce qu'il y a dans ton panier.

Les cookies et sessions permettent au serveur de se souvenir de toi d'une page à l'autre.

💡

Ce comportement "sans mémoire" s'appelle HTTP stateless. Chaque requête est indépendante. C'est une caractéristique du Web, pas un bug. Cookies et sessions sont la solution.

Les cookies — un post-it collé sur ton navigateur

Un cookie est un petit fichier texte que le serveur demande à ton navigateur de garder. À chaque page visitée, le navigateur l'envoie au serveur. Le serveur te reconnaît.

Ces popups "Ce site utilise des cookies" ? C'est exactement ça.

Créer un cookie en PHP

setcookie() demande au navigateur de créer un cookie. Trois paramètres : le nom, la valeur, et la date d'expiration.

PHP
<?php
// setcookie(nom, valeur, date d'expiration)
// time() renvoie l'heure actuelle en secondes depuis 1970
// time() + 86400 = maintenant + 86400 secondes = maintenant + 1 jour

setcookie("prenom", "Marie", time() + 86400);
// Le navigateur gardera ce cookie pendant 1 jour
// 3600 = 1 heure, 86400 = 1 jour, 604800 = 7 jours
⚠️

setcookie() doit être appelé avant tout affichage — avant le premier HTML, avant le moindre espace. Les cookies sont dans les en-têtes HTTP, envoyés avant le contenu. HTML avant setcookie() = erreur "Cannot modify header information".

Lire un cookie

Les cookies du navigateur sont dans $_COOKIE — un tableau, comme $_GET et $_POST.

PHP
<?php
// On vérifie toujours si le cookie existe avant de le lire
if (isset($_COOKIE["prenom"])) {
    $prenom = htmlspecialchars($_COOKIE["prenom"]);
    echo "Bonjour, $prenom ! Content de te revoir.";
} else {
    echo "Bonjour, visiteur ! C'est ta première visite.";
}
Résultat (si le cookie "prenom" existe)
Bonjour, Marie ! Content de te revoir.

Supprimer un cookie

Pour supprimer un cookie, recrée-le avec une date dans le passé. Le navigateur l'efface.

PHP
// time() - 3600 = il y a 1 heure = dans le passé → le navigateur supprime le cookie
setcookie("prenom", "", time() - 3600);
⚠️

Jamais de données sensibles dans un cookie. Les cookies sont sur l'ordinateur de l'utilisateur, dans un fichier lisible. Mot de passe, carte bancaire — catastrophique. Pour les données sensibles, utilise les sessions.

Les sessions — le vestiaire de la piscine

Tu arrives à la piscine. Tu déposes tes affaires dans un casier. On te donne un bracelet numéroté. À chaque entrée, tu montres le bracelet. L'agent ouvre le bon casier.

Ton bracelet = un simple numéro. Tes affaires restent sécurisées dans le casier, sur le serveur.

Les sessions PHP fonctionnent pareil :

  • Tes données (nom, panier, rôle...) sont sur le serveur — dans le casier.
  • Ton navigateur reçoit un identifiant unique dans un cookie appelé PHPSESSID.
  • À chaque page, le navigateur envoie cet identifiant. PHP retrouve ton casier.

Avantage : les vraies données ne passent jamais dans le navigateur. Quelqu'un qui intercepte le trafic ne voit que le numéro — inutile sans le casier.

Démarrer une session

session_start() est obligatoire sur chaque page qui utilise des sessions — avant tout HTML. C'est elle qui charge les données depuis le serveur.

PHP
<?php
// TOUJOURS en première ligne, avant tout HTML
session_start();

// Stocker des données dans la session
// $_SESSION est un tableau associatif, comme $_GET et $_POST
$_SESSION["prenom"]   = "Marie";
$_SESSION["connecte"] = true;
$_SESSION["role"]     = "admin";

Ces données sont sur le serveur, associées à ce visiteur. Elles persistent d'une page à l'autre.

Lire les données de session sur une autre page

Même logique sur n'importe quelle page : session_start() en premier, puis $_SESSION.

autre-page.php
<?php
session_start(); // obligatoire sur chaque page qui utilise $_SESSION

// On vérifie si la donnée existe avant de la lire
if (isset($_SESSION["prenom"])) {
    echo "Bonjour " . htmlspecialchars($_SESSION["prenom"]) . " !";
    // Affiche : Bonjour Marie !
} else {
    echo "Tu n'es pas connecté.";
}

PHP retrouve le bon casier grâce à l'identifiant. Les données sont là.

Protéger une page — le garde à l'entrée

Usage le plus courant : vérifier qu'une personne est connectée avant de montrer une page privée. Sinon, rediriger vers le login.

page-privee.php
<?php
session_start();

// Si l'utilisateur n'est pas connecté, on le renvoie immédiatement au login
if (empty($_SESSION["connecte"])) {
    header("Location: login.php"); // redirige le navigateur
    exit; // IMPORTANT : arrête l'exécution PHP immédiatement après la redirection
           // Sans exit, PHP continuerait d'exécuter la suite — dangereux !
}

// Si on arrive ici, l'utilisateur est connecté. On peut afficher le contenu.
echo "Bienvenue dans ton espace personnel, " . htmlspecialchars($_SESSION["prenom"]) . " !";

N'oublie jamais exit après header("Location: ...") ! Sans lui, PHP continue d'exécuter la page même après la redirection. Un attaquant peut voir le contenu protégé en interceptant la réponse.

Déconnecter — détruire la session

L'utilisateur clique "Se déconnecter". On efface toutes ses données de session. Comme rendre le bracelet : le casier est vidé.

logout.php
<?php
session_start();

// Vider toutes les variables de session (vider le casier)
$_SESSION = [];

// Supprimer la session côté serveur (détruire le casier)
session_destroy();

// Renvoyer vers la page de connexion
header("Location: login.php");
exit;

Cookie ou session — lequel choisir ?

En résumé :

Comparaison
                  Cookie              Session
Stocké où ?       Navigateur          Serveur (sécurisé)
Durée             Configurable        Fermeture du navigateur
Données sensibles NON — jamais ❌     OUI — c'est fait pour ✅
Taille max        ~4 Ko               Pratiquement illimitée
Cas d'usage       Langue, thème,      Login, panier, rôle,
                  préférences         données personnelles

Cookies : préférences légères (langue, thème). Sessions : identité et sécurité (connexion, panier, droits d'accès).

// À retenir
  • Le Web est "sans mémoire" par défaut — cookies et sessions résolvent ce problème
  • Cookie = fichier texte stocké dans le navigateur. Pour les préférences non sensibles.
  • Session = données stockées sur le serveur, le navigateur ne garde qu'un identifiant. Pour tout ce qui est sensible.
  • session_start() doit être la toute première instruction de chaque page utilisant des sessions — avant tout HTML
  • $_SESSION["clé"] = valeur pour stocker des données
  • Vérifie toujours avec isset() ou empty() avant de lire une variable de session
  • Après header("Location: ..."), mets toujours exit
  • session_destroy() pour déconnecter