Припустимо, ви хочете надати користувачеві можливість переглядати каталог вашої продукції і вибирати з нього товари, поміщені на різних сторінках. Але "з точки зору" сервера, вибір товару на одній сторінці ніяк не пов'язаний ні з попередніми, ні з подальшими діями того ж користувача. Як же враховувати вибрані користувачем позиції?
Вирішити цю проблему можна за допомогою спеціального додатку на Web-сервері, яке повинно стежити за діями користувача. Саме ця ідея втілена в технології ідентифікують ознак, або - в термінології Netscape - "булочок" (cookies). "Плюшки", приготовані цією компанією, вже стали стандартом де-факто. Але перш ніж ми ближче познайомимося з ідентифікують ознаками, давайте трохи докладніше розберемося в суті проблеми.
Взаємовідносини клієнтського і серверного ПЗ у Всесвітній павутині досить прості. Браузер звертається до сервера з запитом: "Покажи-но мені такий-то документ". Якщо зазначений документ існує і користувач має право доступу до нього, то сервер виконує запит. Ось, загалом-то, і все. Службова (неінформаційних) навантаження на мережу виявляється дуже незначною, а швидкодія - високим. Однак при цьому виникає одна незручність: зв'язок між браузером і сервером зберігається тільки під час транзакцій, причому кожна з них ніяк не пов'язана з іншими. Транзакції такого типу позначаються спеціальним терміном idempotent (що можна перевести як "рівноправні"), а сервер вважається не мав якогось певного стану (stateless). Власне кажучи, незручність виникає тільки тоді, коли з'являється необхідність відстежити проходження сеансу зв'язку, т. Е. Послідовність запитів конкретного користувача до Web-серверу.
До того як з'явилися ідентифікуючі ознаки, єдиним способом відстеження дій відвідувача Web-сервера було використання досить обмежених можливостей "невидимих полів" в HTML-формах або організація спеціального процесу обробки "маркерів", вбудованих в покажчики ресурсів (URL). Як ви розумієте, ці методи незручні і не дуже надійні.
Що ще за "плюшки"?
Компанія Netscape запропонувала своє рішення і включила його в Navigator 0.94, назвавши новинку "persistent cookies" (що в буквальному перекладі означає щось на кшталт "постійні плюшки". - Прим. Пер.). Замість того щоб безперервно передавати дані від браузера до сервера і назад для підтримки безперервного ж мережевого сеансу, вирішила Netscape, потрібно забезпечити Web-серверу можливість поміщати в файлову систему браузера і згодом зчитувати звідти невелику кількість службової інформації ( "плюшки"). Дані, що зберігаються в "плюшки", або ознаку, можуть, наприклад, ідентифікувати користувача, сеанс зв'язку (який відстежується при відсутності відомостей про здійснює його користувача) або будь-які інші показники за бажанням адміністратора Web-сервера.
Для того щоб зробити процес запису і зчитування міток стану "прозорим" для користувача, Netscape розробила розширення до протоколу HTTP, який є невід'ємною частиною Всесвітньої павутини. Взагалі кажучи, протокол HTTP досить простий. Коли браузер звертається до сервера з запитом, той посилає у відповідь запитувані дані, які передують деякої маркуванням, що складається з набору службових міток. Якщо сервер має намір закласти в клієнтське ПЗ "плюшки", то в маркування включається мітка "Set cookie" (більш докладно про це розповідається в урізанні).
Зберігання ідентифікують ознак
Специфікація фірми Netscape дозволяє браузеру зберігати до 300 ознак, кожен з яких може мати розмір до 4 Кбайт. Передбачено також ліміт в 20 ознак на будь-який сервер або домен. У специфікації вказується, що сервери "не повинні розраховувати на можливість перевищення ліміту. Якщо ж це відбувається, клієнтське ПЗ повинно видалити деякі з найстаріших ознаки".
У браузері Netscape Navigator файл з ознаками (cookies.txt) зберігається в одному з підкаталогів. Формат цього файлу запатентований, і якщо ви не хочете зіпсувати міститься в ньому інформацію, то не варто намагатися його редагувати (при цьому засоби захисту файлу не передбачені). Різні браузери і операційні системи зберігають ознаки по-своєму. Наприклад, в програмі Navigator для Macintosh вони записуються в папку Navigator, а в Internet Explorer - в підкаталог у вигляді макрокоманд.
процес ідентифікації
Виникає питання: а навіщо сервера можуть знадобитися ідентифікуючі ознаки? Схематично роботу з "булочками" можна представити таким чином. Наприклад, щоб організувати показ сторінок Web-сервера відповідно до власних уподобань, сервер поміщає відповідну інформацію в браузер у вигляді ознак. При кожному зверненні браузера до сервера останній зчитує дані з "плюшки" і відображає потрібні користувачеві сторінки.
Але насправді сервер не зчитує цю інформацію. Просто браузер, звертаючись до ресурсу на сервері в певному домені, перш за все шукає в своєму файлі з ідентифікують ознаками діючі "плюшки" (т. Е. Ті, термін придатності яких не закінчився), призначені для цього ресурсу або відповідного сервера. Якщо для даного сервера такі ознаки знаходяться, то браузер поміщає в початок запиту маркувальну мітку HTTP_COOKIE, ім'я та дату запису ознаки. Додаток на Web-сервері автоматично зчитує цю інформацію за допомогою CGI-інтерфейсу.
Стандартизація "булочок"
Сьогодні ідентифікуючі ознаки, або "плюшки", є стандартом de facto, але недалекий той день, коли вони стануть їм de jure. Зараз в Робочій групі інженерів Internet (IETF) знаходиться на розгляді проект стандарту на "плюшки", який має дуже серйозне назву "HTTP State Management Mechanism" (подробиці див. Portal.research.belllabs.com/et).
При розмові про цю технологію неминуче виникає ще одне питання: чому Netscape назвала ідентифікаційні ознаки "булочками"? Хоча з їхньою допомогою ми можемо пролити світло на те, як користувачі експлуатують сервер, загадка самої назви, ймовірно, назавжди залишиться таємницею. Представники Netscape стверджують, що за ним "нічого особливого не ховається". Такий вже світ сучасних комп'ютерних технологій!
Рецепт виготовлення "булочок"
Маркування "Set-Cookie" має такий вигляд:
Set-Cookie: NAME = VALUE; expires = DATE; path = PATH; domain = DOMAIN_NAME; secure
NAME і VALUE - будь-які рядкові змінні, за допомогою яких відбувається ідентифікація користувача. Змінні не повинні містити точок з комою, ком або пропусків. Пара NAME = VALUE є єдиним обов'язковим елементом маркування.
Мінлива DATE вказує дату, після якої ознака повинен бути автоматично видалений. Якщо дата не вказана, то мітка буде існувати тільки до кінця поточного сеансу роботи з браузером Navigator.
Мітка DOMAIN_NAME описує ім'я домену, до якого відноситься дана ознака. Якщо ця мітка не задана, то значенням за замовчуванням є ім'я сервера, який створив маркування ознаки.
Мітка "secure" вказує на те, що передача ознаки сервера може здійснюватися тільки в зашифрованому вигляді.
Слід мати на увазі, що під одним маркуванням може "видаватися" кілька ознак, але в цьому випадку вони повинні ставитися до різних ресурсів (URL) і мати різні шляхи. В іншому випадку на клієнтській машині буде встановлено останній з ідентичних ознак.