Защита токенов

В контексте работы с картографическими библиотеками, такими как Mapbox GL JS, ключевой точкой риска становится токен доступа. Он обеспечивает авторизацию запросов к API Mapbox, но при неправильной интеграции превращается в прямую поверхность атаки.

Любой токен, попавший в клиентский JavaScript-код, автоматически считается публично доступным. Браузер не предоставляет механизмов скрытия секретов: весь JavaScript, включая переменные окружения сборщика, может быть извлечён через DevTools, прокси-инструменты или анализ сетевых запросов.

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


Природа access token в Mapbox

Access token в системе Mapbox выполняет роль идентификатора проекта и механизма контроля доступа к API. Он может быть:

  • публичным (public token)
  • секретным (secret token)
  • токеном с ограничениями (restricted token)

В контексте Mapbox GL JS используется преимущественно публичный токен, однако его «публичность» не означает отсутствие защиты. Напротив, безопасность достигается через ограничения, а не сокрытие.


Базовый принцип защиты: не прятать, а ограничивать

Попытка скрыть токен в клиентском коде является архитектурной ошибкой. Даже минимально опытный пользователь может извлечь его из:

  • bundle-файлов (webpack, Vite, Rollup)
  • runtime-конфигурации приложения
  • сетевых запросов к API Mapbox
  • локального хранилища браузера

Поэтому стратегия безопасности строится не на сокрытии, а на ограничении прав использования токена.


Ограничение токена через dashboard Mapbox

Основной уровень защиты реализуется через панель управления Mapbox.

Настраиваемые ограничения:

1. Ограничение по доменам (URL restrictions)

Токен можно привязать к списку разрешённых доменов:

  • example.com
  • app.example.com
  • localhost (для разработки)

Это предотвращает использование токена вне контролируемой среды.

Особенность: даже при утечке токена он не будет работать на чужом домене.


2. Ограничение API-прав

Токен может быть ограничен только нужными сервисами:

  • Maps
  • Tiles
  • Geocoding
  • Directions

Принцип минимальных привилегий снижает ущерб при компрометации.


3. Ограничение по использованию (rate limits)

Даже при утечке токена злоумышленник не сможет бесконечно генерировать запросы, если включены лимиты.


Архитектурная защита: разделение client-side и server-side

Одним из ключевых подходов является вынос чувствительных операций на сервер.

Сервер как прокси для Mapbox API

Вместо прямого обращения клиента:

Client → Mapbox API

используется схема:

Client → Backend → Mapbox API

Преимущества:

  • токен хранится только на сервере
  • контроль логики запросов
  • возможность фильтрации и кэширования

Особенно актуально для секретных токенов Mapbox.


Переменные окружения и сборка

В приложениях на Mapbox GL JS часто используется подключение токена через .env:

MAPBOX_TOKEN=pk.1234567890

Однако важно понимать:

Ошибка восприятия безопасности .env

Переменные окружения в frontend-проектах:

  • встраиваются в bundle
  • становятся частью статического JS
  • доступны пользователю

То есть .env в клиентском приложении — это способ конфигурации, а не защиты.


Безопасная конфигурация сборщиков

При использовании Vite, Webpack или аналогов необходимо учитывать:

Vite

Все переменные VITE_* становятся публичными:

VITE_MAPBOX_TOKEN → доступен в браузере

Webpack

DefinePlugin также встраивает значения в код:

new DefinePlugin({
  MAPBOX_TOKEN: JSON.stringify(process.env.MAPBOX_TOKEN)
})

Вывод: сборщик не обеспечивает секретность, он лишь автоматизирует инъекцию значений.


Защита через backend-выдачу токена

Более строгий подход — динамическая выдача временных токенов.

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

  1. Пользователь проходит авторизацию
  2. Backend проверяет права
  3. Backend запрашивает или генерирует ограниченный токен
  4. Токен выдаётся клиенту на короткий срок

Преимущества:

  • токены имеют TTL
  • можно отзывать доступ мгновенно
  • контроль на уровне бизнес-логики

Использование короткоживущих токенов

В инфраструктуре Mapbox возможно использование временных токенов (temporary tokens).

Их свойства:

  • срок жизни ограничен (минуты/часы)
  • ограничены scopes
  • привязаны к сессии пользователя

Это снижает ценность утечки: даже перехваченный токен быстро становится бесполезным.


Ограничение запросов на уровне приложения

Даже при использовании Mapbox GL JS можно внедрять дополнительные меры:

1. Дебаунс и троттлинг

Особенно важно для:

  • геокодинга
  • поиска адресов
  • маршрутизации

Пример стратегии:

  • задержка 300–500 мс между запросами
  • отмена предыдущего запроса при новом вводе

2. Кэширование запросов

Локальное кэширование уменьшает количество обращений к API:

  • in-memory cache
  • localStorage (ограниченно)
  • IndexedDB (для больших наборов)

Защита от утечки через репозитории

Частый источник компрометации — публичные Git-репозитории.

Рекомендуемые меры:

  • использование .gitignore для .env
  • секрет-сканеры (GitHub Secret Scanning)
  • pre-commit hooks
  • автоматический аудит зависимостей

Риски логирования и аналитики

Токены часто случайно попадают в:

  • логи фронтенда
  • Sentry / error tracking
  • аналитические события

Важно исключать их из payload:

  • маскирование строк
  • фильтрация query parameters
  • sanitization middleware

CSP и сетевые ограничения

Content Security Policy может ограничить:

  • домены запросов
  • подключение сторонних скриптов

Пример защиты:

  • разрешить только https://api.mapbox.com
  • блокировать неизвестные endpoints

Это не защищает токен напрямую, но снижает поверхность атак.


Модель угроз для Mapbox-токена

При работе с Mapbox GL JS типичные угрозы включают:

  • кража токена из bundle
  • использование токена на стороннем сайте
  • DDoS через API
  • превышение квоты
  • анализ бизнес-логики через геоданные

Многоуровневая стратегия защиты

Безопасность токенов достигается не одной мерой, а комбинацией:

  • доменные ограничения
  • API scope restriction
  • rate limiting
  • backend-proxy архитектура
  • временные токены
  • мониторинг использования
  • очистка логов
  • защита репозиториев

Каждый слой компенсирует слабости другого, формируя устойчивую систему даже при неизбежной публичности client-side токенов.