Зарегистрируйтесь, чтобы продолжить обучение

Cookies Протокол HTTP

Механизм работы cookie

Изначально работать с HTTP было не очень просто. Дело в том, что это протокол без сохранения состояния, то есть каждый запрос-ответ не связан с предыдущим запросом-ответом. Это было неудобно, потому что иногда нам приходится запоминать информацию: например об аутентификации пользователя или о товарах в его корзине в интернет-магазине.

Тут возникает проблема: «Как запомнить, что это тот пользователь, с которым мы только что работали?». Решение этой проблемы было найдено когда был придуман механизм, который называется Cookie.

Cookie (еще иначе "веб-куки" или "куки браузера") - это небольшой фрагмент данных, строка, который сервер отправляет веб-браузеру пользователя. Браузер может хранить куки, создавать новые куки, изменять существующие и отправлять их обратно на тот же сервер при последующих запросах.

В этом уроке мы детально разберемся, что такое куки и как они работают.

Как работают куки

Давайте сделаем запрос к сервису HTTP Server и посмотрим, как этот механизм работает

Выполним запрос для получения только заголовков, для этого добавим к запуску curl флаг --head:

curl --head https://http.hexlet.app/http-protocol/example

HTTP/2 200
date: Wed, 02 Oct 2024 15:05:59 GMT
content-type: text/html; charset=ISO-8859-1
accept-ranges: none
cache-control: private, max-age=0
expires: -1
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
set-cookie: 1P_JAR=2020-01-18-09; expires=Mon, 17-Feb-2020 09:24:50 GMT; path=/; domain=.hexlet.app; Secure
set-cookie: NID=196=wsHLMAMfnAaSyF7zduokI8TJeE5UoIKPHYC58HYH93VMnev9Nc2bAjhRdzoc4UhmuOd7ZVCorDnzGDe51yPefsRMeVyOFnYdHYYgQNqI8A1dYuk4pDK4OJurQgL4lX8kiNGSNi_kkUESFQ-MqLCB_YspxA9JRejhZdkTRtGyHNk; expires=Sun, 19-Jul-2020 09:24:50 GMT; path=/; domain=.hexlet.app; HttpOnly
...

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

Изнутри кука представляет собой пару ключ=значение и отделяется от дополнительных параметров точкой с запятой. Куки сохраняются в браузере на клиенте и при следующем запросе он отправляет их обратно на сервер. Непосредственно в браузере они никак не используются.

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

Хорошая аналогия — это как получить номерок в гардеробе и потом вернуть его, чтобы понять какая куртка ваша. При этом сам номерок никакой ценности не представляет, и его нельзя использовать самостоятельно.

Куки используются в основном для трех целей:

  • Управление сессией - хранение данных пользователя
  • Персонализация - пользовательские предпочтения, такие как язык отображения и тема пользовательского интерфейса.
  • Отслеживание - запись и анализ поведения пользователей.

Также куки делятся как минимум на два типа: сессионные и постоянные.

Сессионные куки

Сессионные куки используются для управления сессией, процессом общения клиента и сервера. Клиент отправляет в запросе куку, которую ему выдал сервер. Клиент подтвержает себя, а сервер продолжает с ним сессию. Так можно запоминать любые данные: статус входа пользователя в систему, содержимое корзины, результаты игр.

В примере выше, сессионные куки не устанавливаются - мы видим дополнительные параметры в заголовке set-cookie. У сессионной их нет. Также сессионные куки часто устанавливаются по запросу клиента. Наглядный пример — это механизм работы галочки «запомнить меня». Если вы авторизуетесь и не отметите эту галочку, а потом закроете браузер и снова зайдете на сайт, то будете не авторизованы.

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

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

Время жизни куки

Вернемся к запросу выше. В этом случае устанавливаются постоянные куки. Постоянные куки можно использовать для персонализации пользователя, например, запомнить, что пользователю нужна англоязычная версия сайта. Также эти куки используются для "трекинга", отслеживания пользователя: как и когда он заходит на сайт, переходы на сайте, даже связать пользователя между разными сервисами.

Постоянные куки так называются, потому что сохраняются на жестком диске — место их хранения может быть разным в зависимости от браузера. Такие куки отличаются от сессионных тем, что можно управлять длиной их жизни при помощи параметра expires:

