# web-bot-auth

## Что такое Web Bot Auth?

**Web Bot Auth** — это профиль стандарта RFC 9421 (HTTP Message Signatures) для криптографической идентификации AI-ботов и краулеров. Бот подписывает каждый HTTP-запрос приватным ключом Ed25519, а сайт верифицирует подпись через публичный ключ из директории `/.well-known/http-message-signatures-directory`.

Это принципиально отличается от проверки по User-Agent: заголовок User-Agent можно подделать, а криптографическую подпись — нет.

Инициатива продвигается Cloudflare и оформлена в двух активных IETF-черновиках: протокольный (как подписывать) и директорийный (где публиковать ключи). RFC 9421 вышел в феврале 2024 года как Proposed Standard и уже стабилен.

## Зачем сайту Web Bot Auth?

User-Agent в robots.txt — единственный инструмент разграничения ботов сегодня. Он ненадёжен: любой скрейпер может назваться «ClaudeBot» или «GPTBot».

Web Bot Auth решает три задачи:

1. **Верификация идентичности** — убедиться, что запрос действительно от GPTBot OpenAI, а не от скрейпера с поддельным заголовком
2. **Гранулярный контроль доступа** — пускать верифицированных ботов к платному или чувствительному контенту, блокируя неверифицированных
3. **Rate-limiting по идентификатору** — ограничивать нагрузку по конкретному агенту, а не по IP (IP у ботов часто меняется)

На 2026 год: Google публикует ключи для своего AI-browsing агента на `agent.bot.goog`. Cloudflare интегрировал Web Bot Auth в программу Verified Bots.

## Как работает Web Bot Auth?

Механизм в трёх шагах:

**1. Бот генерирует ключевую пару Ed25519** и публикует публичный ключ в формате JWKS:
```
GET https://bot.example.com/.well-known/http-message-signatures-directory
→ { "keys": [{ "kty": "OKP", "crv": "Ed25519", "x": "..." }] }
```

**2. Бот подписывает запрос** тремя дополнительными заголовками:
```http
Signature-Agent: <https://bot.example.com/.well-known/http-message-signatures-directory>
Signature-Input: sig1=("@method" "@path" "@authority");keyid="key-1";created=1716900000;expires=1716900300;tag="web-bot-auth";alg="ed25519"
Signature: sig1=:Base64EncodedSignatureBytes==:
```

**3. Сайт верифицирует** — скачивает публичный ключ из директории бота, проверяет подпись по RFC 9421.

Параметр `tag="web-bot-auth"` отличает бот-подписи от других применений RFC 9421.

## Как опубликовать Web Bot Auth directory?

**Для краулеров и агентов** (вы хотите, чтобы сайты могли верифицировать ваш бот):

Сгенерируйте ключевую пару Ed25519 и опубликуйте публичный ключ:

```bash
# Генерация ключа (Node.js)
node -e "
const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('ed25519');
console.log(publicKey.export({ type: 'spki', format: 'pem' }));
"
```

Опубликуйте JWKS по пути `/.well-known/http-message-signatures-directory`:

```json
{
  "keys": [
    {
      "kty": "OKP",
      "crv": "Ed25519",
      "kid": "key-2026-01",
      "x": "Base64urlEncodedPublicKey"
    }
  ]
}
```

**Для сайтов** (вы хотите верифицировать входящих ботов):

Используйте npm-пакет `web-bot-auth` от Cloudflare или интегрируйте RFC 9421 проверку в middleware. При наличии Cloudflare WAF — Verified Bots уже включены в платформу.

## Как мы проверяем Web Bot Auth?

Проверка **информационная** (`informational: true`) — отсутствие не штрафует score, так как директория нужна ботам, а не сайтам. Большинству сайтов публиковать директорию не нужно.

Сканер делает `GET /.well-known/http-message-signatures-directory` и проверяет:

1. **HTTP 200** — файл доступен
2. **Валидный JSON** — парсится без ошибок
3. **JWKS-формат** — присутствует поле `keys` как массив

Статус **pass** — валидный JWKS с ключами опубликован. Статус **neutral** — файл не найден (HTTP 404) или недоступен: это норма для большинства сайтов. Статус **neutral** — JSON найден, но невалиден или нет поля `keys`.

[← Все термины глоссария](/glossary)
