Ротация токенов

Ротация токенов в Mapbox GL JS начинается с понимания роли access token как ключевого механизма авторизации всех запросов к сервисам Mapbox. Каждый вызов стиля, тайлов, геокодирования или векторных данных в браузере привязан к токену, который идентифицирует приложение и определяет набор разрешений.

В Mapbox GL JS токен устанавливается глобально через:

mapboxgl.accessToken = 'YOUR_ACCESS_TOKEN';

После этого библиотека автоматически подставляет его во все сетевые запросы к API Mapbox. Это делает токен критически важным элементом безопасности и управления доступом.

Ротация токенов используется не как дополнительная мера, а как стандартная практика управления доступом:

Утечка токена Даже при корректной архитектуре токен может попасть в публичный доступ (например, через фронтенд-бандл, логи, ошибочную публикацию репозитория). Ротация позволяет быстро вывести скомпрометированный ключ из эксплуатации.

Ограничение ущерба Если токен используется без ограничений по доменам или правам, его компрометация может привести к злоупотреблению API-лимитами или несанкционированным запросам.

Разделение окружений Разные токены используются для development, staging и production. Ротация позволяет переключать окружения без изменения кода клиента.

Регламент безопасности Во многих системах токены должны обновляться регулярно независимо от факта компрометации.

Модель управления токенами

В Mapbox обычно применяются два класса токенов:

  • публичные токены (public tokens) — используются в браузере
  • приватные токены (secret tokens) — используются на сервере для генерации или управления ресурсами

Для Mapbox GL JS всегда используется публичный токен, но он может быть ограничен:

  • по доменам (Allowed URLs)
  • по API (scopes)
  • по IP (для server-side сценариев)

Ротация строится вокруг замены одного действующего токена на другой без остановки работы приложения.

Базовая стратегия ротации (dual-token)

Наиболее распространённая схема — одновременное существование двух токенов:

  • TOKEN_CURRENT — активный
  • TOKEN_NEXT — подготовленный на замену

Процесс:

  1. создаётся новый токен в панели Mapbox
  2. он добавляется в конфигурацию системы
  3. клиент начинает получать новый токен
  4. старый токен постепенно выводится из обращения

Важно, что переход должен быть без изменения клиентского кода.

Централизованная выдача токена

Жёстко зашитый токен в фронтенде делает ротацию невозможной без пересборки. Поэтому используется промежуточный слой.

Серверная выдача конфигурации

Пример API, который отдаёт токен:

app.get('/config/mapbox', (req, res) => {
  res.json({
    mapboxToken: process.env.MAPBOX_TOKEN
  });
});

На клиенте:

fetch('/config/mapbox')
  .then(res => res.json())
  .then(config => {
    mapboxgl.accessToken = config.mapboxToken;

    const map = new mapboxgl.Map({
      container: 'map',
      style: 'mapbox://styles/mapbox/streets-v11'
    });
  });

Такой подход позволяет менять токен на сервере без перекомпиляции фронтенда.

Rolling rotation (скользящая ротация)

При высокой нагрузке или распределённой инфраструктуре применяется постепенная ротация:

  • часть пользователей получает старый токен
  • часть — новый
  • затем процент постепенно увеличивается до 100%

Реализация возможна через feature flag систему или A/B routing на backend:

function getMapboxToken(userId) {
  const bucket = hash(userId) % 100;

  if (bucket < 80) {
    return process.env.MAPBOX_TOKEN_V1;
  }

  return process.env.MAPBOX_TOKEN_V2;
}

Это снижает риск массового отказа при ошибке нового токена.

Ограничение токенов как часть ротации

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

  • только public scopes для Mapbox GL JS
  • ограничение по домену (например, https://example.com/*)
  • отключение лишних API (geocoding, directions), если не используются

Это уменьшает необходимость экстренной ротации при утечке.

Автоматизация ротации

В зрелых системах ротация токенов включается в CI/CD процесс:

  • хранение токенов в secrets manager (AWS Secrets Manager, Vault)
  • автоматическое обновление переменных окружения
  • перезапуск backend-сервисов при смене секретов
  • обновление edge-конфигураций (CDN, serverless)

Пример логики в CI:

export MAPBOX_TOKEN=$(vault kv get -field=token secret/mapbox/prod)
npm run deploy

В serverless-архитектурах токен может обновляться без деплоя через runtime-конфигурацию.

Кэширование и проблемы распространения

При ротации токенов критично учитывать кэширование:

  • CDN может кешировать конфигурационные JSON
  • Service Worker может хранить старый токен
  • SPA-приложение может не перезагружать конфиг

Решения:

  • установка короткого TTL для конфигов
  • versioning конфигурации:
{
  "version": "2026-06-01",
  "mapboxToken": "..."
}
  • принудительное обновление при смене версии

Fallback-механизм

При ошибке нового токена система должна уметь откатиться:

async function initMap() {
  try {
    mapboxgl.accessToken = await fetchToken('primary');

    return new mapboxgl.Map({
      container: 'map',
      style: 'mapbox://styles/mapbox/streets-v11'
    });
  } catch (e) {
    mapboxgl.accessToken = await fetchToken('fallback');

    return new mapboxgl.Map({
      container: 'map',
      style: 'mapbox://styles/mapbox/streets-v11'
    });
  }
}

Такой подход снижает риск полной недоступности карты при ошибке ротации.

Мониторинг использования токенов

Ротация невозможна без наблюдаемости. Обычно отслеживаются:

  • количество запросов по токенам
  • 4xx/5xx ошибки Mapbox API
  • география использования
  • превышение лимитов

При резком росте ошибок после смены токена происходит автоматический rollback.

Типичные ошибки при ротации

Жёстко зашитый токен в клиенте Любое изменение требует пересборки и повторного деплоя.

Отсутствие overlap периода Мгновенная замена токена без периода сосуществования приводит к массовым сбоям.

Игнорирование CDN-кэша Старый токен продолжает использоваться даже после обновления конфигурации.

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

Практика безопасной ротации

Устойчивый процесс обычно включает:

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

Такая модель обеспечивает непрерывную работу Mapbox GL JS-приложений без перерывов в отрисовке карт и деградации пользовательского опыта