Как защитить API от повторного выполнения операций
Классика: клиент шлёт POST, сервер уже всё сделал, но ответ потерялся по тайм-ауту. Клиент повторяет запрос — и без защиты сервер второй раз создаёт ресурс, меняет состояние или отправляет письмо.
Решает это идемпотентность. Эндпоинт связывает уникальный ключ операции с отпечатком тела запроса и сохранённым результатом. Первый обработчик атомарно резервирует ключ, так что параллельные запросы не запускают операцию заново.
Дальше логика простая:
— повтор с тем же телом → отдаём прежний результат
— тот же ключ, но другое содержимое → 409 Conflict
Полноценный контракт учитывает ещё статус незавершённой обработки, срок жизни ключей и внешние эффекты. Событие для очереди пишем вместе с результатом в одной транзакции — тогда повтор не породит второе действие.
Подписывайся, чтобы не пропустить разборы по бэкенду и архитектуре — выходят регулярно
#API #backend #идемпотентность
Классика: клиент шлёт POST, сервер уже всё сделал, но ответ потерялся по тайм-ауту. Клиент повторяет запрос — и без защиты сервер второй раз создаёт ресурс, меняет состояние или отправляет письмо.
Решает это идемпотентность. Эндпоинт связывает уникальный ключ операции с отпечатком тела запроса и сохранённым результатом. Первый обработчик атомарно резервирует ключ, так что параллельные запросы не запускают операцию заново.
Дальше логика простая:
— повтор с тем же телом → отдаём прежний результат
— тот же ключ, но другое содержимое → 409 Conflict
Полноценный контракт учитывает ещё статус незавершённой обработки, срок жизни ключей и внешние эффекты. Событие для очереди пишем вместе с результатом в одной транзакции — тогда повтор не породит второе действие.
Подписывайся, чтобы не пропустить разборы по бэкенду и архитектуре — выходят регулярно
#API #backend #идемпотентность