Vous le savez surement, un cookie est un espion horrible qui vend vos données aux GAFAs mais si vous ne les acceptez pas aucun site web ne marche. En fait un cookie est une information PERSISTANTE qu'une application web pose sur votre ordinateur-client et votre browser web et qu'elle récupère/réutilise/met à jour chaque fois que vous re-utilisez la même application. Avant de chercher à comprendre la persistance des données il faut d'abord comprendre les cookies car tout est basé dessus. Les cookies sont des pairs "nom=valeur" mais qui possèdent en plus au moins 2 informations ultra importantes

  • le site (ou sous-repertoire du site) sur lequel le cookie est valable. Les autres sites/parties du site n'y auront pas accès.
  • une date de validité. Par défaut un cookie est effacé à la fermeture du navigateur sauf si le cookie a une date de validité

Mais il faut savoir qu'un cookie est transmis dans l'en-tete de la page web. Il faut donc mettre le code PHP qui fait les setcookie() au TOUT DEBUT d'une page PHP

  • On pose un cookie avec setCookie("nom", "valeur", date_de_peremtion);
  • On lit les cookie dans le tableau associatif $_COOKIE

Regardez la page suivante

<?php
  setcookie("NomDuCookie1", "Je suis une valeur sûre1", time()+3600);
  setcookie("NomDuCookie2", "Je suis une valeur sûre2", time()+3600);
  setcookie("NomDuCookie3", "Je suis une valeur sûre3", time()+3600, "/", "ballotin.org", true, true);
  setcookie("NomDuCookie4", "Je suis une valeur sûre4", time()+3600, "/", "ballotin.org", false, false);
  setcookie("NomDuCookie5", "Je suis une valeur sûre5", time()-3600);
  setcookie("NomDuCookie6", "Je suis une valeur sûre6", time()-3600);
  setcookie("NomDuCookie7", "Je suis une valeur sûre7", time()+3600, "", "", false, false);
  setcookie("NomDuCookie8", "Je suis une valeur sûre8", time()+3600, "", "", false, true);
?>
<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Miam miam les cookies</title>
  <script>
    //ici c'est javascript. on peut lire les cookies qui ne sont pas httponly
    console.log(document.cookie);
    let cookies = decodeURIComponent(document.cookie).split(';');
    for(var i = 0; i <cookies.length; i++)
      console.log(cookies[i]);

  </script>
</head>
<body>
<?php
  // ici c'est PHP mais c'est trop tard pour "poser" des cookies
  // par contre on peut les lire ... sauf ceux qu'on vient jute de poser !!! 
  foreach ($_COOKIE as $i => $co)
    print("<div>$i ==== $co</div>")
?>
  <p>Bonjour le monde des <a href="testCookie2.php">cookies</a></p>
</body>
</html>

La premiere visite : Javascript récupère les cookies tout de suite ... mais pas PHP !!!!


La deuxième visite : Javascript récupère les cookies de la visite d'avant !


La même page posée sur un autre site ne pose pas les cookies associés au site prévu :


Comme vous pouvez le voir en javascript il y a plein de %20 à la place des espaces et tout est dans une seule même chaine de caractère donc on utilise des fonctions  (decodeURIComponent, split) pour lire les cookies . Pour une valeur plus complexe on utilisera JSON.stringify(...) et JSON.parse(...); qui transformeront des objets javascript en JSON-Chaine de caractère et vice-versa.
Cette page propose un lien vers testCookie2.php qui pourra lire tous les (bons) cookies dans $_COOKIE.
 

Coté serveur

On pose un cookie avec setCookie() dans une page (enfin dans le haut de la page) et on peut lire les valeurs dans toutes les pages du meme site avec $_COOKIE. Tout est stocké sur le client, donc toutes les valeurs (utiles ou non) sont rapatriées sur le serveur (comme si un formulaire était systématiquement rempli par le navigateur à la place de l'utilisateur). C'est pas très efficace alors on a inventé un meilleur mécanisme. Un seul cookie est posé chez le client(une clé qui est une valeur aléatoire générée). Les valeurs persistantes sont stockées sur le serveur mais dans un coffre-fort protégé par la clé qui était chez le client. Au final le cookie ne sert qu'à identifier le client (plusieurs personnes peuvent aller sur le même site web !!!). Pour activer ce mécanisme on utilise 

  • session_start(); (AU TOUT DEBUT d'une page PHP car ça envoie un cookie)
  • on écrit les clé-valeur dont on a besoin de se souvenir dans le tableau associatif $_SESSION (ie  $_SESSION['toto'] =14)
  • on lit les valeurs passées dans le même tableau associatif $_SESSION (ie print($_SESSION['toto']))
  • on peut écrire n'importe où (pas que au debut de la page)
  • on peut mettre toutes les valeurs que PHP connait (tableau associatif, nombre, booléen) puisque tout reste en PHP 

Coté client

Javascript peut aussi avoir accès aux cookies (et en créer) dans le tableau document.cookie. Un cookie peut servir a faire passer une variable de PHP vers javascript. Par contre ce n'est pas pratique de tout avoir dans une chaine de caractère.Ca reste très pratique d'avoir des variables persistantes d'une navigation à l'autre, d'une page à l'autre d'un meme site, etc sans passer par le serveur et des requêtes AJAX. Comme pour le coté serveur, coté client on a un mécanisme plus simple pour le développeur qui utilise surement des cookies mais on ne veut pas le savoir; Les objets localStorage et sessionStorage sont fait pour nous. Ils pre-existent dans tous code javascript et on a juste à les utiliser comme cela :

// Enregistrer des données dans localStorage
localStorage.setItem('clé', 'valeur');

// Récupérer des données depuis localStorage
let data = localStorage.getItem('clé');
// Supprimer des données de localStorage
localStorage.removeItem('clé');
Comme pour les cookies, on utilisera JSON.stringify(...) et JSON.parse(...); pour transformer des objets javascript en JSON-Chaine de caractère et vice-versa.
localStorage est PLUS persistant que sessionStorage (objet qui marche exactement de la meme façon) mais qui est effacé à la fermeture de la page/onglet alors que localStorage survit tant qu'on revient sur le meme site. 
localStorage n'a pas de date d'expiration et doit etre (éventuellement) effacé explicitement.
Un Cookie a une limite de taille de 4Ko environ alors que localStorage/sessionStorage peuvent contenir 5/10Mo environ

Última modificación: jueves, 6 de marzo de 2025, 10:25