Un serveur, en faisant parvenir un objet HTTP à un client, peut également transmettre des données que le client stockera. Ces données peuvent être accompagné par une description des URLs pour lesquels ces informations seront transmises. Par la suite, n'importe qu'elle requête HTTP faites par le client sur une de ces URLs inclura ces données dans la transmission. Il à été convenu que ces données s'appelllent des cookies.
Un cookie est envoyé vers le client en l'ajoutant dans les éléments d'entête de l'objet HTTP transmit par le serveur. Cet élément se nomera Set-Cookie.
Set-Cookie : NOM=VALEUR ; expires=DATE ; path=CHEMIN ; domain=NOM_DE_DOMAINE ; secureNOM=VALEUR
Cette chaine définit le nom et la valeur du champ du cookie excluant les caractères point-virgules, virgules ainsi que l'espace. Si une chance existe que ces caractères soit présent, il est conseillé de réalisé un codage comme pour les URLs du type %XX, quoiqu'aucun codage spécifique ne soit défini ou exigé.
Ceci est le seul attribut exigé dans l'élément Set-Cookie de l'entête de l'objet HTTP.
L'attribut expires définit sous forme de chaîne une date d'expiration. Une fois que la date d'expiration à été atteinte, le cookie ne sera plus stocké, ni distribué.
La chaine contenant la date d'expiration est formaté comme ceci :
Wdy, JJ-Mon-AAAA HH :MM :SS GMT
Le format de cette chaîne est basé sur les RFC 822, RFC 850, RFC 1036 et RFC 1123, avec comme différences que le seul fuseau horaire légal est GMT et les séparateurs entre les éléments de la date doivent être des tirets.
L'attribut expires est facultatif. Si il n'est pas indiqué, le cookie expirera lorsque la session de l'utilisateur sera terminé (par exemple, fermeture du client).
Notes : Il y a un bogue dans les versions 1.1 et précédentes de Netscape Navigator. Seul les cookies dont l'attribut path est mis explicitement à " / " seront correctement stocker s'ils ont un attribut expires.
domain=NOM_DE_DOMAINELorsque le client recherche dans sa liste de cookie valide, il effectue une comparaison de chaque attribut domain avec le nom du serveur sur lequel il va effectuer sa requête. Si l'attribut correspond à la partie supérieur du domaine, alors l'attribut path sera consulté afin de déterminer si le cookie doit être transmit. Un attribut domain 'acme.com' correspondrait au nom de serveur 'anvil.acme.com' aussi bien qu'à 'shipping.crate.acme.com'.
Seul les serveur d'un domaine peuvent placé un cookie pour ce domaine et les domaines doivent avoir au moins deux (2) ou trois (3) éléments afin d'interdire la possibilité d'utilisé des domaine de la forme : '.com', '.edu' et 'va.us'. N'importe quel domaine qui ne fait pas partie d'un des sept domaines de niveau supérieur ci-dessous nécessite au minimum deux éléments alors que les autres en nécessitent au moins trois. Les sept domaines de niveau supérieurs sont : 'COM', 'EDU', 'FILET', 'ORG', 'GOV', 'MIL' et 'INT'.
Si l'attribut domain n'est pas spécifié, c'est le nom du serveur qui à transmit le cookie qui sera utilisé.
L'attribut path permet de spécifier le chemin à l'intérieur du domaine pour lequel le cookie est valable. Si un cookie à déjà passé l'étape de la correspondance du domaine, le chemin de l'URL est comparé avec l'attribut path afin de déterminer si le cookie est valable et doit être transmit dans l'entête de la requête. Le chemin '/foo' correspondrait à '/foobar' ainsi qu'à '/foo/bar.html '. Le chemin '/' est la plupart du temp utilisé.
Si l'attribut path n'est pas spécifié, le chemin de la requête est pris par defaut.
Si un cookie contient l'attribut secure, il ne sera transmit que si le canal de communication avec le serveur est sécurisé. Actuellement, cela signifie que les cookies avec cet attribut ne seront transmit qu'en HTTPS (HTTP avec SSL).
Si l'attribut secure n'est pas spécifié, un cookie est libre d'être transmit sans aucunes garanties de sécurités.
En lancant une requête à une URL d'un serveur HTTP, le navigateur du client transmettra tous les cookies correspondant en incluant un élément cookie dans l'entête de cette requête. Voici le format de cette élément cookie :
Cookie : NOM1=CHAINE1 ; NOM2=CHAINE2
De multiple éléments Set-Cookie peuvent être incluent dans un seul entête de réponse du serveur.
Les cookies de même chemin et de nom se recopieront et le dernier aura la priorité. Les cookies de même chemin, mais avec des noms différents ajouteront des configurations complémentaires.
Un cookie ayant un chemin de niveau plus élevé ne tient pas compte d'autres configurations de chemin plus spécifiques. S'il y a des parties multiples pour un nom de cookie, mais avec des chemins différents, tous les cookies correspondant seront transmit (Voir les exemples ci-desous).
La date d'expiration indique également au client qu'il peut purger sa configuration, mais il n'en est pas obligé. Un client peut également supprimer un cookie avant que la date d'expiration ne soit atteinte si de la place doit être faite.
Le client doit transmettre les cookies ayant une configuration de chemin plus spécifique avant les cookies ayant une configuration de chemin moins spécifiques. Par exemple, un cookie 'nom1=foo' avec une configuration de chemin '/' doit être envoyé après un cookie 'nom1=foo2' avec une configuration de chemin '/bar' s'il doivent être envoyé tous les deux.
Il y a des limitations sur le nombres de cookies qu'un client peut stocker. C'est une spécification du nombre de cookies minimum qu'un client doit être préparé à recevoir et stocker.
300 cookies au maximum.
4 kilo-octets par cookies, ou le nom et la valeur du cookie se combine pour former la limite des 4 kilo-octets.
20 cookies par serveur ou domaine (Notez que les hôtes et les domaines sont traités comme des entités séparées et ont cette limitation pour chacun, non combiné)
Les serveurs ne doivent pas s'attendre à ce que des clients soient capables d'exéder ces limites. Quand la limite des 300 cookies ou des 20 cookies par domaines sont exédés, les clients doivent supprimer les cookies employés le moins récemment. Quant on rencontre un cookies de plus de 4 kilo-octets, le cookie doit être coupé, mais le nom du cookie doit rester intact tant qu'il ne dépasse pas les 4 kilo-octets.
Si un serveur veut supprimer un biscuit, il peut le faire en transmettant un cookie de même nom comportant un attribut expire dépassé. Le chemin et le nom du cookie expiré doivent correspondre exactement afin de remplacer le cookie valide. Cette condition est difficile si l'ont ne connaît pas la configuration exact, mais le principe est qu'un cookie être supprimé par son créateur.
Quant un cache HTTP est mis en place, comme peut le faire un proxy, les éléments Set-Cookie de l'entête de réponse du serveur ne doit pas être conservé dans le cache..
Si un serveur proxy recoit une réponse qui contient un entête avec des éléments Set-Cookie, il doit retransmettre les éléments Set-Cookie au client, indépendamment si la réponse est 304 (non modifié) ou 200 (OK).
De la même façon, si une requête de client contient un élément Cookie dans sont entête, il doit être expédié par le proxy, même si la requête est une requête conditionnelle (If-modified-since).