Это устаревший подход к хранению данных на клиентском компьютере; он был единственным вариантом веб-хранилища до HTML5.

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

Как работают cookies:

  1. Клиент (веб-браузер) посылает серверу запрос (запрашивает у него страницу). Если в браузере есть cookies, связанные с этим сайтом, то он их посылает серверу в составе этого запроса.
  2. Сервер получает запрос от клиента. Если в составе запроса есть куки, то их можно использовать для выполнения некоторой логики на сервере, подготовки пользователю персонализированной страницы или для чего-то другого. После этого отправляется клиенту ответ. В заголовке ответа веб-браузеру отправляются cookies, которые ему нужно будет сохранить. Куки обычно устанавливаются веб-сервером при помощи заголовка Set-Cookie.
  3. Веб-браузер (клиент) получает ответ от сервера (страницу) и выводит его пользователю. Куки, которые пришли с сервера, браузер сохраняет в своё хранилище.

Минимальное описание поля Set-Cookie HTTP заголовка:

Set-Cookie: NAME=VALUE;

NAME - имя cookie, VALUE - значение.

Посмотреть куки в браузере можно в инструментах разработчика (F12 в Chrome) во вкладке "Application":

cookies в chrome

Файлы cookie также можно создавать, обновлять или считывать с помощью JavaScript: document.cookie. Флаг HTTPOnly может использоваться для ограничения доступа к файлам cookie в JavaScript для смягчения некоторых проблем безопасности - например, межсайтового скриптинга (файлы cookie доступны только для серверов).

Атрибуты cookie

expires=DATE - время хранения cookie, т.е. вместо DATE должна стоять дата в формате "expires=Monday, DD-Mon-YYYY HH:MM:SS GMT", после которой истекает время хранения cookie. Если этот атрибут не указан, то cookie хранится в течение одного сеанса, до закрытия браузера.

max-age=DIGIT - альтернатива expires, определяет DIGIT - срок действия куки в секундах с текущего момента. Если задан ноль или отрицательное значение, то cookie будет удалена.

domain=DOMAIN_NAME - домен, для которого значение cookie действительно. Например, domain=fruntend.com. В этом случае значение cookie будет действительно и для домена fruntend.com, и для www.fruntend.com.

path=PATH - URL-префикс пути, для страниц которого куки будут доступны. Должен быть абсолютным. Это значит что если установлено path=/admin, то куки будут доступны на страницах /admin или /admin/page, но не на страницах типа /home.

secure - означает, что куки следует передавать только по HTTPS-протоколу.

httpOnly - запрещает любой доступ к куки из JavaScript.

sameSite=Strict - куки никогда не отправятся, если пользователь пришёл не с этого же сайта.

sameSite=Lax - то же, что и Strict, но добавляет исключения для безопасных HTTP-методов и если операция изменяет URL в адресной строке браузера.

Куки могут содержать как один атрибут:

Set-Cookie: TESTNAME=IVAN; Max-Age=3600

так и несколько:

Set-Cookie: TESTNAME=IVAN; domain=fruntend.com; secure; httpOnly

Существует два типа файлов cookie: сессионные файлы cookie и постоянные файлы cookie.

Сессионные cookie

Сессионные файлы cookie не содержат атрибутов expires или max-age и удаляются при закрытии браузера.

Постоянные cookie

Постоянные файлы cookie содержат атрибуты expires или max-age. Срок действия файлов cookie не истекает при закрытии браузера, но истекает в определенную дату (expires) или через определенный промежуток времени (max-age).

Ограничение для файлов cookie

  • Можно хранить только 4 КБ данных - этот лимит может немного отличаться в зависимости от браузера.
  • Количество файлов cookie, разрешенных в домене, ограничено в зависимости от браузера (например, 20).
  • Общее количество файлов cookie в доменах ограничено (например, 300). Самый старый файл cookie удаляется после достижения лимита, чтобы сохранить новый файл cookie. Число зависит от браузера.
  • Данные cookie отправляются на сервер при каждом запросе. Это вызывает дополнительную нагрузку и влияет на производительность.
  • Разрешен обмен данными с третьими сторонами (например, сторонние файлы cookie)

Файлы cookie приводят к множеству проблем с безопасностью, поэтому рекомендуется использовать современные API хранилища везде, где это возможно.