Понятие состояния и безсостояния (stateless)
Понятие состояния и безсостояния (Stateful vs Stateless)
Введение
Один из ключевых принципов REST — stateless (без состояния). Но что это значит на практике? Почему это важно для тестировщика? В этом уроке разберём разницу между stateful и stateless подходами, и как это влияет на то, что и как ты тестируешь.
Stateful (с состоянием)
В stateful системах сервер помнит клиента между запросами. Он хранит контекст (сессию) на своей стороне.
Пример — старый подход с сессиями:
- Пользователь логинится → сервер создаёт сессию, сохраняет в памяти, отправляет клиенту
session_id. - Клиент отправляет
session_idв следующем запросе. - Сервер смотрит в хранилище сессий: «а, это Анна, она вошла в систему, роль — admin».
Запрос 1: POST /login → сервер создаёт сессию #abc123
Запрос 2: GET /dashboard → сервер ищет сессию #abc123, находит → «Анна, admin»
Проблема: если сервер перезапустится или запрос попадёт на другой сервер — сессия потеряна.
Stateless (без состояния)
В stateless системах каждый запрос самодостаточен. Сервер не хранит ничего между запросами. Клиент обязан передавать ВСЮ нужную информацию с каждым запросом.
Пример — JWT токен:
- Пользователь логинится → сервер создаёт JWT-токен с данными пользователя, подписывает его и отдаёт клиенту.
- Клиент сохраняет токен и сам отправляет его в каждом следующем запросе.
- Сервер проверяет подпись токена и читает данные прямо из него — ничего не ищет в БД сессий.
Запрос 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 подхода
| Критерий | Stateful | Stateless |
|---|---|---|
| Масштабируемость | Сложно (нужно общее хранилище сессий) | Легко (любой сервер обрабатывает любой запрос) |
| Нагрузка на сервер | Хранит состояние всех клиентов | Не хранит ничего |
| Устойчивость | Падение сервера = потеря сессий | Нет сессий = нечего терять |
| Тестирование | Нужно учитывать порядок запросов | Каждый запрос независим |
Влияние на тестирование
Если 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).