Как работают cookies (куки). Что такое технология cookie? Cookies файлы принцип работы на сервере

27.06.2020

Файлы cookie, как правило, устроены очень просто, но зато живут в системе совершенно самостоятельной жизнью. Несколько лет назад по поводу этой технологии поднялась большая шумиха в прессе, и дискуссии о том, не нарушают ли файлы cookie конфиденциальность пользователей, ведутся до сих пор.

Так или иначе, технология cookie значительно облегчает пользование Интернетом, делает работу с WEB страницами удобнее для пользователей и помогает WEB мастерам собирать более точные сведения о посетителях сайтов.

В апреле 2000 года одна крупная уважаемая газета опубликовала большую аналитическую статью по проблемам конфиденциальности пользовательских данных в Интернете. В этой статье было дано развернутое определение технологии cookie, которое вкратце сводится к следующему: «файлы cookie - это программы, которые WEB сайты размещают на локальном компьютере. Они собирают данные о пользователях и их сетевой активности, а сайты в любой момент могут загрузить с локальной машины всю собранную ими информацию». Так вот, все это совершенно неправильно.

Такие определения в прессе очень распространены, но ни одно из них не имеет ничего общего с действительностью. Файлы cookie - это вовсе не программы. Их нельзя запустить, как приложение, поэтому они не могут самостоятельно собирать какие бы то ни было сведения.

Определение cookie

Вот настоящее определение технологии cookie: файлы cookie - это фрагменты текста, позволяющие WEB сайтам сохранять на компьютере пользователя определенные сведения для последующего к ним обращения. Данные хранятся в виде пар «имя - значение». К примеру, многие WEB сайты присваивают всем своим посетителям уникальные идентификационные номера и хранят эти номера на компьютерах пользователей в файлах cookie.

Пользователи Microsoft могут собственными глазами полюбоваться на файлы cookie, сохраненные на локальном компьютере в папке «c:windowscookies». Например, на моем жестком диске хранятся 165 файлов cookie, каждый из которых представляет собой простой текстовый файл, содержащий в себе несколько пар «имя - значение», по файлу на каждый посещенный мною WEB сайт.

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

Рассмотрим, к примеру, файл cookie для сайта goto.com. В нем содержатся следующие данные:

  • UserID A9A3BECE0563982D goto.com

Сайт goto.com сохранил на моем компьютере всего одну пару «имя - значение». Имя в данном случае - «UserID», а значение - «A9A3BECE0563982D». Следовательно, когда я в впервые посетил goto.com, сайт присвоил мне уникальный идентификационный номер и сохранил его на моем компьютере. (Обратите внимание - помимо трех упомянутых значений, в файле могут содержаться и другие: это служебные данные браузера).

Amazon.com хранит на моей машине более подробные сведения:

  • session-id-time 954242000 amazon.com/
  • session-id 002-4135256-7625846 amazon.com/
  • x-main eKQIfwnxuF7qtmX52 x 6VWAXh@Ih6Uo5H amazon.com/
  • ubid-main 077-9263437-9645324 amazon.com/

Получается, Amazon сохраняет в файле cookie основной идентификационный номер пользователя, идентификационный номер и время начала каждого сеанса, а также значение «x-main», которое может содержать любые другие данные.

Большинство сайтов хранит на локальном компьютере только идентификационный номер пользователя, но в принципе, количество пар «имя - значение» в файле cookie не ограничено.

Пара «имя - значение» - это просто фрагмент данных. Это не программа, и разумеется, она не может вести в системе никакой самостоятельной деятельности. Веб-сайт получает из файлов cookie только те сведения, которые сам же в них сохранил. Он не может читать файлы cookie других сайтов и тем более, не может загружать с локального компьютера никакие посторонние сведения.

Практически каждый пользователь Windows встречался с таким понятием как файлы cookie. Что это такое, зачем они нужны и почему их желательно чистить, читайте в рамках данной публикации.

Что такое куки

Куки (англ. Cookie) — это текстовый файл с данными, который записывается в браузер, сервером посещаемого вами сайта. Этими данными являются:

  • информация о логине и пароле;
  • индивидуальные настройки и предпочтения пользователя;
  • статистика посещений и т.д.

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

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

Главным параметром cookie является срок его действия. По умолчанию — это одна компьютерная сессия. Файлы удаляются по закрытию браузера. Если они имеют срок действия, то становятся постоянными, и удаляются по истечению срока действия или функцией очистки в браузере.

Зачем они нужны?

