Développement d'applications Web avec LAMP

Document d'accompagnement pour le cours 420-KB9-LG

Les cookies

Dernière mise à jour le 8 octobre 2022

Qu'est-ce qu'un cookie?

Les cookies n'ont rien à voir avec un langage de programmation, une technologie, un navigateur ou un serveur Web particulier. Ils appartiennent au protocole HTTP.

Définition :

Un cookie est une petite information textuelle qu’un serveur envoie à un navigateur et que le navigateur retourne sans modification lors des visites ultérieures sur le même site Web.

À quoi servent les cookies?

1- Maintenir la connexion pendant une session de commerce électronique

Le cookie peut servir à simuler un panier d’achats, permettant ainsi de contourner le problème de la non persistance des connexions HTTP.

La persistance est une caractéristiques offerte par la version 1 du protocole HTTP, mais ne concerne que le pipelining (envoie massif de requêtes sans attente de réponse) et ne s'applique donc pas aux échanges "bloquants" entre, par exemple, un consommateur et un site de commerce électronique.

Exemple de session de commerce électronique avec cookies

Dans le modèle le plus simple, c’est donc tout le panier d’achats qui est stocké dans le cookie.

Dans une version un peu plus élaborée, ce n’est qu’un numéro (identificateur de session) qui est stocké dans le cookie, le panier d’achats demeurant sur le serveur.

2- Identifier un utilisateur

Il s'agit ici d'éviter de saisir nom et mot de passe à chaque session.

C'est le fameux "Rester connecté".

À la première session, après la transmission du nom d’utilisateur et du mot de passe vers le serveur, ce dernier envoie un cookie contenant un code d’identification unique (une chaîne assez longue pour la supposer unique).

À la session suivante, dès que l’utilisateur se connecte au site Web, le cookie transmis automatiquement dans la requête HTTP permet d’identifier l’utilisateur, qui n’a plus alors à entrer nom et mot de passe.

Évidemment, cette solution n’est applicable que pour les sites où les exigences de sécurité ne sont pas très élevées.

3- Personnaliser un site Web

Certains sites, comme de nombreux portails, permettent de personnaliser l’apparence de la page d’accueil. La configuration est conservée dans un cookie.

4- Cibler la publicité

La publicité ciblée est beaucoup plus payante pour un site Web qu’une publicité "aveugle".

À l’aide d’un cookie, le site Web garde une trace des pages que vous visitez fréquemment sur le site, des recherches que vous effectuez, etc.

Il devient alors possible de bâtir votre profil d’utilisateur et d’afficher seulement des publicités orientées selon vos intérêts

Comment s'échangent les cookies?

Les cookies sont transmis du serveur Web au navigateur et vice versa à l'aide des en-têtes HTTP qui accompagnent les requêtes et les réponses.

Considérons l'exemple suivant. D'abord, le navigateur effectue une requête au serveur Web pour obtenir la page d'accueil du site.

GET /index.html HTTP/1.1       <-- requête
Host: prog101.com              <-- début des en-têtes
...
                               <-- ligne vide

Le serveur répond en envoyant un code d'état, suivi des en-têtes, d'une ligne vide et finalement du code HTML de la page demandée. Un des en-têtes contient ici un cookie.

HTTP/1.1 200 OK                <-- code d'état
Content-type: text/html        <-- début des en-têtes
Set-cookie: saveur=chocolat
...
                               <-- ligne vide
<!DOCTYPE html>                <-- début du code HTML
<html lang="fr">
<head>
...

Lors des requêtes subséquentes au même site Web, le navigateur enverra le cookie sous-forme d'en-tête.

GET /intro_php.html HTTP/1.1
Host: prog101.com
Cookie: saveur=chocolat
...

Le serveur répondra à la requête en incluant toujours le cookie, possiblement avec une nouvelle valeur.

HTTP/1.1 200 OK
Content-type: text/html
Set-cookie: saveur=fraise
...

<!DOCTYPE html>
<html lang="fr">
<head>
...

Attributs d'un cookie

En plus de la paire nom-valeur, le cookie peut contenir :

Exemple de cookie contenant plus d'information :

HTTP/1.1 200 OK
Content-type: text/html
Set-cookie: saveur=fraise;expires=Fri, 14-Dec-2021 00:00:00 GMT;path=/clg; domain=.prog101.com
...

On constate que les éléments sont séparés par le caractère ; (point-virgule).

Durée de vie d'un cookie

Un cookie expire et n'est donc plus renvoyé au serveur si l'une des conditions suivantes est remplie :

Cookies et vie privée

