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
// 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
// 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.";
}
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.
// 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
// 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.
<?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.
<?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é.
<?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é :
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).
- 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é"] = valeurpour stocker des données- Vérifie toujours avec
isset()ouempty()avant de lire une variable de session - Après
header("Location: ..."), mets toujoursexit session_destroy()pour déconnecter