Понятие состояния и безсостояния (stateless)

Понятие состояния и безсостояния (Stateful vs Stateless)

Введение

Один из ключевых принципов REST — stateless (без состояния). Но что это значит на практике? Почему это важно для тестировщика? В этом уроке разберём разницу между stateful и stateless подходами, и как это влияет на то, что и как ты тестируешь.


Stateful (с состоянием)

В stateful системах сервер помнит клиента между запросами. Он хранит контекст (сессию) на своей стороне.

Пример — старый подход с сессиями:

  1. Пользователь логинится → сервер создаёт сессию, сохраняет в памяти, отправляет клиенту session_id.
  2. Клиент отправляет session_id в следующем запросе.
  3. Сервер смотрит в хранилище сессий: «а, это Анна, она вошла в систему, роль — admin».
Запрос 1: POST /login    → сервер создаёт сессию #abc123
Запрос 2: GET /dashboard → сервер ищет сессию #abc123, находит → «Анна, admin»

Проблема: если сервер перезапустится или запрос попадёт на другой сервер — сессия потеряна.


Stateless (без состояния)

В stateless системах каждый запрос самодостаточен. Сервер не хранит ничего между запросами. Клиент обязан передавать ВСЮ нужную информацию с каждым запросом.

Пример — JWT токен:

  1. Пользователь логинится → сервер создаёт JWT-токен с данными пользователя, подписывает его и отдаёт клиенту.
  2. Клиент сохраняет токен и сам отправляет его в каждом следующем запросе.
  3. Сервер проверяет подпись токена и читает данные прямо из него — ничего не ищет в БД сессий.
Запрос 1: POST /login    → получаем JWT токен
Запрос 2: GET /dashboard
  Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  Сервер декодирует токен: «Анна, admin» — без обращения к хранилищу сессий

Что такое JWT

JWT (JSON Web Token) — стандарт для передачи информации в виде подписанного JSON-объекта.

Структура JWT: три части, разделённые точкой:

Header.Payload.Signature
eyJhbGci...  .  eyJ1c2Vy...  .  SflKxwRJSMeK...
  • Header — алгоритм подписи.
  • Payload — данные: userId, email, role, время истечения (exp).
  • Signature — криптографическая подпись, сервер проверяет подлинность.

Важно: payload JWT не зашифрован — его можно декодировать на jwt.io. Но без правильного секретного ключа токен нельзя подделать.


Преимущества stateless подхода

КритерийStatefulStateless
МасштабируемостьСложно (нужно общее хранилище сессий)Легко (любой сервер обрабатывает любой запрос)
Нагрузка на серверХранит состояние всех клиентовНе хранит ничего
УстойчивостьПадение сервера = потеря сессийНет сессий = нечего терять
ТестированиеНужно учитывать порядок запросовКаждый запрос независим

Влияние на тестирование

Если API stateless (JWT), то:

  • Забыл отправить токен401 Unauthorized. Тестируй этот сценарий явно.
  • Отправил просроченный токен401 Unauthorized. Тестируй истечение срока.
  • Отправил токен с недостаточными правами403 Forbidden.
  • Каждый тест независим — не нужно «логиниться» в рамках сессии для следующего теста.

Чеклист тестирования авторизации:

[ ] Запрос без токена         → 401
[ ] Запрос с неверным токеном  → 401
[ ] Запрос с просроченным токеном → 401
[ ] Запрос с токеном без нужных прав → 403
[ ] Запрос с корректным токеном → 200

Частые ошибки тестировщиков

  • Не проверять запросы без токена. Это самый базовый security-тест.
  • Считать, что JWT защищает данные. Payload JWT читается без ключа — не клади туда пароли.
  • Игнорировать истечение токена. Токены имеют срок жизни — тестируй expired-сценарии.

Что мы запомним

  • Stateful — сервер помнит состояние клиента (старые сессии).
  • Stateless — каждый запрос самодостаточен, токен передаётся клиентом при каждом запросе.
  • JWT — стандартный токен для stateless аутентификации: Header + Payload + Signature.
  • Stateless удобнее масштабировать — любой сервер обработает любой запрос.
  • Всегда тести: запрос без токена (401), с просроченным (401), с недостаточными правами (403).

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике