Les cookies

Gérer les cookies en shell UNIX

Les cookies permettent d'échanger des messages entre un client et un serveur. Les cookies sont des fichiers stockés sur la machine du client et permetttent de stocker des informations utilisables par le serveur lors de connexions ultérieures.

En shell, la création et l'utilisation de cookies n'est pas difficile si ce n'est qu'elles nécessitent une syntaxe précise.

Syntaxe

Création d'un cookie

La création (définition) d'un cookie est réalisée par le mot-clef Set-Cookie et utilise la syntaxe suivante :

Set-Cookie: nom_du_cookie=chaîne; mots-clef

La partie qui suit immédiatement Set-Cookie: est considérée comme le nom du cookie. Chaîne contient les données réelles qu'on souhaite stocker.

En plus de cette définition, il existe un certain nombre d'autres mots-clef optionnels :


mot-clef

description

expires

Permet de définir la date à laquelle le cookie ne doit plus être stocké sur le disque, et ne doit plus être pris en compte par le serveur

domain

Généralement laissé vide car le nom du serveur est assigné par défaut (c'est ce que l'on désire généralement). Lorsqu'il est indiqué, le nom de domaine doit contenir au moins deux points.

Une machine provenant d'un domaine spécifique ne peut spécifier qu'un nom de sous-domaine ou son propre nom de domaine.

path

L'attribut path (traduisez chemin) permet de définir un sous-répertoire ou un fichier du serveur sur lequel le cookie est valide, afin de réduire son champ d'action.

secure

Récupération des informations d'un cookie

Les informations d'un cookie présent sur le client sont envoyées au serveur et stockées dans la variable HTTP_COOKIE. Il suffit donc de récupérer cette variable et de traiter son contenu.

Exemples

Création d'un cookie

La création se réalise conformément à la syntaxe, il suffit d'introduire dans le shell (cgi) la ligne suivante :

echo "Set-Cookie: essai=session=test&page=1&next=2; expires=$(date -v+1m '+%a, %d-%b-%Y %X %Z')"

Cette ligne définit un cookie nommé essai, dont la valeur = session=test&page=1&next=2. Il s'agit de la chaîne qui sera retournée dans la variable HTTP_COOKIE.

Le séparateur & est choisi ici pour être conforme aux méthodes GET et POST, mais l'on peut choisir un autre caractère. La chaîne s'arrête obligatoirement au caractère ; qui délimite les mots-clef. Dans ce cas précis, on récupèrera ainsi les trois variables que l'on avait stockées sur le client : session, page et next.

Ici, le cookie essai est défini avec une période d'utilisation d'un mois. Si aucune date d'expiration n'est précisée, cela dépend de la configuration du navigateur, en général, l'expiration se fait à la fin de la session.

Cette ligne doit impérativement précéder les lignes :

echo "Content-type: text/plain; charset=utf-8"
echo

qui servent à initialiser l'affichage standard du navigateur, sous peine de voir la ligne Set-Cookie s'afficher dans la page.

Récupération du contenu d'un cookie

Automatiquement, lors de l'interrogation d'un client, s'il existe un cookie correspondant au domain/path, la valeur définie est renvoyée. Dans notre exemple, il suffit de récupérer dans le cgi le contenu de la variable HTTP_COOKIE :

echo ${HTTP_COOKIE}

pour récupérer session=test&page=1&next=2.

Un rapide traitement pour faciliter la présentation et le traitement :

echo ${HTTP_COOKIE} | tr '&' '\n'

permet de passer à un affichage sur plusieurs lignes :

session=test
page=1
next=2

Ensuite, à l'aide d'un grep et d'un cut -d"=" -f2, on récupère la valeur de la variable recherchée.

SESSION=$( echo ${HTTP_COOKIE} | tr '&' '\n' | grep session | cut -d"=" -f2)
PAGE=$( echo ${HTTP_COOKIE} | tr '&' '\n' | grep page | cut -d"=" -f2)
NEXT=$( echo ${HTTP_COOKIE} | tr '&' '\n' | grep next | cut -d"=" -f2)

Cas de plusieurs cookies

Comme un cookie est défini par son nom, on peut supposer qu'on peut en créer plusieurs sur un même domaine, voire sur un même répertoire.

Si l'on définit plusieurs cookies au même endroit, ils seront restitués sur une même ligne, séparés par des ;.

mon_cookie1=variable1=valeur1... ; mon_cookie2=variable2=valeur2...