В первую очередь, они нужны для удобства пользования Интернетом. Например, единожды войдя в свой профиль на сайте, вам не нужно будет постоянно вводить логин и пароль после закрытия вкладки.

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

Где хранятся cookie?

Файлы сохраняются в пользовательской папке. Для каждого браузера свой путь:

  • Opera C:\Users\Имя_Пользователя\AppData\Local\Opera Software\Opera
  • Google Chrome C:\Users\Имя_Пользователя\AppData\Local\Chromium
  • Яндекс.Браузер C:\Users\Имя_Пользователя\AppData\Local\Yandex\YandexBrowser
  • Mozilla Firefox C:\Users\Имя_Пользователя\AppData\Local\Mozilla\Firefox

Зачем чистить?

Время от времени файлы cookies желательно чистить. Кроме полезности, они могут доставить и некоторые неудобства:

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

Как очистить файлы cookie?

Приведу пример очистки для популярных браузеров:

  1. Opera. Ctrl+H → Очистить историю → Файлы cookie и прочие данные с сайтов.
  2. Google Chrome. Ctrl+H → Очистить историю → Файлы cookie, а также другие данные сайтов и плагинов.
  3. Яндекс.Браузер. Ctrl+H → Очистить историю → Файлы cookie и другие данные сайтов и модулей.
  4. Mozilla Firefox. Ctrl+Shift+Del → Куки.

Как отключить?

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

Для отключения в популярных браузерах:


Совет! Если в браузере вы видите уведомления: «должна быть разрешена работа с файлами cookie» или «попытка сохранить файл cookie заблокирована», значит ваш браузер не сохраняет куки по умолчанию. Откройте настройки и включите сохранение куки файлов.

Cookie (куки, печенье) - это небольшой объем именованных данных(в текстовом виде), сохраняемых браузером и связанных с определенной WEB- страницей или WEB- сайтом. Cookies играют роль памяти веб браузера, чтобы сценарии и программы на стороне сервера могли на одной странице работать с данными, введенными на другой странице, или чтобы браузер мог вспомнить пользовательские параметры или другие переменные состояния, когда возвращается на страницу, посещенную им ранее. Cookies первоначально предназначались для разработки серверных сценариев и на низшем уровне реализованы как расширение протокола . Данные cookie автоматически передаются между веб броузером и веб сервером, так что серверные сценарии могут читать и записывать значения cookie, сохраняемые на стороне клиента.

Cookie описаны в RFC 2965. Cookie файлы рассчитаны на то, чтобы изредка сохранять небольшие объемы данных. Они не являются универсальным средством взаимодействия или механизмом передачи данных, поэтому следует проявлять умеренность при их использовании. Спецификации RFC 2965 рекомендуют производителям браузеров не ограничивать число и размеры сохраняемых cookie файлов. Однако ограничения могут существовать:

    Всего куков может быть не более 300 штук (300 пар имя-значение). При превышении лимита самые старые файлы перезаписываются.

    Размер одной куки не может превышать 4кб. При превышении самые старые байты перезаписываются.

    От одного домена (второго уровня, включая поддомены) может быть установлено не более 20 куков.

    Для конкретного сайта будут доступны только те куки, которые им и были установлены.

Атрибуты cookie

    Атрибуты cookie: expire, max age, path, domain и secure.

Помимо обязательного имени(name) и значения(value) каждый cookie имеет несколько необязательных атрибута, управляющих временем его жизни, видимостью и безопасностью.

    expire - по умолчанию cookies являются временными(сеансовыми) – их значения сохраняются на период сеанса Веб- браузера и теряются при закрытии сеанса пользователем. Чтобы cookie сохранялся после окончания сеанса, необходимо сообщить браузеру, как долго он должен храниться. Изначально для этого использовался атрибут expire, указывающий дату окончания действия cookie. Значение expire (RFC 2616) записывается в формате "Wdy, DD Mon YYYY HH:MM:SS GMT". Если этот атрибут не задан, то cookie хранится в течение одного сеанса, до закрытия браузера.

    max age - аналогичен атрибуту expires, но срок хранения определяется в секундах (RFC 6265). Значение десятичное не - отрицательное целое число. По истечении заданного времени клиент должен отказаться от куки. Значение ноль означает, что от cookie нужно отказаться немедленно.

