Как куки передаются по протоколу HTTP?


Ответы:


296

Сервер отправляет следующее в своем заголовке ответа, чтобы установить поле cookie.

Set-Cookie:имя =значение

Если есть набор файлов cookie, браузер отправляет следующее в заголовке запроса.

Cookie:имя =значение

См. Статью HTTP Cookie в Википедии для получения дополнительной информации.


Правда ли, что cookie работают только с глаголом GET / POST, но не CONNECT?
PerlDev

5
@PerlDev В rfc2109 я не вижу ничего такого, что говорит о том, что он не должен работать с запросами, отличными от GET / POST, но я подозреваю, что реализации браузера и сервера могут не реализовывать его в этих случаях.
2012 года

5
Обратите внимание, что в соответствии с RFC 2109, если пользовательский агент или браузер отправляет несколько файлов cookie, он помещает их в одно поле, разделенное точками с запятой:Cookie: name1=value1; name2=value2; ...
jotrocken

34

Файлы cookie передаются в виде заголовков HTTP как в запросе (клиент -> сервер), так и в ответе (сервер -> клиент).


2
Таким образом, в любом запросе все куки отправляются ipso facto?
BKSpurgeon

32

Помимо того, что написано в других ответах, в заголовке ответа Set-Cookie также передаются другие подробности, связанные с путем cookie, максимальным возрастом cookie, независимо от того, защищен он или нет. Например:

Set-Cookie:имя =значение [ ; expires=дата ] [ ; domain=домен ] [ ; path=путь ] [ ; secure]


Однако не все эти данные передаются обратно на сервер клиентом при выполнении следующего HTTP-запроса.

Вы также можете установить HttpOnlyфлаг в конце вашего cookie, чтобы указать, что ваш cookie является httponly и к нему нельзя разрешать доступ, в сценариях с помощью кода javascript. Это помогает предотвратить атаки, такие как перехват сеансов.

Для получения дополнительной информации см. RFC 2109 . Также взгляните на статью Николаса С. Закаса, объясняются файлы cookie HTTP .


2
Вот прямая ссылка на статью Закаса, а не обратная ссылка: humanwhocodes.com/blog/2009/05/05/http-cookies-explained
Джозеф Дикстра

13

создать пример сценария как:

#!/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"

затем сделайте исполняемый файл и выполните так.

./resp | nc -l -p 12346

откройте браузер и просмотрите URL: http: // localhost: 1236, вы увидите значение Cookie, отправленное браузером

    [aaa @ bbbbbbbb] $ ./resp | nc -l -p 12346
    GET / HTTP / 1.1
    Хост: xxx.xxx.xxx.xxx:12346
    Подключение: keep-alive
    Cache-Control: max-age = 0
    Принять: текст / html, приложение / xhtml + xml, приложение / xml; q = 0,9, изображение / webp, * / *; q = 0,8
    Обновление небезопасных запросов: 1
    Пользователь-агент: Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 49.0.2623.112 Safari / 537.36
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: en-US, en; q = 0,8, ru; q = 0,6
    Cookie: имя = F

3
Что делать, если есть несколько файлов cookie? Они разделены запятыми?
Марк Буйкема

думаю, что они установлены как новое печенье. Cookie: имя = F Cookie: имя = A
EAzevedo

2
@MarkBuikema, см. Docs.microsoft.com/en-us/windows/desktop/wininet/http-cookies . Они отправляются следующим образом: Cookie: <имя> = <значение> [; <имя> = <значение>] ...
Бен Уилер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.