Referrer restrictions

Природа referrer-based ограничений доступа

В Mapbox GL JS контроль доступа к картам и тайлам часто строится вокруг access token, который может быть ограничен по доменам через механизм referrer restrictions. В браузерной среде каждый запрос к API Mapbox сопровождается заголовком Referer, который содержит адрес страницы, инициировавшей запрос. Именно этот заголовок используется серверной стороной Mapbox для проверки, разрешён ли данный источник.

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


HTTP Referer и его роль в экосистеме браузера

Заголовок Referer формируется браузером автоматически при выполнении сетевых запросов. В контексте Mapbox GL JS он включается в:

  • запросы к стилям (/styles/v1/...)
  • загрузку векторных тайлов (/v4/...)
  • получение растровых тайлов
  • запросы к геокодеру и другим API Mapbox

Значение Referer обычно содержит:

  • протокол (https://)
  • домен
  • путь страницы

Пример:

Referer: https://example.com/maps/index.html

Именно доменная часть используется для сопоставления с правилами ограничения доступа.


Механизм проверки referrer restrictions

При включённых ограничениях на access token сервер Mapbox выполняет последовательную проверку:

  1. Извлекается Referer из HTTP-запроса
  2. Определяется origin (схема + домен + порт)
  3. Сравнивается с разрешённым списком доменов, заданным для токена
  4. При совпадении запрос разрешается, иначе отклоняется с ошибкой авторизации

Если Referer отсутствует, запрос чаще всего считается небезопасным и блокируется.


Настройка ограничений в панели Mapbox

Access token в Mapbox может быть ограничен списком разрешённых источников. В конфигурации обычно задаются:

  • домены (например, example.com)
  • поддомены (*.example.com)
  • локальные окружения (localhost)
  • тестовые адреса (127.0.0.1)

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

  • https://example.com → разрешено
  • https://app.example.com → разрешено при wildcard
  • https://evil-site.com → отклонено

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


Поведение Mapbox GL JS при нарушении referrer policy

Если запрос выполняется с неподходящего origin, библиотека Mapbox GL JS возвращает ошибки на уровне загрузки ресурсов:

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

Типичные сообщения:

  • 401 Unauthorized
  • Not Authorized - Invalid Token
  • This request requires a token with URL restrictions

В результате карта может отображаться пустой или частично загруженной.


Связь referrer restrictions и access token

Access token в Mapbox является ключевым идентификатором проекта. Referrer restrictions не заменяют его, а дополняют.

Комбинация работает следующим образом:

  • token определяет «что можно делать»
  • referrer restrictions определяют «откуда можно делать»

Даже при валидном токене запрос будет отклонён, если домен не входит в список разрешённых.


Особенности работы в локальной среде разработки

Локальная разработка требует отдельной настройки, поскольку Referer в этом случае отличается от продакшн-домена.

Часто используются:

  • http://localhost:3000
  • http://127.0.0.1:5500
  • http://localhost:* (частичная поддержка через wildcard)

Некоторые ограничения:

  • разные порты считаются разными origin
  • localhost и 127.0.0.1 не эквивалентны
  • file:// протокол часто блокируется полностью

Отсутствие корректной настройки приводит к тому, что карта работает в одной среде и перестаёт работать в другой.


Referrer Policy и влияние настроек браузера

Современные браузеры позволяют контролировать поведение заголовка Referer через HTTP заголовок Referrer-Policy.

Примеры значений:

  • no-referrer — полностью отключает отправку
  • origin — отправляет только домен без пути
  • strict-origin-when-cross-origin — ограничивает данные при переходах между доменами

Для Mapbox GL JS критично, чтобы хотя бы origin присутствовал. Полное отключение referrer приводит к отказу в авторизации запросов.


Content Security Policy и косвенное влияние

Хотя CSP напрямую не управляет referrer restrictions, он влияет на загрузку ресурсов Mapbox:

  • ограничения connect-src могут блокировать API-запросы
  • img-src влияет на растровые тайлы
  • worker-src важен для WebGL worker-ов

При неправильной CSP конфигурации запросы могут блокироваться ещё до стадии проверки referrer.


Серверные сценарии и отсутствие Referer

При серверных запросах (например, SSR или backend-геокодинг) заголовок Referer обычно отсутствует.

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

  • IP-based ограничения (редко)
  • token-only проверка без referrer validation (в зависимости от API)
  • отдельные server-side токены

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


Wildcard-домены и их ограничения

Wildcard-правила позволяют расширять список допустимых источников:

  • *.example.com покрывает поддомены
  • не покрывает разные домены (example.org)
  • не покрывает протоколные различия (http vs https)

Также wildcard не применяется к путям:

  • разрешается весь домен
  • контроль на уровне URL пути отсутствует

Типичные ошибки конфигурации

Частые проблемы при работе с referrer restrictions:

  • использование localhost без порта
  • забытый https вместо http
  • отсутствие 127.0.0.1 в списке разрешённых
  • попытка использовать токен на нескольких доменах без wildcard
  • включённый no-referrer в браузере или meta-тегах
  • блокировка запросов корпоративным прокси

Отладка ограничений referrer

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

  • заголовок Referer в DevTools → Network
  • ответ сервера Mapbox (401/403)
  • список разрешённых доменов в настройках токена
  • фактический origin приложения

Ключевой шаг — сравнение ожидаемого и реального значения origin.


Безопасностный контекст referrer restrictions

Referrer-based ограничения используются как слой защиты от:

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

Несмотря на то, что referrer можно подделать в не-браузерных средах, в контексте веб-клиента он остаётся эффективным механизмом контроля происхождения запросов.


Взаимодействие с CDN и прокси

При использовании CDN или reverse proxy возможны искажения referrer:

  • переопределение заголовков
  • удаление Referer
  • замена origin на внутренний домен

В таких случаях Mapbox видит не внешний сайт, а промежуточный сервер, что приводит к блокировке запросов при несоответствии whitelist.


Поведение при смешанном контенте

Если приложение работает по HTTPS, а запросы к Mapbox происходят через HTTP (или наоборот), referrer может:

  • урезаться браузером
  • полностью не отправляться
  • быть заменён на origin-only

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


Практическая модель проверки доступа

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

  1. Получение access token
  2. Определение origin запроса
  3. Сравнение с whitelist доменов токена
  4. Проверка дополнительных ограничений API
  5. Разрешение или блокировка запроса

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