Что такое Stateless (без сохранения состояния) приложение?

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

Ответ

Stateless (без сохранения состояния) — это архитектурный подход, при котором сервер не хранит никакой информации о состоянии клиента между его запросами. Каждый HTTP-запрос содержит всю необходимую информацию для его обработки и является полностью независимым от предыдущих.

Ключевые принципы:

  1. Полная независимость запросов: Сервер обрабатывает каждый запрос как новое, изолированное взаимодействие.
  2. Все данные в запросе: Любая контекстная информация (идентификатор пользователя, параметры, токен доступа) должна явно передаваться клиентом в каждом запросе (в заголовках, теле или URL).
  3. Отсутствие сессий на сервере: Нет понятия «сессии» в памяти сервера. Это фундаментальный принцип RESTful API.

Пример Stateless API-эндпоинта (Laravel):

// Каждый запрос к этому методу должен содержать Bearer Token для аутентификации
// Сервер не хранит сессию, а только проверяет валидность токена.
public function getCurrentUser(Request $request) {
    // Пользователь идентифицируется по JWT-токену из заголовка Authorization
    $user = $request->user(); // Извлекается из токена, а не из сессии
    return response()->json([
        'id' => $user->id,
        'name' => $user->name,
        'email' => $user->email
    ]);
}

Преимущества Stateless-архитектуры:

  • Идеальная масштабируемость: Любой запрос может быть обработан любым из идентичных серверов (инстансов). Можно легко добавлять или удалять серверы за балансировщиком нагрузки.
  • Повышенная отказоустойчивость: Отказ одного сервера не влияет на пользователей, так как их «состояние» не хранилось на этом сервере. Следующий запрос просто пойдет на другой работоспособный сервер.
  • Упрощение кэширования: Ответы на запросы (особенно GET) можно безопасно кэшировать, так как они не зависят от скрытого состояния на сервере.
  • Упрощение логики сервера: Не нужно управлять очисткой устаревших сессий, синхронизацией состояния между серверами.

Как передается состояние в Stateless-приложениях:

  • Аутентификация: Токены доступа (JWT, OAuth2 Bearer Token), передаваемые в заголовке Authorization.
  • Данные клиента: Параметры запроса, тело запроса (JSON/XML), куки (хотя куки технически хранятся на клиенте).
  • Идентификаторы: Все необходимые ID (пользователя, заказа) должны явно передаваться клиентом.

Недостаток: Увеличение объема передаваемых данных (токен нужно слать в каждом запросе) и необходимость более сложной обработки авторизации и валидации на стороне клиента.

Stateless — это стандарт для современных микросервисных архитектур и публичных API.