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 →
