24 octobre 2023

Cookies, document.cookie

Les cookies sont des donnés stockées sous forme de petites chaîne de caractères directement dans le navigateur. Ils font parti du protocole HTTP, ils sont définis par la spécification RFC 6265.

Les cookies sont en général définis par le serveur web en utilisant l’entête HTTP Set-Cookie. Alors, le navigateur les ajoutent automatiquement à (presque) toutes les requêtes provenant du même domaine en utilisant l’entête HTTP Cookie.

L’un des cas d’utilisation les plus répandus est l’authentification :

  1. Une fois connecté, le serveur utilise l’entête HTTP Set-Cookie dans la réponse pour définir un cookie avec un “identifiant de session” unique.
  2. La prochaine fois lorsque la requête est envoyée au même domaine, le navigateur envoie le cookie sur le réseau en utilisant l’entête HTTP Cookie.
  3. Alors le serveur sait qui a fait la requête.

Nous pouvons aussi accéder aux cookies depuis le navigateur, en utilisant la propriété document.cookie.

Il y a beaucoup de chose malignes à faire à propos des cookies et leurs options. Dans ce chapitre nous les couvrirons en détail.

Lire depuis document.cookie

Votre navigateur stocke t-il des cookies depuis ce site ? Voyons voir :

// Sur javascript.info, nous utilisons Google Analytics pour les statistiques,
// Donc il devrait y avoir quelques cookies
alert( document.cookie ); // cookie1=value1; cookie2=value2;...

La valeur de document.cookie consiste en des paires name=value, délimitées par ;. Chacune étant un cookie séparé.

Pour trouver un cookie en particulier, nous pouvons diviser document.cookie par ;, et donc trouver le bon nom. Nous pouvons utiliser soit une expression régulière (regex) ou des fonctions de tableau pour faire cela.

Nous laissons cela en tant qu’exercice pour le lecteur. Aussi, à la fin du chapitre vous trouverez des fonctions utilitaires pour manipuler les cookies.

Écrire dans document.cookie

Nous pouvons écrire dans document.cookie. Mais ce n’est pas une propriété de données, c’est un accesseur (getter/setter). Une affectation à ce dernier est traitée spécialement.

Une opération d’écriture dans document.cookie met à jour seulement les cookies mentionnés dedans, mais ne touche pas les autres cookies.

Par exemple, cet appel définit un cookie avec le nom user et la valeur John :

document.cookie = "user=John"; // Met à jour uniquement le cookie nommé 'user'
alert(document.cookie); // Affiche tous les cookies

Si vous exécutez cela, vous verrez probablement plusieurs cookies. Car l’opération document.cookie= ne réécrit pas tous les cookies. Elle définit uniquement le cookie user mentionné.

Techniquement, le nom et la valeur peuvent être n’importe quel caractère. Pour garder le formattage valide, ils devraient être échappés en utilisant la fonction integrée encodeURIComponent :

// Les caractères spéciaux ont besoin d'encodage
let name = "my name";
let value = "John Smith"

// Encode le cookie en tant que my%20name=John%20Smith
document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);

alert(document.cookie); // ...; my%20name=John%20Smith
Limitations

Il y a quelques limites :

  • La paire name=value, après encodeURIComponent, ne peut pas excéder 4KB. Donc on ne peut pas stocker quelque chose de trop lourd sur un cookie.
  • Le nombre total de cookie par domaine est limité à ~ 20+, la limite exacte dépend du navigateur.

Les cookies ont plusieurs options, beaucoup d’entre elles sont importantes et devraient être définies.

Les options sont listées après key=value, délimité par ;, comme ceci :

document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"

path

  • path=/mypath

Le préfix du chemin de l’URL doit être absolu. Ça rend le cookie accessible pour les pages du même chemin. Par défaut, il s’agit du chemin courant.

Si un cookie est défini avec path=/admin, il est visible aux pages /admin et /admin/something, mais pas à /home ou /adminpage.

Généralement, nous devons définir path à la racine path=/ pour rendre le cookie accessible depuis toutes les pages du site.

domain

  • domain=site.com

Un domaine définit par où le cookie est accessible. Cependant en pratique, il y a des limites. Nous ne pouvons pas définir n’importe quel domaine.

Il n’y a pas de moyen de laisser un cookie être accessible depuis un domaine de second niveau, donc other.com ne recevra jamais un cookie défini à site.com

Il s’agit d’une restriction de sécurité, pour nous permettre de stocker des données sensibles dans nos cookies qui ne seront disponibles que sur un site.

Par défaut, un cookie est accessible uniquement depuis le domaine qui l’a défini.

Veuillez noter, par défaut un cookie n’est pas partagé avec un sous-domaine, tel que