Apprendre JS : Cookies

Les cookies sont aujourd'hui incontournables sur le web. Voici comment les manipuler en JavaScript.

IcĂŽne de calendrier MAJ en
Intermédiaire
8 chapitres

Avant de rentrer dans le dĂ©tail de la manipulation des cookies en JavaScript, il est important de comprendre ce qu’est un cookie, et quel rĂŽle il joue sur un site web.

Manipuler les cookies en JavaScript

Les cookies sont enregistrés dans des paires nom-valeur comme : user=Athios (à la maniÚre des objets littéraux JS).

On peut trÚs facilement manipuler les cookies en JavaScript avec la propriété document.cookie.

Création

On crĂ©Ă© un cookie avec la propriĂ©tĂ© .cookie Ă  laquelle on affecte un couple nom-valeur dĂ©fini au sein d’une chaĂźne de caractĂšres.

copié !
// Création du cookie "user" avec pour valeur "Athios"
document.cookie = "user=Athios";

En plus d’une paire nom=valeur, on va Ă©galement pouvoir dĂ©finir des options pour nos cookies.

Portée

Les directives domain et path dĂ©finissent la portĂ©e d’un cookie ; autrement dit sur quelles URLs les cookies doivent ĂȘtre accessibles.

Domaine d’accessibilitĂ©

L’option domain permet de prĂ©ciser le(s) domaine(s) sur le(s)quel(s) le cookie doit ĂȘtre accessible.

Si vous ne prĂ©cisez pas l’option domain lors de la crĂ©ation d’un cookie en JavaScript, le cookie sera accessible uniquement depuis le domaine (ou sous-domaine exact) de l’URL de la page en cours.

Les cookies créés sans spécification de domaine sont appelés cookies de domaine restreint.

Par exemple, si vous crĂ©ez un cookie sur monsite.com sans spĂ©cifier de domain, ce cookie sera uniquement accessible lorsque l’utilisateur navigue sur des pages du domaine monsite.com (par exemple monsite.com/blog, monsite.com/shop, etc.). Le cookie ne sera pas accessible depuis un sous-domaine comme sous-domaine.monsite.com (tels que blog.monsite.com, shop.monsite.com, etc.).

En revanche, si vous créez un cookie en spécifiant domain=monsite.com, alors tous ses sous-domaines seront inclus.

copié !
document.cookie = "user=Athios; domain=monsite.com";
Chemin

Il est Ă©galement possible de spĂ©cifier pour quelles URLs l’entĂȘte du cookie doit ĂȘtre envoyĂ©e avec l’option path.

Si path n’est pas dĂ©fini, il s’agit du chemin actuel.

Par exemple, un cookie défini avec path=/shop sera disponible dans les pages /shop et /shop/
 mais pas dans les pages /admin ou /blog.

copié !
document.cookie = "user=Athios; domain=monsite.com; path=/shop";

Durée

Par dĂ©faut, un cookie est supprimĂ© dĂšs que le navigateur est fermĂ© (fin de la session). Il est Ă©galement possible de prĂ©ciser une date d’expiration pour un cookie, afin de le conserver plus longtemps pour pouvoir le rĂ©utiliser dans le futur.

Il y a deux maniĂšres de spĂ©cifier cette date d’expiration :

  1. Avec l’option expires, en dĂ©finissant un objet Date sur lequel on applique la mĂ©thode toUTCString() pour le formater en texte.
  2. Avec l’option max-age, en dĂ©finissant un nombre en secondes Ă  partir du moment actuel.

On va ainsi par exemple pouvoir définir un cookie qui devra expirer exactement 24h aprÚs sa création comme cela :

copié !
// DĂ©claration avec l'objet Date
let date = new Date(Date.now() + 86400000); // 86400000ms = 1 jour
document.cookie = "user=Athios; expires=" + date.toUTCString();

// DĂ©claration avec un nombre de secondes
document.cookie = "user=Athios; max-age=86400";

Modification

Il n’existe pas de fonction permettant de modifier uniquement la valeur d’un cookie. Pour cela, on procĂ©dera Ă  la redĂ©claration d’un cookie existant.

copié !
// Modification du cookie "user" avec pour nouvelle valeur "John"
document.cookie = "user=John";

Suppression

Pour supprimer un cookie, la mĂ©thode la plus simple est de le redĂ©clarer sans valeur et en prĂ©cisant cette fois-ci une date d’expiration passĂ©e ou encore max-age=0.

copié !
document.cookie = 'user=; expires=Thu, 01 Jan 1970 00:00:00 UTC';
document.cookie = 'user=; max-age=0';

Lecture

Il est possible de lire tous les cookies déposés sur un domaine avec document.cookie.

copié !
console.log(document.cookie);