Установка значения любого из этих атрибутов(expires, max age) заставляет браузер сохранить cookie в локальном файле, чтобы он мог быть прочитан при следующем посещении пользователем веб страницы. После того как будет достигнута дата окончания действия expires или истечет период max age, браузер автоматически удалит cookie файл.

    path - задает веб страницы, с которыми связан cookie. По умолчанию cookie связывается с создавшей его веб страницей и доступен этой же странице, а также любой другой странице из того же каталога или любых его подкаталогов. Если, например, веб страница http://www.example.com/catalog/index.html создает cookie, то этот cookie будет также видим страницам http://www.example.com/catalog/order.html и http://www.example.com/catalog/widgets/index.html , но не видим странице http://www.example.com/about.html . Этого правила видимости, принятого по умолчанию, обычно вполне достаточно. Тем не менее иногда значения cookie файла требуется использовать на всем многостраничном веб сайте независимо от того, какая страница создала cookie. Чтобы это можно было сделать, для cookie файла задается значение path(path=/;). Тогда любая страница того же веб сервера, содержащая указанное значение в своем URL , сможет использовать cookie файл.

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

    secure - это логический атрибут с именем secure, определяющий, как значения cookie файла передаются по сети. По умолчанию cookie не защищен, т. е. передается по обычному незащищенному HTTP соединению. Однако если cookie помечен как защищенный, он передается, только когда обмен между броузером и сервером организован по протоколу HTTPS или другому защищенному протоколу. По умолчанию принимает значение false.

Cookie определяются тройкой параметров имя-домен-путь (name-domain-path). Т.е cookie- файлы с разными путями или доменами являются разными cookie, даже если имеют одинаковые имена. Соответственно, cookie меняется на новое, только если новое cookie имеет те же имя, путь и домен. В остальных случаях новые значения cookie добавляются к старым.

Cookies могут быть установлены в браузер (или иной другой программе) двумя способами:

    при помощи протокола Методы и структура протокола HTTP в котором предусмотрены два параметра (заголовка) Set-Cookie (сервер указывает принять куку) и Cookie(ответ браузера). Кроме пары имя/значение(name=newvalue), куки может содержать срок действия, путь и доменное имя. Эти атрибуты должны идти после пары name=newvalue и разделяться точкой с запятой. Например:

Set-Cookie: name=newvalue; expires=date; path=/; domain=.example.com. или Set-Cookie: RMID=732423sdfs73242; expires=Fri, 31 Dec 2010 23:59:59 GMT; path=/; domain=.example.net

Домен и путь говорят браузеру, что cookie должна быть отправлена обратно на сервер при запросах URL для указанного домена и пути. Если они не указаны, используются домен и путь запрошенной страницы.

cookie (HTTP и/или PHP)

    setcookie - значение cookie перед отправкой клиенту подвергается URL - кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie()

    setrawcookie - посылает cookie не преобразовывая значение, в остальном полностью аналогична функции setcookie

Cookies являются частью Методы и структура протокола HTTP - заголовка, поэтому setcookie() должна вызываться до любого вывода данных в браузер. Это то же самое ограничение, которое имеет функция header() . Вы можете использовать функции буферизации вывода, чтобы задержать вывод результатов работы скрипта до того момента, когда будет известно, понадобится ли установка cookies или других заголовков.

Любые cookies, отправленные серверу браузером клиента, будут автоматически включены в суперглобальный массив $_COOKIE, если директива variables_order содержит букву "C".

Когда браузер посылает cookie обратно на сервер, то он посылает только значение. Невозможно получить доступ к домену, пути, времени истечения срока действия или статусу безопасности cookie через массив $_COOKIE, поскольку броузер не посылает его серверу.

    Установка. Простая установка SetCookie("Name","Value")

    Массивы cookies.

    Setcookie("mycookie1["id"]", "value_id"); setcookie("mycookie1["lang"]", "value_lang");

    Значение cookie не доступно в массиве $_COOKIE в пределах того самого запроса, в котором cookie установлен. Другими словами, функция setcookie() не изменяет значения массива $_COOKIE. Однако при всех последующих запросах каждый установленный ранее cookie помещается в массив $_COOKIE.

Для назначения нескольких значений одной cookie, добавьте к её имени. Например: setcookie("MyCookie", "Test", time()+3600);

