Часто сайти повинні вміти ідентифікувати своїх відвідувачів, щоб зберігати і показувати їм пізніше будь-яку інформацію.
Наприклад, інтернет-магазини можуть зберігати історію переглядів, щоб рекомендувати потенційним покупцям найбільш підходящі їм товари. Або агрегатор новин міг би запропонувати користувачам обирати тільки рубрики, які їх цікавлять.
На щастя HTTP і всі браузери надають можливість збереження інформації про користувача.
Cookies (надалі просто "кукі") - невеликі фрагменти даних, які веб-сервер надсилає браузеру. Браузер зберігає їх у себе, а під час наступного відвідування веб-сторінки відправляє назад. Завдяки цьому, веб-сервер зможе впізнати свого "старого" відвідувача.
👉 З технічного боку, кукі - це звичайні HTTP-заголовки.
Коли веб-сервер хоче записати куку в браузер користувача, він відсилає спеціальний заголовок відповіді з назвою Set-Cookie. У цьому заголовку має міститися необхідна інформація та додаткові атрибути, про які піде мова далі.
Наступного разу, коли браузер користувача запросить веб-сторінку з того самого сайту, серед інших заголовків браузер передає заголовок запиту Cookie. Веб-сервер отримає цю інформацію, і вона буде доступна також і для PHP.
Завдання дуже просте: зберігати і показувати відвідувачеві сторінки, скільки разів він відвідав наш сайт. Для цього будемо зберігати кількість відвідувань в окремій куці, збільшуючи значення на одиницю при кожному завантаженні сторінки.
PHP може керувати заголовками, які надсилає сервер, а отже, може встановлювати і читати куки.
Щоб додати нову куку, необхідно спочатку визначитися з такими критеріями:
Назва кукі (може складатися тільки із символів латинського алфавіту і цифр);
Значення, яке передбачається зберігати;
Термін життя куки - це обов'язкова умова.
За встановлення кукі в PHP відповідає функція setcookie, їй потрібно передати щонайменше три параметри, описані вище. Приклад:
<?php
setcookie("visit_count", 1, strtotime("+30 days"));
?>
Зверніть увагу, що термін життя вказується відносно поточної дати. У цьому прикладі кука існуватиме рівно 30 днів з моменту встановлення.
У PHP максимально спрощено процес читання інформації з cookies. Тому всі передані сервером куки доступні в спеціальному глобальному масиві $_COOKIE.
Так, щоб отримати вміст куки з ім'ям visit_count, досить звернутися до однойменного елементу масиву $_COOKIE, наприклад, ось так:
<?php
print($_COOKIE["visit_count"]);
?>
Зверніть увагу: встановивши в сценарії куку через setcookie, прочитати її можна буде тільки під час наступного відвідування сторінки.
Тепер, навчившись встановлювати і читати куки, напишемо повноцінний сценарій, який буде рахувати і виводити кількість відвідувань сторінки користувачем:
<?php
$visit_count = 1;
if (isset($_COOKIE["visit_count"])) {
$visit_count = $_COOKIE["visit_count"] + 1;
}
setcookie("visit_count", $visit_count, strtotime("+30 days"));
print("Кількість відвідувань: " . $visit_count);
?>
Ми вже вміємо зберігати інформацію для користувача між відвідинами сторінки за допомогою кук. Але навіщо нам ще й сесії?
Сесії, вони ж сеанси, це, по суті, просто зручна обгортка над куками. Вони також дають змогу зберігати дані користувача, але з деякими відмінностями та обмеженнями:
Дані зберігаються не довільний час, а тільки до закриття вкладки з веб-сторінкою.
Щоб сесії працювали, на початку кожного сценарію треба викликати функцію session_start().
Доступний обсяг для зберігання інформації набагато більший.
Запис і читання інформації при використанні сесій виглядає просто як робота зі спеціальним масивом $_SESSION.
PHP генерує унікальний ідентифікатор браузера.
Ідентифікатор зберігається в спеціальну куку і передається з кожним запитом.
Усі дані, які записуються в сесію, PHP автоматично зберігає в спеціальному файлі на сервері.
Завдяки існуванню сесій у PHP ми можемо зберігати будь-які дані так само просто, як присвоювати їх змінним. Але, на відміну від змінних, ці дані зберігатимуться для користувача між запитами в межах сеансу.
Перепишемо сценарій для підрахунку відвідувань, але тепер використовуємо сесії:
<?php
session_start();
$visit_count = 1;
if (isset($_SESSION["visit_count"])) {
$visit_count = $_SESSION["visit_count"] + 1;
}
$_SESSION["visit_count"] = $visit_count;
print("Кількість відвідувань: " . $visit_count);
?>
Уявімо інтернет-магазин. Усі його сторінки можна розділити на дві половини: публічні та приватні.
До публічних належать сторінки каталогу, інформації про товар, умови доставки тощо. До приватних - кошик покупок, історія замовлень. Цілком очевидно, що кошик покупок у кожного покупця має бути свій, а мати до нього доступ повинен тільки сам власник і ніхто більше.
Перевірка доступу користувачів до сайту і називається аутентифікацією. Весь процес аутентифікації завжди складається з декількох кроків:
Під час спроби доступу до закритої частини сайту, користувач бачить форму введення логіна і пароля.
Форма відправляється, а отримані дані порівнюються з дійсним логіном і паролем наявного користувача.
Якщо дані збігаються, то користувач вважається аутентифікованим і отримує доступ до приватної частини сайту.
Під час повторного відкриття цієї сторінки користувач не повинен повторно вводити пароль, якщо він уже робив це в рамках поточного сеансу.
Слід розрізняти два терміни: аутентифікація та авторизація.
Аутентифікація - перевірка автентичності наданого користувачем ідентифікатора (пара логін-пароль).
Авторизація - процес перевірки та надання прав користувачеві на виконання певної дії.
У прикладі з інтернет-магазином автентифікація виконується, коли користувач заповнює форму входу і потрапляє у свій особистий кабінет. Сценарій, що обробляє форму, лише перевіряє, що такий користувач існує, і його пароль збігається.
Авторизація включається в роботу, коли користувач виконує якусь дію. Наприклад, видаляє товар зі свого кошика. Під час цієї дії сценарій має перевірити приналежність товару до кошика цього користувача. Без такої перевірки користувач міг би видалити товар із чужого кошика.
Логіка авторизації набагато складніша, ніж проста перевірка збігу пошти та пароля під час входу на сайт. В авторизацію можуть також входити такі поняття: групи користувачів, види дій, ресурси, ієрархія ролей і дій. Цій темі можна присвятити окремий розділ, але в рамках цього підручника ми не розглядаємо цю тему.
Сесії найчастіше використовують для зберігання інформації про залогіненого користувача.
Принцип роботи простий: усередині сценарію, відповідального за обробку форми входу, відкривається нова сесія, куди записується інформація про користувача, який увійшов. Такою інформацією може бути асоціативний масив з усіма значеннями з відповідного запису з бази даних.
Потім додамо код, що перевіряє існування сесії в сценарії, який має бути закритий від анонімних користувачів.
Якщо сесія порожня, значить, користувач не виконував вхід на сайт і доступу до цієї сторінки не має. У цьому разі можна повернути код відповіді 403 і показати повідомлення про помилку, або примусово виконати переадресацію на сторінку з формою входу.
Якщо на сайті є вхід, то має бути і вихід. Таким виходом буде спеціальний сценарій, який очистить сесію і переадресує на головну сторінку.
Щоб очистити сесію, достатньо очистити масив $_SESSION:
$_SESSION = [];