Хватит жечь гигабайты на антидетекты: как RFC 9421 и открытый протокол wbauth ускоряют AI-агентов в 5,5 раза


TL;DR. Мы перестали маскировать агентов под людей. Теперь они предъявляют криптографический паспорт: подпись Ed25519 по стандарту IETF RFC 9421. Холодный старт — 5 мс вместо 1744 мс. Запрос — 15,8 мс вместо 86,8 мс. Память — 0,76 МБ вместо 500 МБ. Прокси не нужны. Ниже разбираю архитектуру, канонизацию, проверку на WAF, код и методику замеров. Ограничения замеров тоже описаны честно.

Пролог: 40 гигабайт RAM ради того, чтобы притвориться бабушкой

Типичная ферма агентов в 2026 году выглядит так. Есть кластер нод, на каждой крутятся десятки Camoufox, Playwright или AdsPower. Каждый процесс съедает от 500 МБ до 1,5 ГБ памяти. Есть пул резидентских IP, за который платят по гигабайту трафика. Есть отдельный модуль, который рисует кривые Безье, чтобы курсор двигался «по-человечески». И есть дежурный инженер, который в 3 часа ночи разбирается, почему после обновления fingerprint-эвристик у WAF отвалилось 30% сессий.

Посмотрите на это как архитектор. Мы строим систему, вся ценность которой в том, чтобы лгать о своей природе. Противоположная сторона строит систему, вся ценность которой в том, чтобы ловить эту ложь. Это гонка вооружений с нулевой суммой. Обе стороны платят за железо, никто не выигрывает, а цена растёт каждый квартал.

Антидетект — не инженерное решение, а костыль, который пытается решить задачу идентификации средствами мимикрии.

Задача идентификации в распределённых системах давно решена, и решается она криптографией.


Часть 1. Смена парадигмы: не маскировка, а паспорт

Сайту не важно, человек вы или нет. Ему нужно ответить на три вопроса:

1. Кто делает запрос?

2. Можно ли этому «кто» доверять (репутация, лимиты, договорённости)?

3. Действительно ли запрос пришёл от него, а не от того, кто украл его User-Agent?

Строка User-Agent: MyBot/1.0 отвечает на первый вопрос, но подделывается одной строкой кода. Проверка по IP (reverse DNS, списки ASN) отвечает на третий, но привязывает идентичность к инфраструктуре. Сменили облако — потеряли репутацию.

Правильный ответ — подпись запроса асимметричным ключом. Именно это стандартизирует RFC 9421 — HTTP Message Signatures (IETF, февраль 2024). Поверх него развивается направление Web Bot Auth, где появляется заголовок Signature-Agent: он указывает, где лежит каталог публичных ключей агента.

Итог — три заголовка вместо браузера:

Ни JS-рантайма, ни canvas fingerprint, ни движений мыши. 64 байта подписи и одна операция верификации на краю сети.


Часть 2. wbauth: что мы построили

wbauth — наша открытая реализация протокола. Она состоит из трёх частей:

Компонент

Где

Роль

wb-auth@0.4.0

npm

Подписант (Node / Bun / Deno / Workers) и верификатор для WAF

wbauth-sdk@0.4.0

PyPI

Подписант для Python: адаптеры httpx и requests

Directory

Cloudflare Workers + D1

Каталог публичных ключей: регистрация, ротация, отзыв

Цифры с прода

Метрика

Camoufox

wbauth

Разница

Холодный старт

1744 мс

5 мс

350x быстрее

Время запроса

86,8 мс

15,8 мс

5,5x быстрее

Память процесса

500 мб

0,76 мс

650x меньше

Диск (рантайм)

1,3 ГБ

14 мб

90x компактнее

Ломается при обновлении WAF

Да

Нет

Стабильный контракт


Часть 3. Как это выглядит в коде

python
import httpx
from wbauth import Agent, HttpxAuth

# Загружаем ключ агента из окружения или файла
agent = Agent.from_env()  # Ed25519 приватный ключ + kid + directory_url

# Делаем запросы как обычно — подпись генерируется автоматически
with httpx.Client(auth=HttpxAuth(agent)) as client:
    response = client.get("https://shop.example.com/api/catalog")
    print(response.status_code, response.json())
typescript
import { createSigner, wrapFetch } from "wb-auth";

const signer = await createSigner({
  privateKey: process.env.WBAUTH_PRIVATE_KEY!,
  keyId: process.env.WBAUTH_KEY_ID!,
  directoryUrl: "https://wbauth.silov801.workers.dev",
});

const signedFetch = wrapFetch(fetch, signer);

const response = await signedFetch("https://shop.example.com/api/catalog");
console.log(await response.json());

Часть 4. Как проверяет сервер (WAF / Edge)

На стороне сервера проверка занимает несколько миллисекунд:

1. Достаём заголовок Signature-Agent и запрашиваем публичный ключ из доверенного каталога (с кэшированием в KV/Redis).

2. Собираем каноническую строку подписи по правилам RFC 9421.

3. Проверяем подпись Ed25519 (одна быстрая криптографическая операция).

4. Проверяем временные метки created и expires (защита от replay-атак).

5. Пропускаем запрос к API в обход драконовских капч и блокировок Cloudflare!


Заключение

Эпоха костылей и воровства фингерпринтов подходит к концу. Агенты не должны притворяться людьми — они должны идентифицировать себя цивилизованно и безопасно.

- Исходный код открыт на GitHub: https://github.com/MrKoriy/wbauth

- Пакеты доступны прямо сейчас: npm i wb-auth@0.4.0 и pip install wbauth-sdk==0.4.0

Приглашаю к дискуссии в комментариях: как вы сейчас решаете проблему верификации агентов и верите ли в переход индустрии на криптографические подписи?

Комментарии (0)