HTML Diff
3 added 3 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Изначально работать с HTTP было не очень просто. Дело в том, что это протокол без сохранения состояния, то есть каждый запрос-ответ не связан с предыдущим запросом-ответом. Это было неудобно, потому что иногда нам приходится запоминать информацию: например об аутентификации пользователя или о товарах в его корзине в интернет-магазине.</p>
1 <p>Изначально работать с HTTP было не очень просто. Дело в том, что это протокол без сохранения состояния, то есть каждый запрос-ответ не связан с предыдущим запросом-ответом. Это было неудобно, потому что иногда нам приходится запоминать информацию: например об аутентификации пользователя или о товарах в его корзине в интернет-магазине.</p>
2 <p>Тут возникает проблема: "Как запомнить, что это тот пользователь, с которым мы только что работали?". Решение этой проблемы было найдено когда был придуман механизм, который называется<strong>Cookie</strong>.</p>
2 <p>Тут возникает проблема: "Как запомнить, что это тот пользователь, с которым мы только что работали?". Решение этой проблемы было найдено когда был придуман механизм, который называется<strong>Cookie</strong>.</p>
3 <p>Cookie (еще иначе "веб-куки" или "куки браузера") - это небольшой фрагмент данных, строка, который сервер отправляет веб-браузеру пользователя. Браузер может хранить куки, создавать новые куки, изменять существующие и отправлять их обратно на тот же сервер при последующих запросах.</p>
3 <p>Cookie (еще иначе "веб-куки" или "куки браузера") - это небольшой фрагмент данных, строка, который сервер отправляет веб-браузеру пользователя. Браузер может хранить куки, создавать новые куки, изменять существующие и отправлять их обратно на тот же сервер при последующих запросах.</p>
4 <p>В этом уроке мы детально разберемся, что такое куки и как они работают.</p>
4 <p>В этом уроке мы детально разберемся, что такое куки и как они работают.</p>
5 <h2>Как работают куки</h2>
5 <h2>Как работают куки</h2>
6 <p>Давайте сделаем запрос к сервису<a>HTTP Server</a>и посмотрим, как этот механизм работает</p>
6 <p>Давайте сделаем запрос к сервису<a>HTTP Server</a>и посмотрим, как этот механизм работает</p>
7 <p>Выполним запрос для получения только заголовков, для этого добавим к запуску<em>curl</em>флаг<em>--head</em>:</p>
7 <p>Выполним запрос для получения только заголовков, для этого добавим к запуску<em>curl</em>флаг<em>--head</em>:</p>
8 <p>Мы видим два заголовка, которые занимаются установкой cookie -<em>set-cookie</em>. Обратите внимание, что каждая cookie посылается в отдельном заголовке. Таких заголовков может быть достаточно много.</p>
8 <p>Мы видим два заголовка, которые занимаются установкой cookie -<em>set-cookie</em>. Обратите внимание, что каждая cookie посылается в отдельном заголовке. Таких заголовков может быть достаточно много.</p>
9 <p>Изнутри кука представляет собой пару<em>ключ=значение</em>и отделяется от дополнительных параметров точкой с запятой. Куки сохраняются в браузере на клиенте и при следующем запросе он отправляет их обратно на сервер. Непосредственно в браузере они никак не используются.</p>
9 <p>Изнутри кука представляет собой пару<em>ключ=значение</em>и отделяется от дополнительных параметров точкой с запятой. Куки сохраняются в браузере на клиенте и при следующем запросе он отправляет их обратно на сервер. Непосредственно в браузере они никак не используются.</p>
10 <p>Сам сервер использует куку для определения того, поступают ли разные запросы от одного и того же браузера или пользователя, и затем выдает персонализированный или общий ответ в зависимости от ситуации.</p>
10 <p>Сам сервер использует куку для определения того, поступают ли разные запросы от одного и того же браузера или пользователя, и затем выдает персонализированный или общий ответ в зависимости от ситуации.</p>
11 <p>Хорошая аналогия - это как получить номерок в гардеробе и потом вернуть его, чтобы понять какая куртка ваша. При этом сам номерок никакой ценности не представляет, и его нельзя использовать самостоятельно.</p>
11 <p>Хорошая аналогия - это как получить номерок в гардеробе и потом вернуть его, чтобы понять какая куртка ваша. При этом сам номерок никакой ценности не представляет, и его нельзя использовать самостоятельно.</p>
12 <p>Куки используются в основном для трех целей:</p>
12 <p>Куки используются в основном для трех целей:</p>
13 <ul><li>Управление сессией - хранение данных пользователя</li>
13 <ul><li>Управление сессией - хранение данных пользователя</li>
14 <li>Персонализация - пользовательские предпочтения, такие как язык отображения и тема пользовательского интерфейса.</li>
14 <li>Персонализация - пользовательские предпочтения, такие как язык отображения и тема пользовательского интерфейса.</li>
15 <li>Отслеживание - запись и анализ поведения пользователей.</li>
15 <li>Отслеживание - запись и анализ поведения пользователей.</li>
16 </ul><p>Также куки делятся как минимум на два типа: сессионные и постоянные.</p>
16 </ul><p>Также куки делятся как минимум на два типа: сессионные и постоянные.</p>
17 <h3>Сессионные куки</h3>
17 <h3>Сессионные куки</h3>
18 <p><strong>Сессионные куки</strong>используются для управления сессией, процессом общения клиента и сервера. Клиент отправляет в запросе куку, которую ему выдал сервер. Клиент подтвержает себя, а сервер продолжает с ним сессию. Так можно запоминать любые данные: статус входа пользователя в систему, содержимое корзины, результаты игр.</p>
18 <p><strong>Сессионные куки</strong>используются для управления сессией, процессом общения клиента и сервера. Клиент отправляет в запросе куку, которую ему выдал сервер. Клиент подтвержает себя, а сервер продолжает с ним сессию. Так можно запоминать любые данные: статус входа пользователя в систему, содержимое корзины, результаты игр.</p>
19 - <p>В примере выше, сессионные куки не устанавливаются - мы видим дополнительные параметры в заголовке<em>set-cookie</em>. У сессионной их нет. Также сессионные куки часто устанавливаются по запросу клиента. Наглядный пример - это механизм работы галочки "запомнить меня". Если вы авторизуетесь и не отметите эту галочку, а потом закроете браузер и снова зайдете на сайт, то будете не авторизованы.</p>
19 + <p>В примере выше, сессионные куки не устанавливаются - мы видим дополнительные параметры в заголовке<em>set-cookie</em>. У сессионной их нет. Сессионные куки удаляются при закрытии браузера. Механизм работы галочки "запомнить меня" обычно реализуется постоянной кукой, чтобы сохранять авторизацию между сессиями.</p>
20 <p>Также важно помнить, что в отличие от постоянных кук, сессионные удаляются при закрытии браузера.</p>
20 <p>Также важно помнить, что в отличие от постоянных кук, сессионные удаляются при закрытии браузера.</p>
21 <h3>Постоянные куки</h3>
21 <h3>Постоянные куки</h3>
22 <p>Вернемся к запросу выше. В этом случае устанавливаются<strong>постоянные куки</strong>. Постоянные куки можно использовать для персонализации пользователя, например, запомнить, что пользователю нужна англоязычная версия сайта. Также эти куки используются для "трекинга", отслеживания пользователя: как и когда он заходит на сайт, переходы на сайте, даже связать пользователя между разными сервисами.</p>
22 <p>Вернемся к запросу выше. В этом случае устанавливаются<strong>постоянные куки</strong>. Постоянные куки можно использовать для персонализации пользователя, например, запомнить, что пользователю нужна англоязычная версия сайта. Также эти куки используются для "трекинга", отслеживания пользователя: как и когда он заходит на сайт, переходы на сайте, даже связать пользователя между разными сервисами.</p>
23 <p>Постоянные куки так называются, потому что сохраняются на жестком диске - место их хранения может быть разным в зависимости от браузера. Такие куки отличаются от сессионных тем, что можно управлять длиной их жизни при помощи параметра<em>expires</em>:</p>
23 <p>Постоянные куки так называются, потому что сохраняются на жестком диске - место их хранения может быть разным в зависимости от браузера. Такие куки отличаются от сессионных тем, что можно управлять длиной их жизни при помощи параметра<em>expires</em>:</p>
24 <p>В параметре<em>expires</em>указывается дата удаления куки, после которой она не будет отсылаться на сервер. Стоит сказать, что есть еще один параметр, который используется для тех же целей -<em>MAX-AGE</em>. В его значении указывается количество секунд, по истечении которых кука будет удалена:</p>
24 <p>В параметре<em>expires</em>указывается дата удаления куки, после которой она не будет отсылаться на сервер. Стоит сказать, что есть еще один параметр, который используется для тех же целей -<em>MAX-AGE</em>. В его значении указывается количество секунд, по истечении которых кука будет удалена:</p>
25 <p>Так как часть браузеров не поддерживают<em>MAX-AGE</em>, некоторые фреймворки часто устанавливают сразу оба параметра и браузеры просто игнорируют тот, который им не нужен. Таким образом заголовок<em>set-cookie</em>, который содержит два параметра<em>MAX-AGE</em>и<em>expires</em>, считается валидным. В стандарте также говорится, что регистр имени куки не имеет значения.</p>
25 <p>Так как часть браузеров не поддерживают<em>MAX-AGE</em>, некоторые фреймворки часто устанавливают сразу оба параметра и браузеры просто игнорируют тот, который им не нужен. Таким образом заголовок<em>set-cookie</em>, который содержит два параметра<em>MAX-AGE</em>и<em>expires</em>, считается валидным. В стандарте также говорится, что регистр имени куки не имеет значения.</p>
26 <h2>Параметры domain и path</h2>
26 <h2>Параметры domain и path</h2>
27 <p>Также можно установить еще несколько параметров. Параметры<em>domain</em>и<em>path</em>задают<strong>область видимости куки</strong>- это URL, на которые кука может отправляться. Если они не заданы, то по умолчанию кука будет пересылаться на сервер только для текущего пути и домена. В нашем примере в<em>path</em>указан корень сайта, то есть кука будет отправляться для всех страниц:</p>
27 <p>Также можно установить еще несколько параметров. Параметры<em>domain</em>и<em>path</em>задают<strong>область видимости куки</strong>- это URL, на которые кука может отправляться. Если они не заданы, то по умолчанию кука будет пересылаться на сервер только для текущего пути и домена. В нашем примере в<em>path</em>указан корень сайта, то есть кука будет отправляться для всех страниц:</p>
28 <p>Обратите внимание на одну важную деталь в этом примере. Если установлен<em>domain=.hexlet.app</em>, то кука будет работать не только для всех страниц сайта, но и для всех поддоменов - при этом наличие точки перед именем домена не имеет значения. Если мы совсем не установим параметр<em>domain</em>, то кука для поддоменов работать не будет, хотя по умолчанию значение домена будет<em>hexlet.app</em>.</p>
28 <p>Обратите внимание на одну важную деталь в этом примере. Если установлен<em>domain=.hexlet.app</em>, то кука будет работать не только для всех страниц сайта, но и для всех поддоменов - при этом наличие точки перед именем домена не имеет значения. Если мы совсем не установим параметр<em>domain</em>, то кука для поддоменов работать не будет, хотя по умолчанию значение домена будет<em>hexlet.app</em>.</p>
29 - <p>Уникальность куки определяется тремя параметрами<em>key</em>(имя куки),<em>domain</em>и<em>path</em>. Это значит, что если какую-то куку нужно переустановить, то при следующем запросе в<em>set-cookie</em>эти параметры должны совпадать. Если хотя бы один из них отличаетя, то будет установлена новая кука.</p>
29 + <p>Уникальность куки определяется тремя параметрами<em>key</em>(имя куки),<em>domain</em>и<em>path</em>. Это значит, что если какую-то куку нужно переустановить, то при следующем запросе в<em>set-cookie</em>эти параметры должны совпадать. Если хотя бы один из них отличается, то будет установлена новая кука.</p>
30 <h2>Удаление куки</h2>
30 <h2>Удаление куки</h2>
31 <p>Заголовка для удаления куки не существует. Чтобы удалить ее, нужно установить нулевой или отрицательный<em>MAX-AGE</em>, либо задать<em>expires</em>в прошлом, тогда кука будет немедленно удалена.</p>
31 <p>Заголовка для удаления куки не существует. Чтобы удалить ее, нужно установить нулевой или отрицательный<em>MAX-AGE</em>, либо задать<em>expires</em>в прошлом, тогда кука будет немедленно удалена.</p>
32 <h2>Куки и безопасность</h2>
32 <h2>Куки и безопасность</h2>
33 - <p>Основное назначение кук, аутентификация пользователя, открывает и потенциальную узявимость. Если злоумышленник украдет куку, и она будет все еще действительна, то сервер примет его за клиента.</p>
33 + <p>Основное назначение кук, аутентификация пользователя, открывает и потенциальную уязвимость. Если злоумышленник украдет куку, и она будет все еще действительна, то сервер примет его за клиента.</p>
34 <p>Для предотвращения атак с использованием кук есть несколько подходов:</p>
34 <p>Для предотвращения атак с использованием кук есть несколько подходов:</p>
35 <ul><li>Использовать атрибут HttpOnly для предотвращения доступа к кукам из JavaScript. В нашем примере такой параметр как раз установлен.</li>
35 <ul><li>Использовать атрибут HttpOnly для предотвращения доступа к кукам из JavaScript. В нашем примере такой параметр как раз установлен.</li>
36 <li>Важные куки, как кука аутентификации, должны иметь короткое время жизни и атрибут SameSite. Этот атрибут позволяет отправлять куку только внутри одного сайта.</li>
36 <li>Важные куки, как кука аутентификации, должны иметь короткое время жизни и атрибут SameSite. Этот атрибут позволяет отправлять куку только внутри одного сайта.</li>
37 </ul><h2>Отправка на сервер</h2>
37 </ul><h2>Отправка на сервер</h2>
38 <p>Мы обновляем страницу в браузере. После этого происходит отправка следующего заголовка:</p>
38 <p>Мы обновляем страницу в браузере. После этого происходит отправка следующего заголовка:</p>
39 <p>Все куки отправляются одним заголовком в формате<em>key=value; key=value</em>без дополнительных параметров.</p>
39 <p>Все куки отправляются одним заголовком в формате<em>key=value; key=value</em>без дополнительных параметров.</p>