Comment les cookies sont-ils passés dans le protocole HTTP?


Réponses:


296

Le serveur envoie ce qui suit dans son en-tête de réponse pour définir un champ de cookie.

Set-Cookie:valeur du nom=

S'il y a un cookie, le navigateur envoie ce qui suit dans son en-tête de demande.

Cookie:valeur du nom=

Voir l' article sur les cookies HTTP sur Wikipedia pour plus d'informations.


Est-il vrai que le cookie ne fonctionne qu'avec le verbe GET / POST, mais pas CONNECT?
PerlDev

5
@PerlDev Il n'y a rien que je puisse voir dans rfc2109 qui dit qu'il ne devrait pas fonctionner avec des requêtes autres que GET / POST, mais je soupçonne que les implémentations du navigateur et du serveur peuvent ne pas l'implémenter dans ces cas.
deinst

5
Notez que selon la RFC 2109 si un agent utilisateur ou un navigateur envoie plusieurs cookies, il les placera dans un seul champ délimité par des points-virgules:Cookie: name1=value1; name2=value2; ...
jotrocken

34

Les cookies sont transmis en tant qu'en-têtes HTTP, à la fois dans la demande (client -> serveur) et dans la réponse (serveur -> client).


2
donc dans toute demande qui est faite, tous les cookies sont-ils ipso facto envoyés?
BKSpurgeon

32

Outre ce qu'il est écrit dans d'autres réponses, d'autres détails liés au chemin du cookie, à l'âge maximal du cookie, qu'il soit sécurisé ou non, sont également transmis dans l'en-tête de réponse Set-Cookie. Par exemple:

Set-Cookie:=valeur du nom [ ; expires=date ] [ ; domain=domaine ] [ ; path=chemin d'accès ] [ ; secure]


Cependant, tous ces détails ne sont pas renvoyés au serveur par le client lors de la prochaine requête HTTP.

Vous pouvez également définir un HttpOnlyindicateur à la fin de votre cookie, pour indiquer que votre cookie est httponly et ne doit pas être accessible, dans les scripts par code javascript. Cela aide à prévenir les attaques telles que le détournement de session.

Pour plus d'informations, voir RFC 2109 . Jetez également un œil à l'article de Nicholas C. Zakas, les cookies HTTP expliqués .


2
Voici un lien direct vers l'article de Zakas, plutôt qu'un lien de retour
Joseph Dykstra

13

créer un exemple de script comme resp:

#!/bin/bash

http_code=200
mime=text/html

echo -e "HTTP/1.1 $http_code OK\r"
echo "Content-type: $mime"
echo
echo "Set-Cookie: name=F"

puis rendez exécutable et exécutez comme ceci.

./resp | nc -l -p 12346

ouvrez le navigateur et parcourez l'URL: http: // localhost: 1236, vous verrez la valeur du cookie qui est envoyée par le navigateur

    [aaa @ bbbbbbbb] $ ./resp | nc -l -p 12346
    GET / HTTP / 1.1
    Hôte: xxx.xxx.xxx.xxx:12346
    Connexion: garder en vie
    Cache-Control: max-age = 0
    Accepter: texte / html, application / xhtml + xml, application / xml; q = 0,9, image / webp, * / *; q = 0,8
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 537.36 (KHTML, comme Gecko) Chrome / 49.0.2623.112 Safari / 537.36
    Accept-Encoding: gzip, dégonfler, sdch
    Accept-Language: en-US, en; q = 0,8, ru; q = 0,6
    Cookie: nom = F

3
Et s'il y a plusieurs cookies? Sont-ils séparés par des virgules?
Mark Buikema

pense qu'ils sont définis comme un nouveau cookie. Cookie: nom = F Cookie: nom = A
EAzevedo

2
@MarkBuikema, voir docs.microsoft.com/en-us/windows/desktop/wininet/http-cookies . Ils sont envoyés comme: Cookie: <name> = <value> [; <name> = <value>] ...
Ben Wheeler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.