Les cookies ne peuvent causer de problèmes graves (comme le disaient les médias il y a quelques années). Pourquoi?

Premièrement, parce que les cookies ne sont pas exécutables et ne peuvent donc pas contenir de virus.

Deuxièmement, parce que les navigateurs imposent une limite au nombre de cookies par site, au nombre total de cookies et à la taille de ceux-ci.

Dernièrement on observait des valeurs semblables à celles-ci :

nombre maximum de cookies par site20
nombre total de cookies300
taille maximum d’un cookie4 Ko

Les cookies peuvent quand même causer quelques petits problèmes au niveau du respect de la vie privée.

Par exemple, un moteur de recherche peut se "souvenir" du type de recherches effectuées par un utilisateur (ce qui n’est peut-être pas bien grave).

Échange d'informations entre sites Web

Un peu plus dérangeante est la pratique dans laquelle des sites collaborent pour suivre les traces d’un utilisateur.

Normalement, un cookie envoyé par un serveur donné ne peut être lu que par ce serveur, ce qui assure l’étanchéité de nos transactions d’un site à l’autre.

Certaines entreprises utilisent toutefois la technique suivante appelée "pistage par cookie de tierce partie" (third-party cookies) :

  1. le site A place dans une de ses pages un objet (le plus souvent une image) stockée sur le site B;

  2. en lisant le code HTML, le navigateur voit la référence à l’image qui est sur B et adresse donc une requête HTTP à B pour obtenir cette image (c’est le fonctionnement normal du Web où chaque objet contenu dans une page est l’objet d’une requête séparée au serveur);

  3. dans sa réponse HTTP, par laquelle il envoie l’image, le serveur B envoie aussi à l’utilisateur un cookie;

  4. plus tard, lors d’une visite au site B, ce dernier saura que l’utilisateur a déjà visité une page donnée du serveur A.

Il y aura donc eu échange d’information par les sites Web à l’insu de l’utilisateur, tout cela grâce aux cookies.

Vol de renseignements personnels

Un autre problème de sécurité pourrait être causé par certains sites Web mal conçus, qui seraient tentés de stocker dans un cookie des informations personnelles (ex : numéro de carte de crédit), informations qu'il est ensuite possible de voler en copiant les cookies présents sur le disque de l'utilisateur.

La conséquence de ces problèmes (plus ou moins grave selon le cas) est que plusieurs utilisateurs désactivent les cookies dans le navigateur.

Comme développeur d'applications Web, vous devez donc éviter dans la mesure du possible que le fonctionnement de votre site soit basé uniquement sur les cookies.

Ou encore il faut prévenir l'utilisateur qu'il doit activer les cookies (et possiblement lui expliquer que les cookies ne sont pas bien dangereux, surtout ceux au chocolat!).

Les cookies en PHP

Créer un cookie avec PHP

On utilise la fonction setcookie().

Cette fonction a cinq paramètres, dont un seul est obligatoire.

Syntaxe :

