Как сервер распознаёт повтор запроса
Представьте, что клиент отправил серверу команду перевести деньги или изменить настройки. Если злоумышленник перехватит сообщение, ему не обязательно понимать его содержание: иногда достаточно отправить серверу точную копию. Такая атака называется повтором, или replay-атакой. Она опасна, когда сервер воспринимает копию как новую команду.
Чтобы различать обращения, сервер может включать в запрос одноразовое число — уникальную метку, которую называют nonce. Клиент возвращает её вместе с сообщением, а сервер проверяет, выдавал ли он эту метку и не была ли она уже использована. При первой проверке запрос проходит; при следующей сервер распознаёт знакомую метку и отказывает.
Почему одной метки недостаточно
Защита зависит не только от числа, но и от того, что сервер делает после проверки. Он должен надёжно отметить метку использованной и сохранять эту отметку достаточно долго. Если запись потеряется — например, после сбоя или перезапуска, — скопированный запрос может снова показаться серверу новым.
Есть и гонка: две копии могут прийти почти одновременно. Если сервер сначала проверит обе, а отметит использованной метку только потом, он рискует принять обе. Поэтому проверку и фиксацию использования нужно выполнять как одну неделимую операцию: либо запрос принимается и метка сразу становится занятой, либо запрос отклоняется.
Где хранится память о запросе
В распределённой системе запрос может попасть на разные серверы. Если каждый ведёт учёт отдельно, второй узел не узнает, что первый уже использовал метку. Поэтому состояние приходится синхронизировать между узлами или направлять связанные запросы туда, где есть актуальная запись.
Именно эта «память» превращает одноразовое число в защиту: без надёжного учёта сервер не отличит повторную запись от первого обращения.