expires=Thu, 16-Jul-2020 03:39:50 GMT;

В параметре expires указывается дата удаления куки, после которой она не будет отсылаться на сервер. Стоит сказать, что есть еще один параметр, который используется для тех же целей — MAX-AGE. В его значении указывается количество секунд, по истечении которых кука будет удалена:

MAX-AGE=2592000;

Так как часть браузеров не поддерживают MAX-AGE, некоторые фреймворки часто устанавливают сразу оба параметра и браузеры просто игнорируют тот, который им не нужен. Таким образом заголовок set-cookie, который содержит два параметра MAX-AGE и expires, считается валидным. В стандарте также говорится, что регистр имени куки не имеет значения.

Параметры domain и path

Также можно установить еще несколько параметров. Параметры domain и path задают область видимости куки — это URL, на которые кука может отправляться. Если они не заданы, то по умолчанию кука будет пересылаться на сервер только для текущего пути и домена. В нашем примере в path указан корень сайта, то есть кука будет отправляться для всех страниц:

domain=.hexlet.app; path=/;

Обратите внимание на одну важную деталь в этом примере. Если установлен domain=.hexlet.app, то кука будет работать не только для всех страниц сайта, но и для всех поддоменов — при этом наличие точки перед именем домена не имеет значения. Если мы совсем не установим параметр domain, то кука для поддоменов работать не будет, хотя по умолчанию значение домена будет hexlet.app.

Уникальность куки определяется тремя параметрами key (имя куки), domain и path. Это значит, что если какую-то куку нужно переустановить, то при следующем запросе в set-cookie эти параметры должны совпадать. Если хотя бы один из них отличается, то будет установлена новая кука.

Удаление куки

Заголовка для удаления куки не существует. Чтобы удалить ее, нужно установить нулевой или отрицательный MAX-AGE, либо задать expires в прошлом, тогда кука будет немедленно удалена.

Куки и безопасность

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

Для предотвращения атак с использованием кук есть несколько подходов:

  • Использовать атрибут HttpOnly для предотвращения доступа к кукам из JavaScript. В нашем примере такой параметр как раз установлен.
  • Важные куки, как кука аутентификации, должны иметь короткое время жизни и атрибут SameSite. Этот атрибут позволяет отправлять куку только внутри одного сайта.

Отправка на сервер

Мы обновляем страницу в браузере. После этого происходит отправка следующего заголовка:

Cookie: GCLB=CLiC7uWajOOrzAE;_hexlet_session2=gu3n8MCidqZ28VfjpzJuF74d4ohla6uYq9Q%2B2XBcalsa3VUCzURBWTXvscuzSI%2BF3lnHAN%2FUt6IJnXgkH%2B6jDKgyStVb8W%2BLHwIbypoxajN3fB5ksFT3Qu28RvDQpL6hBmqq7V2eFdfLMGtkmtcpfAUYNGffwaBAlQyQKnvhkCpEf5IIWkwWfe9Nt8dG3lIueeir9fGxZP7Fpcw9IP9HfgSansgXugtFI1rw06UhgrrK%2BEnaf4EmIgVdH6KYpDBKXpUUXz8vFRvkOMX5j%2BZNMTu%2BKDBzmGlFjcm1mCZl4ozZWDCocFO4CTW7z9LmzKYbcEGkUEhRbOu%2BTvLgVo80LilK--x3y6jxx%2FjYcLp5tr--9nrQ0XmAhtGAuIFvMYvWig%3D%3D

Все куки отправляются одним заголовком в формате key=value; key=value без дополнительных параметров.


Дополнительные материалы

  1. HTTP Cookie / Mozilla
  2. HTTP Куки / Википедия
  3. RFC 6265: стандарт, описывающий cookie
  4. Local Storage vs. Session Storage vs. Cookie

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 13 марта
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 13 марта
профессия
от 14 960 ₸ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 13 марта
профессия
от 25 000 ₸ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 13 марта
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 13 марта
профессия
от 39 525 ₸ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 13 марта
профессия
от 25 000 ₸ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 13 марта
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
Старт 13 марта

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»