IOSOR База знаний

Гейт подписи и окна replay

Prod-гейт: проверить подпись и ограничить окно replay до того, как webhook станет money или status truth — unsigned/stale остаются fail-closed.

Неподписанный или протухший webhook — не status truth и не должен двигать prepaid money. Покупателю нужен жёсткий гейт: verify подписи плюс ограниченное окно replay до любого обновления ledger или product status. Эта страница — именно гейт, не эссе про ротацию подписи и не playbook inbound SMS retry.

Связанные: подпись webhook и окно replay, повторы входящего вебхука, Общий язык статусов для product и finance, debit и delivery status в одном ledger.

IOSOR — white-label prepaid. USD 20 оплачивает пилот гейта на одном consumer; soft review около USD 1 000/мес делает пропуск verify риском forged-status. Клиент видит только white-label reject macros.

Verify подписи — money gate

Money и status truth начинаются только после прохождения проверки подписи. Missing, mismatched или skipped подписи fails closed — нет строки ledger, нет «delivered всё равно для пилота». Catalog Live не отменяет гейт. Глубина привычек: подпись webhook и окно replay. Soft USD 1 000/мес считает «принимать unsigned в staging вечно» долгом production; USD 20 доказывает: поддельное тело никогда не пишет debit.

Окно replay до status truth

Проверка гейта Pass значит Fail значит
Подпись есть + валидна Authenticated event Reject; нет money/status write
Timestamp внутри окна Достаточно свежий Reject как replay/stale
Event ID ещё не видели Первый accept ACK без второго debit
Событие в контракте В меню buyer Drop unknown type

At-least-once доставка будет ретраить. Поздний retry вне окна — не «maybe delivered». Логируйте отказы окна отдельно от fails подписи. Глубина inbound retry: повторы входящего вебхука.

Fail closed, когда гейт отклоняет

Отклонённые события никогда не изобретают success. Product и finance делят одни слова reject — не hero upstream codes: Общий язык статусов для product и finance. Строки debit остаются только на accepted events: debit и delivery status в одном ledger. Side effects только после ACK; CRM до гейта — путь к double truth.

Product, finance и ops делят одно proof

Product: легитимное signed, in-window событие обновляет status ровно раз? Finance: каждый money-affecting event показывает gate pass в том же UTC-окне? Ops: выгрузка signature fails vs window rejects без Slack-археологии? Soft volume language blocked, пока duplicate-in-window smoke не покажет одну строку ledger.

Чеклист покупателя по гейту подписи и replay

  1. Signature middleware на каждом production consumer до платного трафика?
  2. Окно replay названо, логируется и ограничено — не «недели»?
  3. Gate reject никогда не пишет money или success status?
  4. Дубликат in-window event ID → одно конечное состояние, без второго debit?
  5. Signature fail и window reject считаются отдельно для ops?
  6. Разговор soft USD 1 000/мес blocked, пока гейт выключен?

Любое «нет» держит гейт — и доверенную webhook truth — в draft.

Начните с IOSOR

Проверьте настройки HMAC-подписи и временного окна replay-window в консоли IOSOR перед включением боевого трафика вебхуков. Задайте жесткое ограничение свежести метки времени UTC и убедитесь, что промежуточное ПО блокирует входящие события без валидной подписи. Настройте экспорт ошибок шлюза, чтобы разделять атаки повторного воспроизведения и недействительные подписи.

Итог IOSOR

Эта статья подтвердила, что проверка подписи и временного окна является обязательным денежным шлюзом.

Был ли материал полезен?

Связанные гайды