bool setcookie(
   string nom
      [, string valeur 
         [, int date
            [, string chemin 
               [, string domaine
                  [, int securite
] ] ] ] );

Nom et valeur

Selon la documentation de PHP, le seul paramètre obligatoire est le nom du cookie (la valeur par défaut étant "").

Or, il semble que les navigateurs ne conservent pas les cookies dont la valeur est "" ou null.

Il faut donc considérer en pratique que les deux premiers paramètres sont obligatoires.

Exemple :

<?php
  setcookie("foobar");             // légal selon PHP, mais sans effet :)
  setcookie("saveur", "chocolat");
?>

Date d'expiration

Le trosième paramètre, un nombre entier, est la date d'expiration du cookie.

Exemple :

<?php
  $demain = time() + (60 * 60 * 24);
  setcookie("saveur", "chocolat", $demain);
?>

Notez qu'il s'agit bien de sa date d'expiration et non de sa durée de vie comme dans d'autres langages (ex : Java).

La fonction time() retourne la date et l'heure courante sous la forme d'une estampille ("timestamp") Unix, c'est-à-dire le nombre de secondes écoulées depuis le commencement du monde, soit le 1er janvier 1970.

Dans l'exemple précédent il s'agit donc de 24 heures (24*60*60 secondes).

Si la date d'expiration est de 0 ou n'est pas spécifiée lors de la création du cookie, il sera supprimé lorsque l'utilisateur fermera son navigateur.

Chemin d'accès

Le quatrième paramètre est un chemin d'accès (path).

Il permet de spécifier dans quels cas le cookie sera renvoyé au serveur, en fonction du répertoire indiqué lors de la création du cookie.

Le tableau suivant illustre les possibilités :

Path Le cookie sera retourné lors de requêtes vers...
/ l'ensemble du domaine
/rep/ le répertoire /rep/ ainsi que tous ses sous-répertoires comme /rep/autrerep/ du domaine
le répertoire où le cookie a été défini (valeur par défaut)

Exemple :

<?php
  setcookie("saveur", "chocolat", $demain, "/recettes/");
?>

Dans l'exemple précédent, le cookie n'est renvoyé qu'aux pages dont la partie locale de l'URL commence par /recettes/.

Le cookie peut quand même être créé dans une page dont la partie locale de l'URL ne commence pas par /recettes/.

Domaine

Le cinquième paramètre est un domaine Internet (domain)

Il permet de spécifier dans quels cas le cookie sera renvoyé au serveur, cette fois en fonction du domaine ou sous-domaine indiqué à la création du cookie.

Le tableau suivant illustre les possibilités :

Domaine Le cookie sera retourné lors de requêtes vers...
exemple.com ou .exemple.com l'ensemble du domaine exemple.com et ses sous-domaines
www.exemple.com seulement le sous domaine www.exemple.com
seulement le domaine dans lequel le cookie a été défini (valeur par défaut)

Exemple :

<?php
  setcookie("saveur", "chocolat", $demain, "/recettes/", ".matante.com");
?>

Dans l'exemple précédent, le cookie est renvoyé à tous les hôtes du domaine matante.com et des sous-domaines dont le nom se termine par .matante.com, comme www.matante.com ou solange.matante.com.

Sécurité

Le sixième est dernier paramètre est un drapeau (flag) qui, s'il est activé, demande au navigateur de ne renvoyer le cookie qu'à travers une connexion HTTPS (connexion sécurisée).

Ce paramètre peut s'avérer utile si le cookie contient des informations de nature privée (pratique non recommandée).

Exemple :

<?php
  // la recette de biscuits de ma tante est un secret bien gardé
  setcookie("saveur", "chocolat", $demain, "/recettes/", ".matante.com", 1);
?>

La valeur par défaut est 0 (false).

Lire un cookie avec PHP

On lit un cookie en accédant au tableau super-global $_COOKIE.

Exemple :

<?php
  if (!empty($_COOKIE["saveur"])) {
    echo 'Mmm... des biscuits à saveur de ' . $_COOKIE['saveur'] . '!';
  }
?>

En phase de développement, on peut récupérer tous les cookies envoyés au serveur à l'aide d'un foreach.

Exemple :

<?php
  foreach ($_COOKIE as $nom => $valeur) {
    echo "$nom = $valeur<br>";
  }
?>

Sortie :

saveur = chocolat
taille = gros
fraicheur = bof

Supprimer un cookie avec PHP

On supprime un cookie en appelant la fonction setcookie() sans valeur (parce qu'inutile) et avec une date d'expiration...

Exemple :

<?php
  setcookie("saveur", null, -1);
?>

Questions et exercices de révision

AVERTISSEMENT

Nous ne fournirons pas les réponses à ces questions pour deux bonnes raisons. La première est que celles-ci se trouvent dans les notes de cours. La seconde est que, dans certains cas, ce serait presque donner la réponse à des questions d'examen. :

Question 1

Expiquez pourquoi un cookie ne peut contenir un virus (programme "malveillant".)

Question 2

Donnez trois exemples d'utilisation concrète des cookies dans une applications Web (ce qu'on peut faire avec).

Question 4

Donnez le texte de l'entête de réponse HTTP d'un serveur qui envoie un cookie au client. Le cookie a comme nom "animal" et comme valeur "chien".

Question 5

Donnez le texte de l'entête de requête HTTP d'un client qui envoie au serveur le cookie de la questions précédente.

Question 6

Expliquez comment un script procède pour changer la valeur d'un cookie qui lui a été envoyé.

Question 7

En plus du nom et de la valeur, donnez les quatre autres informations que peut contenir un cookie.

Question 8

Identifiez dans quelles circonstances un cookie n'est plus renvoyé au serveur (est supprimé par le navugateur).

Question 9

Quel genre de tableau PHP utilise-t-il pour gérer les cookies, associatif ou indexé numériquement?

Question 10

Donnez le code PHP pour créer le cookie ayant comme nom "usager" et comme valeur "Bob". Le cookie devrait être automatiquement supprimé dans 60 jours.

Question 11

Donnez le code pour lire ce cookie et en afficher la valeur.

Question 12

Donnez le code pour supprimer immédiatement ce cookie.

Question 13

Donnez le code PHP pour afficher tous les cookies envoyés par le client.