Открыть сервис

VAPID

VAPID (англ. Voluntary Application of Public Keys to Identification, «добровольное применение открытых ключей для идентификации») — это открытый протокол аутентификации, используемый в веб-приложениях для подтверждения подлинности сервера, отправляющего push-уведомления, и связывания подписки пользователя с конкретным сервером. Протокол разработан для работы в связке с технологией Web Push и спецификацией Push API, обеспечивая безопасный канал доставки уведомлений в браузерах.

Назначение и область применения

VAPID решает проблему доверия между тремя сторонами: браузером пользователя, сервером приложений (push-сервисом) и службой доставки push-уведомлений (например, Firebase Cloud Messaging или Mozilla Autopush). Без VAPID любой сервер мог бы отправлять уведомления на подписку, созданную другим приложением, что создавало риск спама и фишинга. Протокол позволяет браузеру проверять, что push-уведомление отправлено именно тем сервером, которому пользователь дал разрешение на их получение.

Протокол стандартизирован в документе RFC 8292 (опубликован в декабре 2017 года) рабочей группой IETF. Он базируется на асимметричной криптографии на эллиптических кривых (алгоритм ECDSA, кривая P-256).

Принцип работы

Генерация ключей

Владелец веб-приложения генерирует пару ключей: закрытый ключ хранится на сервере, открытый ключ встраивается в код приложения или передаётся браузеру при подписке на уведомления. Ключи создаются однократно и могут использоваться в течение длительного времени.

Создание подписки

Когда пользователь даёт согласие на получение push-уведомлений, браузер создаёт подписку (subscription) и отправляет на сервер приложений следующие данные:

  • endpoint — URL службы доставки push-уведомлений;
  • ключ аутентификации (auth secret) — случайный секрет, сгенерированный браузером;
  • открытый ключ P-256 — ключ, сгенерированный браузером для шифрования полезной нагрузки.

Формирование заголовка

При отправке push-сообщения сервер добавляет в HTTP-запрос заголовок Authorization со значением vapid t=<JWT-токен>, k=<открытый ключ>. JWT-токен (JSON Web Token) содержит следующие поля:

  • aud — адрес endpoint (обязательное поле);
  • exp — время истечения токена (обязательное, обычно не более 24 часов);
  • sub — контактная информация (электронная почта или URL) владельца сервера (рекомендуемое поле).

Токен подписывается закрытым ключом сервера. Открытый ключ сервера передаётся в параметре k заголовка.

Проверка на стороне браузера

Служба доставки push-уведомлений получает запрос, извлекает открытый ключ сервера из параметра k, проверяет подпись JWT-токена и сверяет поле aud с адресом endpoint. После успешной проверки уведомление доставляется браузеру, который дополнительно проверяет соответствие открытого ключа сервера ключу, сохранённому при подписке.

Преимущества и ограничения

VAPID обеспечивает следующие возможности:

  • Идентификация сервера — получатель уведомления всегда знает, кто его отправил;
  • Защита от подмены — злоумышленник без закрытого ключа не сможет подписать корректный токен;
  • Отсутствие необходимости в сторонних сервисах — не требуется регистрация у конкретного вендора браузеров;
  • Совместимость с различными push-сервисами — протокол работает с любым сервисом, поддерживающим Web Push.

Ограничения протокола связаны с тем, что он не шифрует полезную нагрузку сообщения — шифрование данных обеспечивается отдельным механизмом (Web Push Encryption, RFC 8291). VAPID отвечает только за аутентификацию отправителя.

Поддержка браузерами

Протокол VAPID поддерживается всеми современными браузерами, реализующими Push API: Google Chrome (с версии 42), Mozilla Firefox (с версии 44), Microsoft Edge (на базе Chromium), Opera и Safari (с версии 16.4). В старых версиях браузеров требовался «устаревший» способ аутентификации через ключ подписки (GCM API key), который в настоящее время полностью вытеснен VAPID.

Практическое применение

VAPID широко используется в веб-приложениях, где необходима доставка push-уведомлений: интернет-магазины, мессенджеры, сервисы электронной почты, новостные порталы. Библиотеки для работы с протоколом реализованы на большинстве популярных языков программирования — JavaScript (Node.js), Python, PHP, Java, Go, Ruby. Примером реализации является библиотека web-push для Node.js, которая автоматизирует генерацию ключей, создание JWT-токена и формирование заголовков.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →