Ультимативный гайд по HTTP. Cookies и CORS
Привет! Меня зовут Ивасюта Алексей, я техлид команды Bricks в Авито в кластере Architecture, а это мой цикл статей о протоколе HTTP. В первой части мы уже познакомились с версией протокола 1.0 и поговорили о структуре ответов и запросов. Теперь пришло время узнать, что такое Cookies и для чего нужен CORS.

Cookies
HTTP — это протокол без сохранения состояния. Это значит, что когда на сервер поступают два запроса, он не понимает: их послал один клиент или разные. В реальных приложениях постоянно надо идентифицировать пользователя: проверять, авторизован ли он, выводить пользовательские рекомендации, хранить корзину выбранных товаров в магазине. Для этого есть механизм Cookies.
Cookies — это фрагмент данных, в которых сервер передаёт важную информацию о клиенте. Браузер получает этот фрагмент, сохраняет его и с каждым последующим запросом отсылает обратно на сервер. Так он понимает, от какого клиента пришёл запрос.
Куки выглядят, как пара ключ=значение . Для их установки сервер должен в ответе на запрос клиента прислать заголовок Set-Cookie со значением.
Как только браузер получит его в ответ на запрос, он сохранит значение куки в Cookie Storage. В каждый последующий запрос браузер будет добавлять сохранённые значения в заголовке Cookie .
Пример выше — это сессионный куки, для них не указываются сроки хранения. Он будет существовать, пока пользователь не закроет вкладку с сайтом в браузере. Но многие браузеры используют механизм восстановления сессий, поэтому сессионные куки теоретически могут жить вечно.
Обычно кукам устанавливается фиксированное время жизни. Это можно сделать двумя способами:
установить дату истечения срока годности — Expires ,
установить количество секунд, по истечении которых кука перестанет быть актуальной — MAX_AGE .
Допустим, срок жизни куки из предыдущего примера должен истечь 1 января 2030 года. Тогда нужно прислать заголовок со значением куки и датой истечения срока годности, разделёнными точкой с запятой.
Теперь с наступлением 1 января 2030 года кука станет невалидной и удалится.
В альтернативном варианте срок жизни куки должен истечь через две минуты. Тогда вместо даты нужно прислать количество секунд в параметре MAX_AGE :
Разные браузеры могут использовать разные параметры для установки времени жизни куки. Поэтому зачастую сервер присылает оба варианта, а браузер сам выбирает поддерживаемый параметр.
Стандарт RFC6265 1 , описывает куки. Он закрепляет правило, что имена параметров — регистронезависимые. Поэтому эта запись тоже будет валидной:
Область видимости Cookies
Параметры domain и path управляют областью видимости куки и определяют, на каких поддоменах и для каких URL они будут работать. Если не указать параметр domain , то он по умолчанию будет равен хосту сайта, например, example.com. Тогда куки не будут работать для поддоменов, например, test.example.com . Если указать значение domain , то куки будет работать для хоста и всех поддоменов.
Параметр path указывает, по каким URL при запросе ресурсов необходимо передавать куку в заголовке. Если установить path=/ , то куки будут отправляться для всех запросов. Если указать значение path=/api , то они будут передаваться для всех запросов на ресурсы, URL которых начинается с /api .
Расширим предыдущий пример:
Уникальный идентификатор куки — их ключ (в примере — token), значения domain и path . Если нужно переопределить значение ранее установленных куки, то эти три параметра должны совпадать. В противном случае браузер создаст новые. А ещё не существует метода для удаления куки. Можно только установить её повторно и указать дату истечения срока годности expires в прошлом или нулевой или отрицательный max_age .
Защита Cookies
Куки представляют два параметра, которые защищают их от различных атак.
Параметр secure говорит о том, что такие куки будут отсылаться только по HTTPS-соединению. Если сайт работает по HTTP, то значение не будет передано. Secure не обеспечивает дополнительного шифрования, поэтому не стоит хранить чувствительные данные в куках.
Параметр httpOnly создаёт куки, к которым нельзя обратиться из кода JavaScript в браузере. Так можно избежать XSS-атак. 2
Отправка на сервер
Куки отправляются на сервер при каждом запросе, если не подошла их дата истечения срока годности и параметры path и domain соответствует URL ресурса. Они передаются одной строкой в значении заголовка запроса Cookie и разделяются точкой с запятой.
Директива Евросоюза о Cookie
25 мая 2011 года в силу вступила Директива 2009/136/EC Евросоюза о куки. 3 Она требует запрашивать разрешение пользователя на получение и использование информации с его компьютера. Поэтому почти каждый сайт при первом посещении или после очистки кеша выводит баннер с запросом на использование Cookies.
По умолчанию в браузере действует политика безопасности Same Origin Policy. Это означает, что доступ к ресурсам можно получить, только если источник этих ресурсов и источник запроса совпадают. Это сделано для того, чтобы некий сайт хакеров evil.com не мог получить доступ, например, к почтовому ящику на домене gmail.com и прочитать письма. Эта стратегия работала долгое время, когда JavaScript считался браузерным языком для украшения страничек и не умел делать AJAX-запросы.
Со временем разработчики поняли, что хотят уметь отправлять данные на сервер и получать их при помощи асинхронных запросов. Но политика Same Origin не позволяет сделать этого. После долгих обсуждений был предложен механизм CORS — Cross-Origin Resource Sharing.
Этот механизм использует дополнительные HTTP-заголовки. С ним браузер пользователя получает разрешения на доступ к выбранным ресурсам, если домен сайта и домен запрашиваемого ресурса отличаются.
Например, сайт находится на домене example.com . Запрос отправляется на сайт, который находится на домене web-server.com . Для начала браузер должен понять, сложный этот запрос или простой. Простой запрос отправляется методом GET , POST или HEAD и содержит только следующие заголовки:
Content-Type со значением application/x-www-form-urlencoded , multipart/form-data или text/plain .
Остальные запросы считаются сложными. Например, если он отправляется методом DELETE или содержит заголовок Authorization . Простые запросы браузер отправляет напрямую на сервер и автоматически добавляет к ним заголовок Origin . Его значение равно URL хоста, с которого отправляется запрос. В нашем примере это Origin: https://example.com .
Сервер принимает такой запрос и определяет, разрешить хосту получить этот ресурс или отказать в запросе. Для этого в ответе используется специальный заголовок Access-Control-Allow-Origin . Он определяет, с каких источников разрешено принимать запросы. Если указать Access-Control-Allow-Origin: http://example.com , то запрос на ресурс будет всегда разрешён только домену example.com . Если нужно разрешить получать ресурс с любого домена, то в ответе на запрос должен быть заголовок Access-Control-Allow-Origin: * .
Браузер заблокирует ответ на запрос, если:
сервер вернёт в ответе заголовок Access-Control-Allow-Origin: null ,
значение не будет совпадать с переданным в заголовке запроса Origin ,
не будет заголовка.
Если браузер обнаружит сложный запрос, то сначала отправит серверу preflight — предварительный запроc при помощи HTTP-метода OPTIONS . В запрос при этом добавляется заголовок Access-Control-Request-Method , в значении которого указывается HTTP-метод оригинального запроса.
Если в оригинальном запросе передаются заголовки не из списка разрешённых, то в запрос OPTIONS дополнительно добавляется заголовок Access-Control-Request-Headers . В его значении через запятую перечисляются все заголовки оригинального запроса.
В случае отправки preflight-запроса сервер также должен вернуть заголовок Access-Control-Allow-Origin с необходимым значением.
Если в запрос добавлен заголовок Access-Control-Request-Method , то сервер в ответе должен указать, какие HTTP-методы разрешено использовать для запроса ресурса в заголовке ответа Access-Control-Allow-Methods .
Если в запрос добавлен заголовок Access-Control-Request-Headers , то сервер в ответе должен указать, какие HTTP-заголовки разрешено использовать для запроса ресурса в заголовке ответа Access-Control-Allow-Headers .
Пример ответа на preflight-запрос:
Браузер получает ответ и после этого сверяет значения Origin , разрешенных заголовков и методов. Если всё совпадает, отправляет оригинальный запрос на сервер. Если разрешённые параметры не совпадают с фактическими, браузер блокирует отправку оригинального запроса и сообщает об ошибке.
Иногда необходимо уметь передавать Cookies при обращении к другим доменам. Заголовок Cookie не относится к списку разрешенных и попадает под политику безопасности. Чтобы их можно было передавать, сервер в ответ на preflight и на оригинальный запрос должен возвращать заголовок Access-Control-Allow-Credentials: true . Для работы куки также нужно возвращать в заголовке Access-Control-Allow-Origin конкретное значение разрешённого хоста.
Ответ от кроссдоменного запроса получен. Допустим, нужно получить доступ к заголовкам в коде JavaScript в браузере и прочитать их значения. Сделать это не так просто, потому что по умолчанию доступ из Java Script для кроссдоменных запросов есть только к следующим заголовкам:
Если JS попытается прочитать значение другого заголовка, то получит null. Но сервер в ответе на запрос может перечислить заголовки, к которым можно получить доступ из Javascript в заголовке Access-Control-Expose-Headers . Заголовки указываются через запятую. Например, Access-Control-Expose-Headers: Authorization, X-Version .
Заголовок ответа сервера Access-Control-Max-Age сообщает браузеру, насколько предзапрос может быть кэширован и опущен при запросах к серверу. Значение указывается в секундах. Если после первого выполнения preflight-запроса время жизни Max-Age не вышло, то повторной отправки не будет. Оригинальный запрос выполнится сразу.
Про Cookies и CORS на этом — всё. В третьей статье цикла я расскажу о нововведениях в версии HTTP/1.1 и чем она отличается от HTTP/2.
Как работает вход по куки на сайтах и зачем нужно использовать эту технологию?
Веб-сайты могут использовать входный механизм, который использует куки для осуществления авторизации пользователя. Куки — это небольшие файлы, которые сохраняются в вашем браузере и содержат информацию о вашей активности на сайте.
Как работает вход по куки
Когда вы входите на сайт, который использует вход по куки, сервер отправляет вашему браузеру файл куки. В этот файл записывается информация о пользователях, такая как логин и пароль. Когда вы следующий раз посещаете этот сайт, ваш браузер отправляет серверу информацию из файла куки, чтобы автоматически произвести вход на сайт.
Зачем нужно использовать вход по куки
Использование входа по куки дает ряд преимуществ.
- Удобство. Пользователь не обязан вводить логин и пароль каждый раз, когда он посещает сайт.
- Безопасность. Вход по куки делает авторизацию пользователя более безопасной, так как куки обычно шифруются, что защищает данные пользователя от кражи или взлома.
- Эффективность. Вход по куки позволяет серверу быстро идентифицировать пользователя, что делает процесс авторизации более быстрым и эффективным.
Каковы риски использования входа по куки
Как и любая технология, вход через куки не лишен рисков.
- Безопасность. Если кто-то получит доступ к файлам куки, то он сможет получить доступ к вашей учетной записи на сайте.
- Приватность. Некоторые пользователи не хотят, чтобы их данные сохранялись на сайте. Вход по куки может сохранять некоторые данные пользователя, которые могут нарушить его конфиденциальность.
Заключение
Вход по куки — это эффективная и удобная технология для авторизации пользователей на сайтах. В то же время, при использовании этой технологии необходимо соблюдать меры безопасности, чтобы защитить личные данные пользователя.
Куки с маслом: почему каждый сайт хочет, чтобы вы приняли его cookie
Всплывающие окна с файлами cookie то и дело преследуют пользователей интернета. Они собирают данные о поведении аудитории сайта и упрощают вход в аккаунт. Эксперты допускают, что благодаря им можно идентифицировать пользователя и оказать на него воздействие, а при незащищенном соединении его учетную запись и вовсе легко перехватить. Существенно то, что в некоторых случаях cookie могут содержать персональные данные. Не все российские сайты в явной форме сообщают, что используют такие файлы, хотя обязаны это делать по закону. Подробнее — в материале «Известий».

Что такое cookie
При переходе на новый сайт пользователь часто видит всплывающий баннер с просьбой согласиться на использование файлов cookie. Большая и яркая кнопка «Принять» избавляет от неудобства, а на мелкий шрифт соглашения просто нет времени. Таким образом, пользователь разрешает компании отслеживать свои предпочтения.
Cookie — это небольшие фрагменты данных, которые сайты сохраняют на устройстве владельца. Такие файлы нужны, чтобы наблюдать за поведением клиентов, например, фиксировать, что находится в его корзине покупок на маркетплейсе. А также упрощать вход в систему — cookie запоминают вводимый логин и пароль для активации аккаунта. Вся эта информация записывается и передается в браузер.
Многие из нас просто соглашаются с требованием сайта и идут дальше. Исследования показывают, что подавляющее большинство интернет-пользователей не читают политику конфиденциальности, поэтому они, вероятно, не вникают и в правила использования cookie. К тому же кнопка «Принять» как бы сама просится к нажатию — она выделена ярче плашки «Запретить». Такой подход получил название темного шаблона — это дизайн, который влияет на пользователей, склоняя их к определенному выбору. Другие примеры его использования: незаметный крестик на рекламном баннере, автоматическое списание средств после истечения пробной подписки на портал и др.

Зачастую можно продолжить просмотр страницы, не давая своего разрешения на принятие cookie, но тогда придется мириться с баннером, скрывающим часть экрана.
Какие данные собирают cookie
Cookies умеют запоминать, в какое время и с какого устройства человек заходил на страницу сайта, его браузер, текст запросов, язык ввода, IP-адрес и локацию пользователя.
Благодаря cookie создатели сайта могут больше узнать о своей аудитории — откуда приходит пользователь, как двигается по странице, в какой момент ее покидает, на что отвлекается, по каким ссылкам переходит.
Также cookies запоминают персональные настройки. Например, в YouTube такие файлы используются для хранения информации о размере проигрывателя, автовоспроизведении роликов и перемешивании контента. А сервис YouTube Music помнит параметры громкости и режим повтора.


Более того, cookie — мощный инструмент для рекламодателей. Компаниям известны товары, которые просматривал или добавлял в корзину пользователь. Именно поэтому разным клиентам, посещающим один и тот же сайт, предлагается разная адресная реклама, одним — футболки, другим — наушники.
Наравне с этим существуют строго необходимые, или технические cookies, нужные для бесперебойной работы сайта. Например, в политике конфиденциальности платформы «Дзен» прописаны все указанные виды cookie-файлов.
Есть ли угроза безопасности
Основная проблема с файлами cookie — их использование для идентификации пользователя, считает руководитель отдела продвижения продуктов компании «Код Безопасности» Павел Коростелев.
— То есть если я как пользователь захожу на сайт, то один мой визит на конкретный ресурс никакой проблемы не сделает. Но если кто-то сможет определить, на какие сайты я захожу каждый день, каждый месяц, это позволит кому-то составить мой портрет. Например, для идентификации моих действий и для разного рода подсовывания мне специфической информации. И тут уже начинаются проблемы с воздействием. Поэтому слежка через сookie считается не очень правильной, — заметил эксперт.

Также считается, что cookie легко перехватить и подменить (например, для получения доступа к учетной записи), если пользователь использует нешифрованное соединение с сервером. В группе риска пользователи, выходящие в интернет при помощи публичного Wi-Fi и не использующие защитные протоколы.

Cookie и закон
Важный вопрос с точки зрения конфиденциальности — относятся ли cookie-файлы к персональным данным? Руководитель практики интеллектуальной собственности юридической фирмы DRC Владимир Ожерельев поясняет, что cookie-файлы в зависимости от своего назначения могут содержать или не содержать персональные данные. По его словам, если данные в cookie-файле обезличены и содержат только техническую информацию, то эти сведения не относятся к персональным. Но несколько обезличенных cookie-файлов в совокупности могут содержать персональные данные.
При этом далеко не все отечественные сайты в явной форме сообщают об использовании cookie, хотя должны это делать.
— Большинство российских сайтов, получающих сведения с помощью cookie-файлов, обязаны получать согласие от пользователей до начала обработки, а отсутствие баннера с текстом согласия может рассматриваться как нарушение ФЗ «О персональных данных». Особенно это касается использования иностранных сервисов аналитики, передающих данные за пределы России, — добавил Владимир Ожерельев.

Между тем массовое появление баннеров за рубежом связано с принятием нескольких нормативных актов. В 2018 году в Европе вступил в силу jбщий регламент по защите данных (GDPR). Согласно документу, если компания предоставляет товары и услуги в ЕС или занимается сбором и анализом данных его резидентов, она обязана соблюдать новые правила. При этом неважно, где располагается такая компания — в Европе или за ее пределами. Сайт должен сообщать пользователям, какая информация о них собирается, и давать возможность отказаться от наблюдения.

Существуют и региональные нормативы. Например, rалифорнийский закон о конфиденциальности потребителей (CCPA), который вступил в силу в начале 2020 года. Он говорит, что сайт должен как минимум предупреждать пользователей, что их отслеживают. В отличие от GDPR он не требует, чтобы сайты предоставляли возможность отклонять файлы cookie, если только пользователям не исполнилось 16 лет.
Когда GDPR вступил в силу, компании по всему миру — не только в Европе — стали стараться соответствовать требованиям и повсеместно вводить изменения в отношении конфиденциальности. На всякий случай, для подстраховки.
Как отключить cookie
Большинство современных браузеров позволяют отключить cookie. Например, для Google Chrome на андроиде достаточно зайти в раздел «Настройки», перейти в «Настройки сайтов», выбрать «Файлы cookie» и выключатель передачу либо частично, либо полностью.
Другое решение, избавляющее пользователя от ручных настроек, пытается предложить блокировщик Never-Consent. Он будет автоматически закрывать всплывающие окна и отклонять файлы cookie. Разработчики планируют добавить Never-Consent в бесплатное программное обеспечение Ghostery, которое специализируется на конфиденциальности. Ghostery, в свою очередь, можно установить в качестве расширения для браузера.

Тем не менее полностью отказаться от cookie — не самая лучшая идея. На сайтах, где требуется вход в аккаунт, cookie действительно экономят время рядового пользователя.
Если вы решили не отключать cookie, стоит учитывать, что со временем они накапливаются на устройстве и могут занимать гигабайты памяти. Поэтому полезно периодически удалять их, как минимум для тех сайтов, которые посещаются редко.
Как авторизоваться через куки?
Насчет надежности сессий php не знаю — с виду они случайны и подобрать такое длинное число проблематично. В куку спокойно можно положить и .
Как авторизоваться по куки?
Принцип такой: нужно записывать случайную строку в куки пользователя и одновременно в базу данных. При заходе на сайт мы первым делом проверяем не запущена ли сессия. Если запущена — значит пользователь авторизован. Если не запущена, тогда мы смотрим ему в куки и ищем там пометку об авторизации.
Чем отличается токен от куки?
В отличие от cookie-подхода, вариант с токенами не имеет состояния. Это означает, что он не сохраняет никакой информации о пользователях в базе данных или на сервере. Сервер отвечает только за создание и проверку токенов, что позволяет реализовывать более масштабируемые решения.
Что лучше сессии или куки?
Принципиальная разница между cookie и сессиями состоит в том, что cookie полностью хранятся в браузере пользователя (то есть на компьютере клиента), а при сессиях в cookie хранится только идентификатор сессии, а вся информация лежит на сервере в специальном уникальном файле.
Куда вставлять куки?
Как изменить настройки файлов cookieОткройте браузер Chrome. на компьютере.В правом верхнем углу экрана нажмите на значок с тремя точками Настройки .В разделе «Конфиденциальность и безопасность» выберите Файлы cookie и другие данные сайтов.Выполните одно из следующих действий: Разрешить все файлы cookie;
Что значит вход только по куки?
Cookie – это текстовые файлы, в которых сохраняется информация о посещениях сайтов. Если их не использовать, при каждом запросе браузера к сайту сервер будет считать, что пользователь посетил веб-ресурс впервые. Чтобы сохранить данные о гостях сайта, браузер получает файлы от сервера и сохраняет их.