Базовый flow Challenge-response
- Сервер принимает запрос и по policy решает выдать Challenge.
- Создаёт challenge state: CID/token, nonce, expiry и разрешённый provider/asset context.
- Клиент отображает задачу и отправляет ответ.
- Сервер валидирует token, expiry, nonce, replay state и сам ответ.
- При успехе выдаётся ограниченная авторизация/continuation state; событие попадает в reputation/trace.
Зачем opaque token
Клиент не должен получать внутренние признаки Risk Engine, секреты или SQL/DB identifiers, которые можно подделать. Opaque token связывает публичный протокол с серверным состоянием без раскрытия деталей.
Replay protection и single-use
- nonce должен быть уникальным в нужной области;
- token имеет срок жизни;
- успешно использованный challenge нельзя бесконечно повторять;
- повторная отправка должна иметь отдельный event/reason;
- state transition должен быть устойчив к конкурентным запросам.
Почему assets тоже часть протокола
Для image-based Challenge недостаточно записи в БД: активный asset должен существовать, читаться и реально отдаваться HTTP-сервером. Иначе пользователь получает сломанную задачу, а система не имеет права считать subsystem READY.
Fallback и отказоустойчивость
Ошибка provider/asset не должна превращаться в бесконечную последовательность Challenge → reload → Challenge. Нужен здоровый fallback или безопасная деградация.
HTTP self-check assets не нужен на каждом visitor request: его место — installer acceptance, diagnostics, maintenance и scheduled health.
Challenge Protocol v2 в AntiPF
AntiPF сохраняет opaque tokens, single-use, CID+nonce, Visitor Authorization и recovery-механику. В 10.050 readiness дополнительно зависит от реальной доступности активных assets и fallback.