Архитектура доступа к сервисам Mapbox GL JS строится вокруг access token, который передаётся в клиентский код и используется для загрузки стилей, тайлов и ресурсов. Это создаёт специфическую проблему: любой токен, попавший в браузер, считается потенциально раскрытым.
В production-среде ключевая задача заключается не в «скрытии токена как строки», а в ограничении его возможностей и контроле среды использования.
Используется в клиентских приложениях:
Особенность: такой токен не должен считаться секретом, поскольку он неизбежно попадает в браузер.
Используется на серверной стороне:
Ключевая характеристика: никогда не должен попадать в frontend-бандл
Типичный анти-паттерн:
mapboxgl.accessToken = "pk.eyJ1Ijo....";
или хранение в открытом репозитории:
export const MAPBOX_TOKEN = "pk.eyJ1Ijo....";
Такая практика приводит к:
Основной механизм защиты — token restrictions в панели Mapbox.
Токен привязывается к:
app.example.com)Пример логики:
https://example.com/*https://staging.example.com/*Токен может быть ограничен:
Это минимизирует ущерб при компрометации.
В современных сборщиках токены подставляются на этапе сборки.
mapboxgl.accessToken = import.meta.env.VITE_MAPBOX_TOKEN;
new webpack.DefinePlugin({
"process.env.MAPBOX_TOKEN": JSON.stringify(process.env.MAPBOX_TOKEN)
});
mapboxgl.accessToken = process.env.NEXT_PUBLIC_MAPBOX_TOKEN;
Ключевой момент:
NEXT_PUBLIC_ /
VITE_ становятся публичнымиОдин из наиболее надёжных подходов — проксификация запросов к Mapbox API.
Browser → Backend → Mapbox API
app.get("/tiles/:z/:x/:y", async (req, res) => {
const { z, x, y } = req.params;
const url = `https://api.mapbox.com/v4/mapbox.satellite/${z}/${x}/${y}.png?access_token=${process.env.MAPBOX_SECRET}`;
const response = await fetch(url);
const buffer = await response.arrayBuffer();
res.set("Content-Type", "image/png");
res.send(Buffer.from(buffer));
});
Дополнительный уровень безопасности — short-lived tokens.
Механизм:
Преимущества:
Даже публичный токен можно защитить от злоупотребления:
RefererЭто настраивается в панели управления токенами.
MAPBOX_TOKEN=pk.eyJ1...
и исключение из git:
.env
.env.production
Важно, чтобы:
.env никогда не попадал в репозиторий.env.example без значенийДаже при использовании env-переменных токен остаётся доступным в браузере.
Пример:
Следовательно:
скрыть токен полностью невозможно — можно только ограничить его влияние
Каждый с разными ограничениями.
Регулярная смена ключей:
Отслеживание:
Токен должен иметь только:
Пример безопасной и типовой инициализации:
import mapboxgl from "mapbox-gl";
mapboxgl.accessToken = process.env.MAPBOX_TOKEN;
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v12",
center: [30.3351, 50.4501],
zoom: 10
});
Ключевая идея:
Работа с Mapbox GL JS в production всегда строится вокруг трёх уровней:
Любая попытка «полностью скрыть токен» противоречит модели работы браузерных картографических SDK и заменяется системами контроля доступа и мониторинга.