Как защитить запросы POST на нескольких серверах, чтобы сделать их временно идемпотентными?

Как мы знаем, метод POST не является идемпотентным. Если пользователь отправит несколько запросов за короткое время, операция будет повторена.
Например:

  • POST-запрос на создание отправки вызывается пользователем.
  • Одинаковые отправки разрешены сервером, поэтому, если пользователь отправляет один и тот же запрос дважды, второй не завершается ошибкой из-за нарушения уникального ограничения.
  • Пользователь случайно отправляет два запроса, создавая два идентичных ресурса (за исключением автоматически сгенерированного идентификатора ресурса).

Как избежать этого, обеспечив при этом возможность масштабирования моего сервера? Если бы у меня был только один экземпляр, я мог бы добавить временный список тайм-аутов на сервер, который не позволял бы пользователю временно выполнять аналогичные запросы на одном сервере. Однако если запрос будет передан другому экземпляру сервера, этот сервер не будет иметь пользователя в списке тайм-аутов и нормально обработает второй запрос.
Я знаю, что могу реализовать что-то на стороне клиента, например кнопка временной отправки отключена, поэтому пользователи могут отправлять только один запрос за раз, однако есть ли способ справиться с этим на стороне сервера?


person Potatosaurus    schedule 17.05.2017    source источник


Ответы (1)


Предостережение: у меня нет большого производственного опыта в веб-разработке.

Если цель состоит в том, чтобы защитить от случайного двойного нажатия клавиши «Отправить», то я бы каким-то образом добавил сгенерированный GUID на веб-страницу POST (поле формы?). Размещенное содержимое и GUID образуют уникальный ключ. Это предотвращает отправку одного и того же содержимого дважды с одной и той же сгенерированной страницы.

person Community    schedule 17.05.2017
comment
Такое решение было бы легче исправить, временно отключив кнопку после первого нажатия. Одна из причин, по которой я хотел бы, чтобы защита на стороне сервера заключалась в предотвращении спама от вредоносных агентов, и возможность иметь функциональность на стороне сервера, которая временно блокирует пользователя, кажется оптимальным решением. - person Potatosaurus; 17.05.2017