Это устаревший подход к хранению данных на клиентском компьютере; он был единственным вариантом веб-хранилища до HTML5.
Файлы cookie хранят данные на стороне клиента, чтобы обеспечить индивидуальный подход для посетителей веб-сайта. Файлы cookie создаются на сервере и отправляются клиенту в ответ, а данные меняются сервером при каждом запросе. Серверы могут использовать данные cookie для отправки пользователям персонализированного контента.
Как работают cookies:
- Клиент (веб-браузер) посылает серверу запрос (запрашивает у него страницу). Если в браузере есть cookies, связанные с этим сайтом, то он их посылает серверу в составе этого запроса.
- Сервер получает запрос от клиента. Если в составе запроса есть куки, то их можно использовать для выполнения некоторой логики на сервере, подготовки пользователю персонализированной страницы или для чего-то другого. После этого отправляется клиенту ответ. В заголовке ответа веб-браузеру отправляются cookies, которые ему нужно будет сохранить. Куки обычно устанавливаются веб-сервером при помощи заголовка Set-Cookie.
- Веб-браузер (клиент) получает ответ от сервера (страницу) и выводит его пользователю. Куки, которые пришли с сервера, браузер сохраняет в своё хранилище.
Минимальное описание поля Set-Cookie HTTP заголовка:
Set-Cookie: NAME=VALUE;
NAME - имя cookie, VALUE - значение.
Посмотреть куки в браузере можно в инструментах разработчика (F12 в Chrome) во вкладке "Application":
Файлы 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 хранилища везде, где это возможно.