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...