Cookies
Что такое куки | |
Пример | |
Создать cookies | |
Cookie options | |
Пример задания options | |
Демонстрация в вашем браузере | |
Удалить куки | |
Недостатки |
Что такое куки
Куки - это файлы размером до 4KB, которыми по протоколу HTTP или HTTPS обмениваются HTTP клиент (браузер) и HTTP сервер.
Пользователь заходит на сайт через браузер. Браузер делает GET запрос. Сервер возвращает
ответ в котором содержатся данные куки.
Браузер создает куки файл с этими данными. Затем пользователь может перейти на другую страницу
сайта, это новый GET запрос, но в нём уже будет содержимое куки.
Сервер допишет что-то ещё и так они и будут пересылать куки друг другу.
Пример
Пример запроса от клиента
Request 1 GET /homepage.php HTTP/1.1 Host: eth1.ru Accept: */*
Ответ сервера
Response 1 HTTP/1.1 200 OK Content-type: text/html Set-Cookie: lang=rus
Запрос к другой странице будет уже с куки
Request 2 GET /aboutus.php HTTP/1.1 Host: eth1.ru Cookie: lang=rus Accept: */*
Примерно таким образом куки позволяют запоминать пользовательские настройки
Создать куки с помощью PHP
<?php
setcookie(string $name, string $value="", array $options=[]) : bool
Разберемся с параметрами
name
Имя cookie - помогается извлекать значения из superglobal переменной $_COOKIE
value
Данные, которые записаны в куки
options
Это ассоциативный массив (можно названть словарём для краткости) с набором ключей:
- expires
- path
- domain
- secure
- httponly
- samesite
Попытка использовать другой ключ приведёт к E_WARNING
Разберём эти шесть опций подробнее
Cookie options
expires: указывает когда куки просрочатся.
Используется вместе с функцией time(), которая
задаёт начальный момент.
Пример:
- задать куки на 1 час:
setcookie(name, value, time()+3600);
- На один день:
setcookie(name, value, time()+86400);
- На 30 дней:
setcookie(name, value, time()+86400*30);
Если не задавать expires, куки будут удаляться при каждом переоткрытии страницы.
path: путь до сервера или путь в домене на который отпраляется куки
Пример:
Допустим, что домен это eth1.ru. Если задать путь как '/php/'
setcookie(name, value, time()+3600, '/php/');
То куки будут отправлены только при запросах к eth1.ru/php и поддиректориям
Если задать path с помощью / то куки будут отправлять вне зависимости от того к какому файлу сделан запрос.
setcookie(name, value, time()+3600, '/');
eth1.ru/*
domain: Задаёт домен на который будут отправляться куки.
Пример:
Если задать как www.eth1.ru то будет работать только c www.eth1.ru
Если задать как eth1.ru то будет работать также со всеми поддоменами
secure: если поставить в TRUE то куки будут отправляться только по HTTPS. По умолчанию стоит FALSE
httponly: куки будет доступна только по HTTP (и HTTPS). То есть JavaScript или bbscript не смогут получить к куки доступ
samesite: устанавливает правила отправки куки для межсайтовых запросов.
Возможны три варианта:
- None: куки можно пересылать между сайтами
- Lax: same-site + стандартные <a=href=…> ссылки для таргет сайтов
- Struct: только same-site запросы
Пример использования $options
$options = array (
'expires' => time() + 60*60*24,
'path' => ' /' ,
'domain' => '.eth1.ru' ,
'secure' => true, // or false
'httponly' => true, // or false
'samesite' => 'None' // or Lax or Strict
);
setcookie('lang', 'rus', $options);
Применение куки
Если вы хотите увидеть как работают куки прямо в вашем браузере - переходите к
следующей статье:
«Демонстрация работы с куки»
Выполнив переход вы разрешаете этому сайту создавать куки. По умолчанию они выключены, но на той странице без них нельзя.
На странице 1_form.php вы можете ввести в форму произвольное число. Оно будет записано в куки your_number
На странице 1_result.php можно увидеть что куки your_number действительно создано
На странице
2_form.php
произойдёт проверка наличия куки
name
.
Если куки
name
уже был установлен, вы увидите персонифицированное приветствие.
Если не установлен, то вам будет предложено снова заполнить форму.
И тогда на странице
2_result.php
вы увидите персонифицированное сообщение
Удалить куки
Удалить куки функцией unset() не получится потому что они останутся на строне клиента. Браузер просто пришлёт их
как ни в чём ни бывало.
Чтобы удалить куки нужно сделать это на сервере + отправить команду на удаление браузеру.
Эта команда заключается в установке нулевого или отрицательного времени в
expires
options['expires'] = time() - x setcookie(name, value, options);
Пример
$options['expires'] = time() - 3600;
setcookie(name, $_COOKIE['name'], $options);
unset($_COOKIE['name']);
Ограничения
- Размер всего 4KB
- Передавать важную информацию небезопасно
- Пользователь может отключить их в браузере
- $_COOKIE обновляется только после перезагрузки в браузере
- Одни и те же данные многократно передаются туда-сюда
Чтобы обойти эти ограничения нужно использовать sessions