Почему в проекте был выбран механизм балансировки сессий (sticky sessions) вместо использования JWT?

«Почему в проекте был выбран механизм балансировки сессий (sticky sessions) вместо использования JWT?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор между sticky sessions и stateless JWT — это компромисс между простотой и масштабируемостью, который зависит от архитектуры приложения.

В одном из моих прошлых проектов — монолитном PHP-приложении, развернутом за балансировщиком нагрузки, — мы использовали sticky sessions. Основные причины были следующие:

  1. Наследие и скорость внедрения: Приложение уже использовало стандартные PHP-сессии ($_SESSION), которые по умолчанию хранятся в файлах на локальном диске сервера. Переход на JWT потребовал бы рефакторинга всей логики аутентификации и авторизации, что было неприемлемо по срокам.
  2. Простота инвалидации: Мгновенная инвалидация сессии на сервере (например, при выходе пользователя или смене ролей) — это критически важное требование для безопасности. С JWT, пока токен не истек, его нельзя отозвать без введения дополнительного механизма (blacklist).
  3. Отсутствие необходимости в общем хранилище: На начальном этапе не было необходимости в сложной инфраструктуре вроде Redis Cluster для хранения сессий. Sticky sessions позволили масштабироваться, просто добавляя новые инстансы приложения.

Пример кода с PHP-сессией:

// Старт сессии. При sticky sessions все запросы пользователя попадут на один сервер.
session_start();
$_SESSION['user_id'] = $authenticatedUserId;
$_SESSION['role'] = 'admin';
// Данные физически хранятся в файле на сервере А.

Когда мы позже перешли на JWT в другом, микросервисном проекте:

// Генерация токена после аутентификации
use FirebaseJWTJWT;

$payload = [
    'sub' => $user->id,
    'role' => $user->role,
    'iat' => time(),
    'exp' => time() + 3600 // Токен живет 1 час
];
$jwt = JWT::encode($payload, $secretKey, 'HS256');
// Токен отправляется клиенту и хранится у него (например, в localStorage).
// Любой микросервис может проверить его, зная секретный ключ, без обращения к БД или общему хранилищу.

Итог: Sticky sessions — это pragmatic choice для stateful-монолитов, где важна быстрая инвалидация и нет готовности к полному переходу на stateless-архитектуру. JWT — это выбор для распределенных, stateless-систем (микросервисы, SPA+API), где приоритетом является горизонтальное масштабирование и независимость сервисов.