При успешном завершении функция setcookie() возвращает TRUE. Однако, это не означает, что клиентское приложение (например, браузер) правильно приняло и обработало cookie. То есть по поведению функции setcookie НЕльзя определить включены ли куки в браузере клиента.

    Чтение . if (isset($_COOKIE["lang"])) { print "Кука".$_COOKIE["lang"]." существует."; }

    Чтобы вывести на печать имена и значения всех cookies, посланных в текущем запросе, выполните цикл по массиву $_COOKIE:

    Foreach ($_COOKIE as $cookie_name => $cookie_value) { print "$cookie_name = $cookie_value
    "; }

    Изменение . Если cookie принимает новое значение при имеющемся уже в браузере cookie с совпадающими параметрами name, domain и path, то старое значение заменяется новым. В остальных случаях новые значения cookie добавляются к старым.

    Удаление . Нужно указать только имя куки, например SetCookie("Name"). Это приведет к удалению установленной куки с именем "Name" - это официальная рекомендация по удалению куки.

    Работающий пример удаления и установки куки при помощи PHP : "; } else { setcookie("my_cook", "My name is John", time() + 60 * 60 * 24); echo "Cookie установлена пользователю." . "
    "; } var_dump($_COOKIE); ?>

Непонятные Cookies: _utma, _utmb, _utmc, and _utmz

Иногда, при проверке установленных Cookies можно увидеть переменные с непонятными названиями: _utma, _utmb, _utmc. Эти куки устанавливает Google Analytics. Краткое знакомство с переменными Cookies от Google Analytics

    Utma – выдается при первом посещении сайта.

    Utmb – переменная отслеживает время посещения сайта. При каждом заходе на страницу отмечает “переход”. Время жизни по умолчанию 30 минут.

    Utmc – отслеживает закрытие браузера пользователем. Если при повторном заходе кука отсутствует, засчитывается новое посещение, независимо от _utmb

    Utmv – переменная используется для установки “собственной” пользовательской переменной

    Utmx – переменная нужна для Website Optimizer. Время жизни у куки _utmx – 2 года.

Более подробную информацию о переменных можно узнать в документации Google Analytics.

Файлы cookie - это небольшие текстовые файлы, которые создаёт браузер в специальной папке по команде PHP программы. Хотя cookie может создать и JavaScript, но в этой статье не об этом. Тут мы будем говорить только о установке cookie через PHP программу.

Файлы cookie содержать в себе информацию в виде пар имя=значение. Например, в cookie можно записать логин и пароль пользователя и хранить их на компьютере клиента, чтобы он в следующий раз не залогинивался заново. Конечно, хранение логина и пароля в cookie не самый безопасный способ, и эти данные лучше хранить используя сессии в PHP , но в качестве примера использования cookie этот случай подойдёт.

PHP программа даёт команду браузеру-клиенту установить cookie используя строку в заголовке ответа. То есть вы должны представлять, как работает интернет, что такое заголовок запроса и заголовок ответа, чтобы понять как работает установка cookie.

Итак, всю информацию о том, какие cookie должен установить браузер, PHP программа отправляет в заголовке ответа.

Установка cookie в PHP

Для установки cookie в языке PHP есть функция setcookie() , она и задает cookie, которое будет передано браузеру вместе с другими HTTP заголовками.

Все заголовки, которые создаёт ваш скрипт, должны быть отправлены до того, как ваш скрипт что-то выведет в окно браузера.

Вернёмся к нашей функции. Вот её синтаксис:

Bool setcookie (string имя, string значение, int время жизни, string путь, string домен, bool протокол, bool http only)

bool, string, int в этом синтаксисе ‐ это типы данных. То есть "bool setcookie() " обозначает то, что функций setcookie() возвращает значение булевого типа. Далее, первый и второй аргумент (имя и значение) должны быть типа строка (string), и так далее.

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

  • string имя - имя в паре имя=значение
  • string значение - значение в паре имя=значение
  • int время жизни - время хранения cookie, это метка времени Unix, т.е. желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Также можно воспользоваться функцией mktime() .
  • string путь - путь к директории на сервере, из которой будут доступны cookie.
  • string домен - домен, которому доступны cookie.
  • bool протокол - указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE, cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера.
  • bool http only - если задано TRUE, cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS атак (несмотря на то, что поддерживается не всеми броузерами). Стоит однако же отметить, что вокруг этой возможности часто возникают споры о ее эффективности и целесообразности. Аргумент добавлен в PHP 5.2.0. Может принимать значения TRUE или FALSE.

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

Вот пример установки cookie:

Этот пример только устанавливает cookie на компьютер клиента.

Получение cookie в PHP

В прошлом примере мы отправили браузеру команду создать cookie. Теперь он их создал, и когда в следующий раз браузер отправит запрос серверу, то он передаст содержимое cookie в заголовке запроса.

В PHP-програннме можно определить, прислал браузер cookie или нет очень просто. Они доступны в массиве $_COOKIE .

Давайте усложним прошлый пример:

"; print_r($_COOKIE); echo "";

Когда вы откроете страницу примера в первый раз, то за приветствием ничего не будет. Это потомы что cookie положены на ваш компьютер, но серверу ещё не отправлены.

Хотя в массиве $_COOKIE уже может что-то быть, но тогда эти cookie ложит не наш пример.

Только обновив страницу второй раз вы увидите, что PHP программа получила пару $_COOKIE => welcome .

Обратите внимание, что cookie положены на одну минуту, а это значит что через минуту, если обновить страницу, приветствие опять будет отсутствовать.

Пожалуй вот и всё что касается получения доступа к информации из cookie в PHP.

Удаление cookie в PHP

Чтобы удалить cookie нужно просто поставить их срок жизни в прошедшем времени.

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

Пример работы cookie в PHP

Напишем примитивный счётчик просмотра страниц сайта посетителем, используя cookie.

Обратите внимание, что данные в этом примере живут 60 секунд, потом счётчик обнулится.

На этом тема работа с cookie в PHP раскрыта практически полностью.

Откуда возник термин "cookie" никто достоверно не знает, хотя считается, что во времена зарождения Unix-систем где-то использовалось словосочетание Magic Cookies. Имелись в виду "квитанции" (token, ticket), которыми обменивались программы.

Cookie является решением одной из наследственных проблем HTTP протокола (HyperText Transfer Protocol). Эта проблема заключается в непостоянстве соединения между клиентом и сервером, как при FTP или Telnet сессии, т.е. для каждого документа (или файла) при передаче по HTTP протоколу посылается отдельный запрос. Включение cookie в HTTP протокол дало частичное решение этой проблемы. Иначе говоря, транзакция завершается после того, как браузер сделал запрос, а сервер выдал соответствующий ответ. Сразу после этого сервер "забывает" о пользователе и каждый следующий запрос того же пользователя считает новым пользователем.

Используя cookie, можно эмулировать сессию по HTTP протоколу. Коротко принцип эмуляции сессии таков: на первом запросе выдается соотвествующее значение cookie, а при каждом последующем запросе это значение читается из переменной окружения HTTP_COOKIE и соответствующим образом обрабатывается.

Простой пример : есть форма, где пользователю предлагается указать свое имя, из нее вызывается скрипт, прописывающий значение cookie в браузер пользователя. При каждом последующем заходе на основе анализа значения cookie из браузера пользователя на странице появляется либо именное приветствие (если есть установленное значение cookie), либо первоначальная форма с запросом имени пользователя (если значение cookie не установлено).

Cookie - это небольшая порция текстовой информации, которую сервер передает браузеру. Браузер будет хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка. Одни значения cookie могут храниться только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, записываются в файл. Обычно этот файл называется "cookies.txt" и лежит в рабочей директории установленного на компьютер браузера. У меня, к примеру, в этом файле содержится следующее:

# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This is a generated file! Do not edit.
www.webclub.ru FALSE /ourweb FALSE 946683907 1 1
.bizlink.ru TRUE / FALSE 915148488 u_irads_watch 627633
.doubleclick.net TRUE / FALSE 1920499140 id 332666ae
.yahoo.com TRUE / FALSE 915144943 Y v=1&n=6jm0u5lgubh1k&l=0b8a0d3h/o&p=m29vvru7130a
.yahoo.com TRUE / FALSE 915144943 T z=3587c277
mail.yahoo.com TRUE / FALSE 943919791 YM.Login
id%3d%241%24rm%24L6MDTCsrCNnk3syLZl2zo.%26sid%3dszxPh4SazGg/
%250a%26ts%3dX%2588%25c3%2506%25d3%25e5I-%255d%253f%2597%25ddu
.preferences.com TRUE / FALSE 1182140165 PreferencesID 3AGN9WD1D80gQfjvjAxRuq
.geocities.com TRUE / FALSE 900743217 iTag gY6bZzWItDQAAWll3T8ASk1vbiwgMTMg
search.netscape.com FALSE / FALSE 942189477 NGUserID cfc84d2a-522-898178454-1
www.webclub.ru FALSE FALSE 913543999 visited yes

Как видно, у меня оставили cookie Российский клуб вебмастеров, поисковая система AltaVista, бесплатный почтовый сервер Yahoo, Netscape Communications, рекламные сети DoubleClick и отечественная InterReklama. В настоящее время большинство браузеров поддерживает механизм cookies. Я точно знаю, что cookie можно использовать во всех версиях Netscape Navigator, Microsoft Internet Explorer и NCSA Mosaic.

Что можно делать с помощью cookie?

Сами по себе cookies не могут делать ничего, это только лишь некоторая текстовая информация. Однако сервер может считывать содержащуюся в cookies информацию и на основании ее анализа совершать те или иные действия. Например, в случае авторизованного доступа к чему либо через WWW в cookies сохраняется login и password в течение сессии, что позволяет пользователю не вводить их снова при запросах каждого документа, защищенного паролем.

На использовании cookies также часто строят функции оформления заказов в онлайновых магазинах, в частности, в самом крупном виртуальном книжном магазине Amazon Books реализована своеобразная виртуальная корзина покупателя, как в обычном реальном супермаркете, в которую сервер записывает информацию обо всех заказанных книгах. Пользователь просто помечает интересующие его книги, а затем оформляет покупку сразу всех отмеченных книг.

Еще одна распространенная область использования cookies - при настройке индивидуального профиля каждого зарегистрированного пользователя.

И, наконец, самая последняя область - использование механизма cookie в рекламном бизнесе на Интернет. Еще год назад реклама в Интернет за деньги была довольно экзотической услугой, а сейчас этот бизнес уже устоялся и стремительно развивается. Однако рекламодатели начинают предъявлять более жесткие условия к оценке эффективности своих расходов. Cookie используются для таргетинга рекламы (определения целевой аудитории, например, по географическому положению пользователей), отслеживания интересов пользователей, учета количества показов и проходов сквозь баннеры.

Работа с cookie

Теперь, когда с принципами действия и областями применения cookie все более или менее понятно, можно приступить к изучению формата и синтаксиса, а также способов задания значений cookie.

Формат и синтаксис cookie

Предлагаемое мной в этой статье описание формата и синтаксиса cookie является вольным пересказом изначальной спецификации Netscape Communications "Persistent Client State HTTP Cookies". В настоящий момент идет разработка более строгой спецификации для cookie. Итак, cookie является частью HTTP заголовка. Полное описание поля Set-Cookie HTTP заголовка:

Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure

Минимальное описание поля Set-Cookie HTTP заголовка:

Set-Cookie: NAME=VALUE;

NAME=VALUE - строка символов, исключая перевод строки, запятые и пробелы. NAME-имя cookie, VALUE - значение. Не допускается использование двоеточия, запятой и пробела.

expires=DATE - время хранения cookie, т.е. вместо DATE должна стоять дата в формате "expires=Monday, DD-Mon-YYYY HH:MM:SS GMT", после которой истекает время хранения cookie. Если этот атрибут не указан, то cookie хранится в течение одного сеанса, до закрытия броузера.

domain=DOMAIN_NAME - домен, для которого значение cookie действительно. Например, "domain=cit-forum.com". В этом случае значение cookie будет действительно и для домена cit-forum.com, и для www.cit-forum.com. Но не радуйтесь, указания двух последних периодов доменных имен хватает только для доменов иерархии "COM", "EDU", "NET", "ORG", "GOV", "MIL" и "INT". Для обсуждаемых сейчас новых семи доменов первого уровня ("FIRM", "SHOP", "WEB", "ARTS", "REC", "INFO", "NOM"), вероятно, это условие сохранится. Для доменов иерархии "RU", например, придется указывать три периода.

Если этот атрибут опущен, то по умолчанию используется доменное имя сервера, на котором было задано значение cookie.

path=PATH - этот атрибут устанавливает подмножество документов, для которых действительно значение cookie. Например, указание "path=/win" приведет к тому, что значение cookie будет действительно для множества документов в директории /win/, в директории /wings/ и файлов в текущей директории с именами типа wind.html и windows.shtml. Для того, чтобы cookie отсылались при каждом запросе к серверу, необходимо указать корневой каталог сервера, например, "path=/".

Если этот атрибут не указан, то значение cookie распространяется только на документы в той же директории, что и документ, в котором было установлено значение cookie.

secure - если стоит этот маркер, то информация cookie пересылается только через HTTPS (HTTP с использованием SSL - Secure Socket Level), в защищенном режиме. Если этот маркер не указан, то информация пересылается обычным способом.

Синтаксис HTTP заголовка для поля Cookie

Когда запрашивается документ с HTTP сервера, браузер проверяет свои cookie на предмет соответствия домену сервера и прочей информации. В случае, если найдены удовлетворяющие всем условиям значения cookie, броузер посылает их в серверу в виде пары имя/значение:

Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 ...

Дополнительные сведения

Одновременно можно задавать несколько значений cookie.

В случае, если cookie принимает новое значение при имеющемся уже в браузере cookie с совпадающими параметрами NAME, domain и path, то старое значение заменяется новым. В остальных случаях новые значения cookie добавляются к старым.

Использование expires не гарантирует сохранность cookie в течение заданного периода времени, поскольку клиент (браузер) может удалить запись из-за нехватки выделенного места или каких-либо других причин.

Клиент (браузер) имеет следующие ограничения для cookies:


    всего может храниться до 300 значений cookies

    каждый cookie не может превышать 4Кбайт

    с одного сервера или домена может храниться до 20 значений cookie

Если ограничение 300 или 20 превышается, то удаляется первая по времени запись. При превышении лимита объема в 4Кбайт корректность значения cookie страдает - отрезается кусок записи (с начала этой записи) равный превышению объема.

В случае кэширования документов, например, proxy-сервером, поле Set-cookie HTTP заголовка никогда не кэшируется.

Если proxy-сервер принимает ответ, содержащий поле Set-cookie в заголовке, предполагается, что поле доходит до клиента вне зависимости от кода возврата 304 (Not Modified) или 200 (OK). Соответственно, если клиентский запрос содержит в заголовке Cookie, то он должен дойти до сервера, даже если жестко установлен параметр If-modified-since.

Ниже приведено несколько примеров, иллюстрирующих использование cookies

Пример 1 . Управление подмножеством документов, для которых действительны значения cookie, и их сроком годности

Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT
Когда браузер запрашивает URL с путем "/" на этом сервере, он посылает серверу:
Cookie: CUSTOMER=WILE_E_COYOTE
Браузер запрашивает документ и принимает от сервера в ответ:
Когда браузер запрашивает URL с путем "/" на этом сервере, он посылает серверу уже два значения cookie:
Сервер установил еще одно значение cookie, на этот раз с другой областью действия:
Set-Cookie: SHIPPING=FEDEX; path=/foo
Теперь браузер, запрашивая URL с путем "/" на этом сервере, посылает лишь два значения cookie:
Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001
и лишь при запросе браузером документов с путем "/foo" на этом сервере посылаются все три значения cookie:
Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001; SHIPPING=FEDEX
Комментарий: после закрытия браузера в файле "cookies.txt" останется только одно значение cookie:
CUSTOMER=WILE_E_COYOTE
поскольку только для него установлен срок годности - 9 ноября 1999 года. Все остальные значения не будут сохранены.

Пример 2 . Значения cookie с одинаковыми именами, но разными параметрами
Браузер запрашивает документ и принимает ответ от сервера:

Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
Когда браузер запрашивает URL с путем "/" на этом сервере, он посылает значение:
Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001
Во второй раз, запрашивая документ, браузер принимает от сервера значение cookie с другой областью действия:
Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo
Когда браузер запрашивает URL с путем "/ammo" на этом сервере, он посылает значение:
Cookie: PART_NUMBER=RIDING_ROCKET_0023; PART_NUMBER=ROCKET_LAUNCHER_0001

Комментарий : здесь мы имеем две пары имя/значение с одинаковым именем "PART_NUMBER". При закрытии браузера ни одно из этих значений не сохранится, поскольку не задан параметр expires.

Способы задания значений cookie

Способ задания значений cookie зависит того, как эти значения будут использоваться и какие имеются серверные ресурсы. Можно манипулировать временем жизни выставленных cookie и устанавливать подмножества URL (Universal Resource Locator), в которых заданные значения действительны. Есть несколько способов задания, наиболее часто используются три - через META-таги языка HTML, JavaScript и CGI-скрипты. Любым способом можно задавать как одно, так и несколько значений сразу. Сразу хочу предупредить - не забывайте об ограничениях по объему и количеству значений cookie, а также параметре domain, так как помимо основного доменного имени узла часто бывает несколько алиасов (alias).


    Задание cookie с помощью META-тагов

    Простейший способ выставить cookie - использовать соответствующий META-таг в контейнере...любого статического HTML документа. В общем случае это выглядит следующим образом:

    Такой способ задания cookie, на мой взгляд, наиболее интересен для создателей маленьких домашних страничек, когда нет возможности писать свои собственные CGI-скрипты. А если есть поддержка SSI (Server Side Include) или PHP/Fi, то можно делать интерактивные страницы вообще без использования внешних CGI-скриптов. При наличии SSI на узле создание интерактивности с использованием механизма cookie становится просто удовольствием.

    С помощью cookie задается на любой статичной странице, директивой можно потом считать любые переменные окружения, в том числе и ранее заданные значения cookie (переменная HTTP_COOKIE), а с помощью конструкций, и задавать различные варианты внешнего вида страниц. Так же просто можно проделывать подобные вещи, используя PHP/Fi.

    Если же ни SSI, ни PHP/Fi недоступен, то можно задавать значение cookie, используя JavaScript.

    Задание cookie с помощью JavaScript

    Можно задавать значение cookie, используя язык JavaScript. Единственный недостаток этого способа заключается в том, что не все браузеры его поддерживают.

    Пример 3 . Функция установки значения cookie

    // name - имя cookie
    // value - значение cookie
    // - дата окончания действия cookie (по умолчанию - до конца сессии)
    // - путь, для которого cookie действительно (по умолчанию - документ, в котором значение было установлено)
    // - домен, для которого cookie действительно (по умолчанию - домен, в котором значение было установлено)
    // - логическое значение, показывающее требуется ли защищенная передача значения cookie

    function setCookie(name, value, expires, path, domain, secure) {
    var curCookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "") +

    ((secure) ? "; secure" : "")
    if (!caution || (name + "=" + escape(value)).length <= 4000)
    document.cookie = curCookie
    else
    if (confirm("Cookie превышает 4KB и будет вырезан!"))
    document.cookie = curCookie
    }

    Пример 4 . Функция чтения значения cookie

    Возвращает установленное значение или пустую строку, если cookie не существует.

    // name - имя считываемого cookie

    function getCookie(name) {
    var prefix = name + "="
    var cookieStartIndex = document.cookie.indexOf(prefix)
    if (cookieStartIndex == -1)
    return null
    var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length)
    if (cookieEndIndex == -1)
    cookieEndIndex = document.cookie.length
    return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex))
    }

    Пример 5 . Функция удаления значения cookie

    Принцип работы этой функции заключается в том, что cookie устанавливается с заведомо устаревшим параметром expires, в данном случае 1 января 1970 года.

    // name - имя cookie
    // - путь, для которого cookie действительно
    // - домен, для которого cookie действительно
    function deleteCookie(name, path, domain) {
    if (getCookie(name)) {
    document.cookie = name + "=" +
    ((path) ? "; path=" + path: "") +
    ((domain) ? "; domain=" + domain: "") +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT"
    }

    Работающий пример персонализации пользователя, построенный на JavaScript и использующий механизм cookie.

    Задание cookie с помощью CGI-скриптов

    Самый мощный и гибкий способ управления документами с использованием механизма cookie - с помощью CGI-скриптов. Задание значения cookie на Perl будет выглядеть следующим образом:

    Print "Content-type: text/htmln";
    print "Set-Cookie: username=aaa13; expires=Friday, 31-Dec-99 23:59:59 GMT; path=/; domain=www.citforum.ru;nn";
    Скрипт при выдаче результатов работы генерирует HTTP заголовок:
    Content-type: text/html
    Set-Cookie: "username=aaa13; expires=Friday, 31-Dec-99 23:59:59 GMT; path=/; domain=www.citforum.ru;"
    Чтобы прочитать в скрипте ранее заданное значение cookie, используется переменная окружения HTTP_COOKIE.

    $cookie = $ENV{"HTTP_COOKIE"};

    Совсем недавно я написал систему рейтинга серверов для Российского Клуба Вебмастеров, которая использует механизм cookie для защиты от накрутки очков. В ней, задавая и анализируя значения cookie, я либо не допускаю пользователя до голосования (если отключены cookie в браузере или пользователь один раз уже проголосовал), либо разрешаю голосовать (если соответствующее значение не задано). Обмануть такую систему можно, только стирая каждый раз файл cookies.txt. Можно было бы использовать файл логов голосования на узле, но возникали бы проблемы разделения доступа к файлу и замедление работы вследствие использования медленных дисковых операций.

Немного о проблемах, связанных с использованием cookie

Главной проблемой является изначальное недоверие пользователей к тому, что удаленные сервера без их (пользователей) ведома и согласия записывают на их собственные локальные диски какую либо информацию. Бытовали также слухи о том, что с помощью механизма cookie можно прочесть любую информацию с любого компьютера. Это неправда, к тому же современные версии браузеров позволяют контролировать прием cookie или вовсе блокировать его. Кроме того, появилось множество специальных утилит для управления приемом cookie, так называемые Cookie Managers.

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