Временные токены

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


Базовая модель токенов доступа

Токен доступа в Mapbox представляет собой строку, которая передаётся в Mapbox GL JS при инициализации карты и используется для:

  • загрузки тайлов (vector tiles, raster tiles)
  • обращения к стилям (styles API)
  • геокодирования и других сервисов
  • получения ресурсов через CDN Mapbox

Типичный публичный токен передаётся в клиентский код:

mapboxgl.accessToken = 'pk.eyJ1Ijoiexample"...';

Такие токены начинаются с префикса pk. (public token) и обычно используются непосредственно в браузере. Их главный недостаток — долговременная валидность, из-за чего компрометация приводит к длительному несанкционированному доступу.


Проблема долгоживущих токенов в клиентских приложениях

Размещение постоянного access token в клиентском JavaScript создаёт несколько системных рисков:

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

Особенно критично это в SPA и публичных веб-картах, где исходный код полностью доступен пользователю.

Эта проблема привела к появлению концепции временных токенов.


Временные токены как механизм ограничения риска

Временный токен представляет собой access token с ограниченным сроком жизни (TTL — time to live). Он выдаётся серверной частью приложения и используется клиентом только в течение короткого интервала времени.

Основные характеристики:

  • ограниченное время действия (от нескольких минут до часов)
  • возможность ограничения прав (scopes)
  • привязка к конкретному пользователю или сессии
  • возможность автоматического обновления

Такая модель делает утечку токена значительно менее критичной.


Архитектура работы временных токенов

Типичная схема взаимодействия включает три компонента:

  1. Клиент (Mapbox GL JS в браузере)
  2. Сервер приложения
  3. API аутентификации Mapbox

Поток выглядит следующим образом:

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

Генерация временного токена на стороне сервера

Сервер обычно использует секретный токен (sk.), который никогда не попадает в браузер. На его основе создаётся ограниченный токен.

Пример серверной логики (Node.js):

import fetch from 'node-fetch';

async function createTemporaryToken() {
  const response = await fetch('https://api.mapbox.com/tokens/v2', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      expires: '2026-06-01T12:00:00Z',
      scopes: [
        'styles:read',
        'fonts:read',
        'datasets:read'
      ],
      allowedUrls: ['https://example.com']
    })
  });

  const data = await response.json();
  return data.token;
}

Ключевые параметры:

  • expires — время истечения токена
  • scopes — набор разрешений
  • allowedUrls — ограничение по доменам

Использование временного токена в Mapbox GL JS

После получения токена он передаётся в клиент:

mapboxgl.accessToken = TEMPORARY_TOKEN;

const map = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v12',
  center: [69.2401, 41.2995],
  zoom: 10
});

Mapbox GL JS автоматически использует этот токен для всех сетевых запросов, включая загрузку:

  • style JSON
  • sprite sheets
  • glyphs (шрифты)
  • vector tiles

Ограничение токенов по домену и правам

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

Ограничение по доменам

"allowedUrls": [
  "https://app.example.com",
  "https://admin.example.com"
]

Такой токен не будет работать при попытке использования на другом домене.


Ограничение по правам (scopes)

Scopes определяют, какие операции разрешены:

  • styles:read
  • tiles:read
  • fonts:read
  • datasets:read

Отсутствие лишних прав уменьшает поверхность атаки при утечке токена.


Автоматическое обновление временных токенов

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

Типовой подход:

  • хранение времени истечения токена
  • фоновые запросы обновления
  • замена токена в runtime Mapbox GL JS

Пример логики обновления:

async function refreshTokenIfNeeded() {
  const newToken = await fetch('/api/mapbox-token').then(r => r.text());
  mapboxgl.accessToken = newToken;
}

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


Разделение публичных и временных токенов

В экосистеме Mapbox выделяются три уровня токенов:

Публичные токены

  • начинаются с pk.
  • используются в браузере
  • могут быть долгоживущими
  • часто ограничены по URL

Секретные токены

  • начинаются с sk.
  • используются только на сервере
  • дают полный доступ к API
  • никогда не должны попадать в клиент

Временные токены

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

Использование временных токенов в SPA архитектуре

В одностраничных приложениях (SPA) временные токены часто интегрируются через слой API:

  • фронтенд выполняет запрос /api/mapbox-token
  • сервер проверяет авторизацию пользователя
  • сервер выдаёт токен с ограничениями
  • клиент обновляет Mapbox GL JS без перезагрузки

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


Безопасность и типичные ошибки

Несмотря на наличие временных токенов, остаются распространённые проблемы:

Утечка секретного токена

Размещение sk. токена в frontend полностью компрометирует систему.

Отсутствие ограничения по URL

Даже временный токен без allowedUrls может быть использован вне контекста приложения.

Слишком долгий TTL

Токен с длительным сроком жизни фактически эквивалентен постоянному ключу.

Кэширование токенов

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


Интеграция с серверной авторизацией

В продвинутых системах временные токены привязываются к пользователям:

  • OAuth 2.0 авторизация
  • JWT-сессии
  • серверные сессии

Логика генерации токена может учитывать:

  • уровень пользователя
  • тарифный план
  • географические ограничения
  • лимиты запросов

Поведение Mapbox GL JS при истечении токена

При истечении срока действия токена библиотека:

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

Поэтому обновление токена должно быть синхронизировано с жизненным циклом карты.


Оптимизация частоты выдачи временных токенов

Частая генерация токенов увеличивает нагрузку на сервер. Для оптимизации применяются:

  • кэширование токенов на уровне сессии
  • переиспользование токена до истечения TTL
  • централизованный token broker сервис
  • batch-выдача токенов для нескольких клиентов

Роль временных токенов в масштабируемых системах

В крупных приложениях временные токены становятся частью общей архитектуры безопасности:

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

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