Экосистема Mapbox построена вокруг токенов доступа, которые определяют возможность обращения к API, стилям и тайлам. В контексте Mapbox GL JS ключевым элементом является access token, передаваемый в клиентское приложение.
Токен выполняет три функции:
В Mapbox GL JS он задаётся глобально:
import mapboxgl fr om 'mapbox-gl';
mapboxgl.accessToken = 'pk.abc123...';
Важно различать типы токенов:
pk.) — используется в
браузереsk.) — используется
только на сервереПредназначен для клиентского окружения и неизбежно попадает в браузер. Его безопасность обеспечивается не сокрытием, а ограничениями:
Типичная ошибка — использование public token без ограничений, что приводит к злоупотреблению квотой.
Используется исключительно на серверной стороне:
Никогда не должен попадать в клиентский бандл. Даже при использовании SSR (Next.js, Nuxt) он должен оставаться в server runtime.
В панели Mapbox Studio задаются ограничения:
Позволяет ограничить использование токена конкретными доменами:
https://example.comhttp://localhost:3000Работает на уровне HTTP referer и origin.
Примеры scope:
styles:readtiles:readdatasets:readМинимально необходимый набор принципиально снижает риск злоупотреблений.
В современных сборщиках используются .env файлы:
VITE_MAPBOX_TOKEN=pk.abc123
mapboxgl.accessToken = import.meta.env.VITE_MAPBOX_TOKEN;
Важно учитывать различия:
import.meta.envprocess.envprocess.env.NEXT_PUBLIC_*Любая переменная, доступная в браузере, считается публичной.
Токен неизбежно попадает в JS-бандл. Поэтому:
Один из подходов — проксирование запросов через backend.
Схема:
Browser → Backend → Mapbox API
Преимущества:
Пример (Node.js):
app.get('/tiles/:z/:x/:y', async (req, res) => {
const url = `https://api.mapbox.com/.../${req.params.z}/${req.params.x}/${req.params.y}?access_token=${process.env.MAPBOX_SECRET}`;
const response = await fetch(url);
const buffer = await response.arrayBuffer();
res.setHeader('Content-Type', 'application/x-protobuf');
res.send(Buffer.from(buffer));
});
Для продвинутых сценариев используется генерация временных токенов:
Преимущества:
Регулярная ротация снижает последствия компрометации:
Практика:
Особенно важно при публичных репозиториях.
При сборке фронтенда часто возникает проблема случайного раскрытия токенов.
Рекомендации:
Content Security Policy влияет на загрузку ресурсов Mapbox:
Пример политики:
connect-src https://api.mapbox.com;
img-src https://*.tiles.mapbox.com;
Без корректной CSP:
Причины:
Причины:
Причины:
SPA архитектуры наиболее уязвимы, так как весь код открыт:
Практические меры:
Часто используется разделение:
Пример конфигурации:
const tokenMap = {
development: 'pk.dev...',
staging: 'pk.staging...',
production: 'pk.prod...'
};
mapboxgl.accessToken = tokenMap[process.env.NODE_ENV];
Mapbox Dashboard предоставляет статистику:
Анализ этих данных позволяет выявлять:
Основные принципы:
export const mapToken = process.env.NEXT_PUBLIC_MAPBOX_TOKEN;
Важно: всё, что начинается с NEXT_PUBLIC_, становится
доступным клиенту.
mapboxgl.accessToken = import.meta.env.VITE_MAPBOX_TOKEN;
new DefinePlugin({
'process.env.MAPBOX_TOKEN': JSON.stringify(process.env.MAPBOX_TOKEN)
});
Эти ошибки приводят к прямым финансовым потерям из-за исчерпания квоты.
Кэширование снижает количество запросов к API и уменьшает риск злоупотребления: