Память для протокола без памяти
HTTP по своей природе не помнит предыдущих запросов: каждый запрос сервер воспринимает как новый. Чтобы сайт узнавал вошедшего пользователя и хранил корзину или язык интерфейса, придумали cookie. Это небольшая пара «имя и значение», которую сервер присылает в заголовке Set-Cookie, а браузер сохраняет и добавляет в каждый следующий запрос к тому же сайту в заголовке Cookie.
Поэтому cookie не программа и не вирус, а просто текстовая запись. Размер одной невелик, порядка четырёх килобайт. Сами по себе они ничего не выполняют, но могут быть использованы для слежки, если содержат идентификатор. Как устроен протокол, описано в статье про HTTP.
Виды по сроку и по владельцу
По сроку жизни различают сессионные cookie, которые удаляются при закрытии браузера, и постоянные, у которых задана дата окончания или время жизни в секундах. Вход в аккаунт с галочкой «запомнить меня» обычно работает через постоянные.
По владельцу выделяют собственные cookie, которые ставит сайт, открытый в адресной строке, и сторонние, которые ставят другие домены, например встроенные виджеты, реклама или счётчики. Именно сторонние позволяют рекламной сети узнавать вас на разных сайтах. Поэтому многие браузеры ограничивают или блокируют их по умолчанию, а Safari и Firefox делают это давно.
Отдельно существуют технически необходимые cookie: сессия, корзина, защита от подделки запросов.
Атрибуты, влияющие на безопасность
У cookie есть параметры, которые заметно меняют её свойства. Secure разрешает отправлять её только по HTTPS. HttpOnly скрывает cookie от скриптов на странице, и это осложняет кражу сессии через XSS-атаку. SameSite ограничивает отправку cookie при межсайтовых запросах: значение Lax или Strict помогает защититься от CSRF-подделок.
Атрибуты Domain и Path определяют, на какие адреса cookie будет отправляться. Ошибки здесь приводят к утечке: слишком широкая область позволяет чужому поддомену читать значение. Если cookie содержит идентификатор сессии, кража этого значения даёт злоумышленнику вход без пароля, о чём подробнее написано в материале про перехват сессии.
Cookie и приватность
Идентификатор в сторонней cookie позволяет собирать историю посещений сайтов, где встроен один и тот же трекер. Из этого строят рекламные профили. Ответом на это стали законы, требующие согласия на нефункциональные cookie, поэтому вы видите баннеры на сайтах, и ограничения в браузерах.
Однако удаление cookie не делает вас невидимым. Существуют другие способы узнавания: отпечаток браузера, идентификаторы в адресе, данные в локальном хранилище браузера, а также рекламные идентификаторы в мобильных системах. Более того, вход в аккаунт связывает ваши действия независимо от cookie. Подробнее о слежении в разделе про рекламный идентификатор.
Как посмотреть и очистить у себя
В Chrome и Firefox откройте инструменты разработчика, вкладку «Приложение» или «Хранилище», и раздел cookie: там видны имя, значение, срок жизни и флаги для каждого сайта. В настройках приватности можно посмотреть общий список, удалить cookie отдельного сайта или очистить всё сразу.
Учтите последствия: после удаления вы выйдете из аккаунтов, а настройки сайтов пропадут. Разумный минимум — блокировать сторонние cookie и периодически чистить накопившееся. Режим приватного просмотра удаляет cookie при закрытии окна, но не скрывает вас от провайдера и самого сайта.
Другие способы хранения на стороне браузера
Помимо cookie, у страницы есть иные места для хранения данных. Локальное хранилище и хранилище сессии позволяют записать значения объёмом в несколько мегабайт, но не отправляются на сервер автоматически. IndexedDB хранит структурированные данные для офлайн-приложений. Кэш содержит файлы для ускорения загрузки. Все они очищаются вместе с данными сайта в настройках браузера. Поэтому если вы хотите по-настоящему забыть сайт, недостаточно удалить только cookie: очищайте данные сайта целиком, а для регулярной защиты используйте фильтрацию сторонних трекеров.