Как понять отсутствие состояния в REST
Что проверяют
Понимаете ли вы, что stateless в REST относится к серверу и к отдельному запросу, а не к приложению целиком. Следом почти всегда спрашивают: как тогда работает авторизация, если сервер «ничего не помнит», и чем cookie с сессией отличается от JWT.
Как отвечать
Отсутствие состояния означает: каждый запрос несёт всё, что нужно серверу для его обработки, и сервер не опирается на контекст предыдущих запросов этого клиента. Состояние приложения (открытая страница, корзина, шаг мастера) живёт на клиенте, а состояние ресурсов (заказы, пользователи) лежит в базе, и это принцип не нарушает.
Для фронтенда это выливается в конкретные вещи:
- авторизация в каждом запросе: токен в заголовке
Authorization: Bearer ...или cookie, которую браузер прикладывает сам. Сервер проверяет её каждый раз; - параметры в запросе: фильтры, сортировка, номер страницы идут в query string или в теле, а не «запоминаются» после прошлого вызова;
- пагинация по курсору: клиент передаёт курсор из прошлого ответа, серверу не нужно хранить позицию;
- повторяемость: любой запрос можно повторить или отправить на другой инстанс за балансировщиком. Отсюда простое горизонтальное масштабирование.
Сессия в памяти одного процесса нарушает принцип: без sticky sessions следующий запрос попадёт на другой сервер, и пользователь «разлогинится». Сессия во внешнем хранилище вроде Redis снимает проблему балансировки, но строго по Филдингу это тоже отступление: состояние сессии должно жить на клиенте.
Цена подхода: запросы тяжелее, клиент отвечает за своё состояние, а отозвать JWT до истечения срока без отдельного списка отзыва нельзя.
Где спотыкаются
Говорят, что stateless значит «сервер ничего не хранит». Хранит: данные в базе никуда не деваются, не хранится только контекст диалога с конкретным клиентом.
Считают, что cookie автоматически нарушают REST. Cookie это просто транспорт, вопрос в том, что за ней стоит: самодостаточный токен или ссылка на сессию в памяти конкретного процесса.
Путают отсутствие состояния с идемпотентностью. Это разные свойства: stateless касается контекста, а идемпотентность означает, что повтор PUT или DELETE не меняет результат.