← Назад к вопросам

Как работают сессии и куки в PHP?

1.0 Junior🔥 272 комментариев
#PHP Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Механизм работы сессий и куки в PHP

Веб-протокол HTTP по своей природе статистичен — каждый запрос обрабатывается независимо, без сохранения состояния между запросами. Для создания интерактивных веб-приложений необходимы механизмы сохранения данных между запросами. В PHP для этого используются сессии (sessions) и куки (cookies), которые тесно взаимосвязаны, но выполняют разные функции.

Куки (Cookies): хранение на стороне клиента

Куки — это небольшие текстовые данные (обычно до 4 КБ), которые сервер отправляет браузеру, а браузер возвращает их при последующих запросах к тому же домену.

Основные характеристики куки:

  • Хранятся на стороне клиента (в браузере пользователя)
  • Имеют ограниченный срок жизни (expires/max-age)
  • Передаются в HTTP-заголовках каждого запроса
  • Уязвимы для клиентских манипуляций

Работа с куки в PHP:

// Установка куки (отправка браузеру)
setcookie('user_preference', 'dark_mode', time() + 86400 * 30, '/', '.example.com', true, true);

// Чтение куки (из суперглобального массива $_COOKIE)
$theme = $_COOKIE['user_preference'] ?? 'light_mode';

// Удаление куки (установка прошедшей даты)
setcookie('user_preference', '', time() - 3600, '/');

Важно: Куки устанавливаются с помощью функции setcookie() или setrawcookie() ДО любого вывода в браузер, так как они отправляются в HTTP-заголовках.

Сессии (Sessions): хранение на стороне сервера

Сессии — механизм хранения данных на сервере, связанных с конкретным пользователем. Каждой сессии присваивается уникальный идентификатор (Session ID), который передается между сервером и клиентом для связывания запросов.

Жизненный цикл сессии:

  1. Инициализация: session_start() создает или возобновляет сессию
  2. Идентификация: PHP генерирует уникальный Session ID
  3. Хранение: Session ID передается клиенту (обычно через куки)
  4. Сохранение данных: Данные хранятся на сервере в файловой системе, БД или другом хранилище
  5. Восстановление: При последующих запросах Session ID используется для доступа к сохраненным данным

Пример работы с сессиями:

// Начало сессии (должно быть ДО любого вывода)
session_start();

// Запись данных в сессию
$_SESSION['user_id'] = 123;
$_SESSION['user_name'] = 'Алексей';
$_SESSION['cart'] = ['product_id' => 456, 'quantity' => 2];

// Чтение данных из сессии
if (isset($_SESSION['user_id'])) {
    $userId = $_SESSION['user_id'];
    echo "Привет, " . $_SESSION['user_name'];
}

// Уничтожение сессии
session_destroy();

Взаимосвязь сессий и куки

По умолчанию PHP использует куки для передачи Session ID. Это происходит автоматически при вызове session_start():

// При первом вызове session_start() PHP:
// 1. Генерирует уникальный Session ID (например, "abc123def456")
// 2. Отправляет куку: Set-Cookie: PHPSESSID=abc123def456
// 3. Создает файл сессии на сервере (например, /tmp/sess_abc123def456)

Альтернативные способы передачи Session ID:

  • URL параметры (менее безопасно): example.com/page.php?PHPSESSID=abc123
  • Скрытые поля форм (редко используется)

Конфигурация и безопасность

Настройки сессий в php.ini:

; Время жизни сессии в секундах
session.gc_maxlifetime = 1440

; Путь для хранения файлов сессий
session.save_path = "/tmp"

; Использование только кук для передачи ID
session.use_only_cookies = 1

; Защита от атак перехвата сессии
session.cookie_httponly = 1    ; Запрет доступа к куке через JavaScript
session.cookie_secure = 1      ; Передача только по HTTPS
session.cookie_samesite = Strict ; Защита от CSRF-атак

Рекомендации по безопасности:

  • Используйте HTTPS для защиты передаваемых данных
  • Регенерируйте Session ID при повышении привилегий:
    session_regenerate_id(true); // true - удаляет старую сессию
    
  • Устанавливайте короткое время жизни для чувствительных сессий
  • Валидируйте и санируйте все данные сессии
  • Используйте собственные обработчики сессий для хранения в БД:
    class DatabaseSessionHandler implements SessionHandlerInterface {
        // Реализация методов для работы с БД
    }
    

Сравнительная таблица

КритерийКукиСессии
Место храненияБраузер клиентаСервер
Объем данныхОграничен (~4 КБ)Практически неограничен
БезопасностьНизкая (доступны клиенту)Высокая (хранятся на сервере)
ПроизводительностьБыстрее (данные у клиента)Медленнее (чтение/запись на сервер)
Срок жизниКонтролируется серверомКонтролируется сервером

Практические сценарии использования

  1. Куки оптимальны для:

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

    • Аутентификации и авторизации пользователей
    • Корзин покупок в интернет-магазинах
    • Многошаговых форм (wizards)
    • Временного хранения чувствительных данных

В современных PHP-приложениях часто используется комбинированный подход: сессии для безопасности критичных данных (авторизация) и куки для удобства пользователя (персонализация). При этом важно учитывать требования GDPR и других регуляторных норм при работе с пользовательскими данными.