Cookie – это небольшой объем именованных данных, сохраняемых веб_броузе_ ром и связанных с определенной веб_страницей или веб_сайтом.1 Cookies играют
1 Особого смысла у термина «cookie» (булочка) нет, тем не менее появился он не «с потолка». В туманных анналах истории компьютеров термин «cookie», или «magic cookie», использовался для обозначения небольшой порции данных, в частности, привилегированных или секретных данных, вроде пароля, подтвер_ ждающих подлинность или разрешающих доступ. В JavaScript cookie_файлы применяются для сохранения информации о состоянии и могут служить средст_ вом идентификации веб_броузера, хотя они не шифруются и никак не связаны с безопасностью (впрочем, это не относится к передаче их через защищенное со_ единение по протоколу HTTPS).
19.1. Обзор cookies
роль памяти веб_броузера, чтобы сценарии и программы на стороне сервера мог_ ли на одной странице работать с данными, введенными на другой странице, или чтобы броузер мог вспомнить пользовательские параметры или другие перемен_ ные состояния, когда возвращается на страницу, посещенную им ранее. Cookies первоначально предназначались для разработки серверных сценариев и на низ_ шем уровне реализованы как расширение протокола HTTP. Данные cookie ав_ томатически передаются между веб_броузером и веб_сервером, так что серверные сценарии могут читать и записывать значения cookie, сохраняемые на стороне клиента. Как мы увидим, JavaScript также может работать с cookie с помощью свойства cookie объекта Document.
Свойство cookie – это строковое свойство, позволяющее читать, создавать, изме_ нять и удалять cookies, связанные с текущей веб_страницей. Хотя cookie с перво_ го взгляда может показаться обычным доступным для чтения и записи строко_ вым свойством, фактически его поведение сложнее. Читая значение свойства cookie, мы получаем строку, содержащую имена и значения всех cookies, связан_ ных с документом. Можно создавать, изменять и удалять cookies, устанавливая значение свойства cookie. В следующих разделах этой главы подробно объясняет_ ся, как это делать. Однако для того чтобы работа со свойством cookie была эффек_ тивной, надо больше знать о cookies и о том, как они работают.
Помимо имени и значения каждый cookie имеет четыре необязательных атрибу_ та, управляющих временем его жизни, видимостью и безопасностью. По умол_ чанию cookies являются временными – их значения сохраняются на период се_ анса веб_броузера и теряются при закрытии сеанса пользователем. Чтобы cookie сохранялся после окончания сеанса, необходимо сообщить броузеру, как долго он должен храниться. Изначально для этого использовался атрибут expires, ука_ зывающий дату окончания действия cookie. И хотя этот атрибут по_прежнему может применяться, он начинает вытесняться другим атрибутом – max_age, кото_ рый определяет срок хранения cookie в секундах. Установка значения любого из этих атрибутов заставляет броузер сохранить cookie в локальном файле, чтобы он мог быть прочитан при следующем посещении пользователем веб_страницы. После того как будет достигнута дата окончания действия или истечет период max_age, броузер автоматически удалит cookie_файл.
Еще один немаловажный атрибут cookie, path, задает веб_страницы, с которыми связан cookie. По умолчанию cookie связывается с создавшей его веб_страницей и доступен этой же странице, а также любой другой странице из того же каталога или любых его подкаталогов. Если, например, веб_страница http://www.examp' le.com/catalog/index.html создает cookie, то этот cookie будет также видим страни_цам http://www.example.com/catalog/order.html и http://www.example.com/cata' log/widgets/index.html, но не видим странице http://www.example.com/about.html.
Этого правила видимости, принятого по умолчанию, обычно вполне достаточно. Тем не менее иногда значения cookie_файла требуется использовать на всем мно_ гостраничном веб_сайте независимо от того, какая страница создала cookie. На_ пример, если пользователь ввел свой адрес в форму на одной странице, целесооб_ разно сохранить этот адрес как адрес, применяемый по умолчанию. Тогда этим адресом можно будет воспользоваться при следующем посещении тем же пользо_ вателем этой страницы, а также при заполнении им совершенно другой формы на любой другой странице, где требуется ввести адрес, например для выставления
474 Глава 19. Cookies и механизм сохранения данных на стороне клиента
счета. Чтобы это можно было сделать, для cookie_файла задается значение path. Тогда любая страница того же веб_сервера, содержащая указанное значение в сво_ ем URL, сможет использовать cookie_файл. Например, если для cookie, установ_ ленного страницей http://www.example.com/catalog/widgets/index.html, для атри_ бута path задано значение "/catalog", этот cookie будет также виден для страницы http://www.example.com/catalog/order.html. А если атрибутpathустановлен в"/",то cookie_файл будет виден для любой страницы на веб_сервере www.example.com.
По умолчанию cookies доступны только страницам, загружаемым с того веб_серве_ ра, который их установил. Однако большим веб_сайтам может потребоваться воз_ можность совместного использования cookies несколькими веб_серверами. Напри_ мер, серверу order.example.com может потребоваться прочитать значения cookie, установленного сервером catalog.example.com. В этой ситуации поможет третий ат_ рибут cookie_файла – domain. Если cookie, созданный страницей с сервера catalog.ex' ample.com, установил свой атрибутpath, равным"/", а атрибутdomain– равным".example.com", этот cookie будет доступен всем веб_страницам серверов catalog.ex' ample.com, orders.example.com и любых других серверов в домене example.com.Если атрибут domain для cookie не установлен, значением по умолчанию будет имя веб_сервера, на котором находится страница. Обратите внимание, что нельзя сделать так, чтобы домен cookie_файла отличался от домена вашего сервера.
Последний атрибут cookie – это логический атрибут с именем secure, определяю_ щий, как значения cookie_файла передаются по сети. По умолчанию cookie не за_ щищен, т. е. передается по обычному незащищенному HTTP_соединению. Одна_ ко если cookie помечен как защищенный, он передается, только когда обмен ме_ жду броузером и сервером организован по протоколу HTTPS или другому защи_ щенному протоколу.
Обратите внимание: атрибуты expires, max_age, path, domain и secure не являются свойствами JavaScript_объекта. Далее в этой главе мы увидим, как установить эти атрибуты cookie_файла.
Cookies пользуются дурной славой у многих пользователей Всемирной паутины, поскольку сторонние производители часто недобросовестно применяют cookies, связанные не с самой веб_страницей, а с изображениями на ней. Например, cook_ ies сторонних производителей позволяют компаниям, предоставляющим услуги рекламного характера, отслеживать перемещение пользователей с одного сайта на другой, что вынуждает многих пользователей по соображениям безопасности отключать режим сохранения cookies в своих веб_броузерах. Поэтому, прежде чем использовать cookie в сценариях JavaScript, следует проверить, не отклю_ чен ли режим их сохранения. В большинстве броузеров это можно сделать, про_ верив свойство navigator.cookieEnabled. Если оно содержит значение true, значит работа с cookie разрешена, а если false – запрещена (хотя при этом могут быть разрешены временные cookie_файлы, срок жизни которых ограничивается про_ должительностью сеанса работы броузера). Это свойство не является стандарт_ ным, поэтому если сценарий вдруг обнаружит, что оно не определено, придется проверить, поддерживаются ли cookies, попытавшись записать, прочитать и уда_ лить тестовый cookie_файл. Как это делается, описано далее в этой главе, а в при_ мере 19.2 вы найдете программный код, выполняющий такую проверку.
Те, кто интересуется техническими подробностями работы cookies (на уровне про_ токола HTTP), могут обратиться к спецификации RFC 2965 на странице http://
19.2. Сохранение cookie
www.ietf.org/rfc/rfc2965.txt. Изначально cookie были разработаны в компанииNetscape и их первичная спецификация, подготовленная в Netscape, может по_ прежнему представлять интерес. Хотя некоторые ее части уже сильно устарели, она много короче и проще, чем формальный документ RFC. Отыскать этот старый документ можно на странице http://wp.netscape.com/newsref/std/cookie_spec.html.
В следующих разделах обсуждаются вопросы доступа к значениям cookie из Java_ Script_сценариев и порядок работы с атрибутами expires, path, domain и secure. За_ тем рассматриваются альтернативные способы сохранения данных на стороне клиента.