Глубокий анализ решений APISIX для кросс-оригинальных запросов
January 27, 2024
В разработке веб-приложений проблемы кросс-доменных запросов стали популярной темой. Однако с широким распространением API-шлюзов у нас появилось более удобное и эффективное решение для решения проблем кросс-доменных запросов. API-шлюз, как ключевой компонент в архитектуре приложений, не только предоставляет такие функции, как маршрутизация запросов и управление API, но и эффективно обрабатывает кросс-доменные запросы, помогая разработчикам обойти ограничения политики одного источника в браузере. В этой статье мы подробно рассмотрим, как использовать API-шлюз APISIX для решения проблем кросс-доменных запросов.
Что такое кросс-доменные запросы?
Проблемы кросс-доменных запросов в основном возникают из-за политики одного источника, применяемой браузерами. Политика одного источника требует, чтобы источник запроса (протокол, домен, порт) должен быть точно таким же, как и у целевого ресурса; в противном случае браузер заблокирует запрос. Эта политика направлена на защиту безопасности пользовательской информации и предотвращение кражи данных злоумышленниками. Однако в практической разработке такие сценарии, как разделение фронтенда и бэкенда или развертывание на разных доменах или портах, часто приводят к проблемам кросс-доменных запросов.
Решение проблем кросс-доменных запросов с использованием APISIX
CORS (Cross-Origin Resource Sharing)
CORS (Cross-Origin Resource Sharing) — это стандарт W3C, который позволяет браузерам отправлять запросы на кросс-доменные серверы, преодолевая ограничения, накладываемые политикой одного источника. В APISIX разработчики могут легко настроить правила CORS с помощью плагина CORS, указав, какие источники могут получать доступ к ресурсам.
Пример команды с использованием curl для настройки CORS в APISIX:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "plugins": { "cors": {} }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:8080": 1 } } }'
Эта команда использует curl для отправки PUT-запроса к Admin API APISIX, создавая маршрут с идентификатором 1. Маршрут настроен с путем URI /hello, и по умолчанию включен плагин CORS. Кроме того, указан сервер-адресат 127.0.0.1:8080.
Выполнение тестового запроса даст результаты по умолчанию:
curl http://127.0.0.1:9080/hello -v ... < Server: APISIX web server < Access-Control-Allow-Origin: * < Access-Control-Allow-Methods: * < Access-Control-Allow-Headers: * < Access-Control-Expose-Headers: * < Access-Control-Max-Age: 5 ...
Если необходимо внести изменения в политику CORS, достаточно изменить соответствующие настройки плагина. Вот несколько часто используемых параметров конфигурации:
-
allow_origins: Указывает источники, которым разрешен кросс-доменный доступ. Это может быть конкретный URL или использование символа '*' для разрешения всех источников. Несколько значений разделяются запятыми. -
allow_methods: Определяет HTTP-методы, разрешенные для кросс-доменного доступа, такие как GET, POST и т.д. Несколько значений разделяются запятыми. -
allow_headers: Разрешает использование пользовательских заголовков в кросс-доменных запросах. Несколько значений разделяются запятыми. -
expose_headers: Указывает пользовательские заголовки, которые будут доступны в кросс-доменных ответах. Несколько значений разделяются запятыми. -
max_age: Устанавливает максимальное время кэширования CORS-ответов браузером. -
allow_credentials: Определяет, разрешено ли передавать учетные данные (например, Cookies) в кросс-доменных запросах.

Важные моменты
Особое внимание следует уделить тому, что, хотя CORS прост в использовании, его включение может привести к проблемам безопасности. Это связано с тем, что CORS ослабляет ограничения, накладываемые политикой одного источника, позволяя запросам из разных источников получать доступ к ресурсам.
В этом контексте важно обратить внимание на allow_credentials. allow_credentials — это важный параметр конфигурации в CORS, который определяет, разрешено ли передавать учетные данные в кросс-доменных запросах. Это включает, но не ограничивается, такие данные, как cookies, HTTP-аутентификация или клиентские SSL-сертификаты.
По умолчанию allow_credentials отключен, что означает, что передача учетных данных не разрешена. Однако если CORS включен и разрешена передача учетных данных (allow_credentials: true), необходимо проявлять особую осторожность. Это означает, что запросы из других источников также могут получить доступ к защищенным ресурсам, что может привести к выполнению чувствительных операций. Например, злоумышленник может использовать эту уязвимость, чтобы заставить пользователя инициировать кросс-доменный запрос, что приведет к краже его сессионных cookies или несанкционированным действиям.
Чтобы минимизировать потенциальные проблемы безопасности при включении кросс-доменных запросов, рекомендуется придерживаться следующих лучших практик:
- Тщательно настройте
allow_origin: Избегайте установкиallow_originна*(разрешить все источники) без разбора. Вместо этого явно укажите разрешенные источники. - Ограничьте
allow_credentials: Включайтеallow_credentialsтолько при необходимости и ограничивайте его доверенными источниками. - Используйте безопасный транспортный протокол: Убедитесь, что CORS-запросы передаются через HTTPS, чтобы предотвратить атаки "человек посередине".
- Проверка и авторизация: На сервере бэкенда реализуйте правильную проверку и авторизацию для кросс-доменных запросов, чтобы убедиться, что только авторизованные пользователи могут получить доступ к чувствительным ресурсам.
- Избегайте использования небезопасных HTTP-методов: Ограничьте HTTP-методы, используемые в кросс-доменных запросах, разрешая только безопасные методы, такие как GET и POST, и отключая потенциально опасные методы, такие как PUT и DELETE, которые могут представлять угрозу безопасности.
Обратный прокси
Помимо использования CORS, APISIX может косвенно решать проблемы кросс-доменных запросов, настраивая себя в качестве обратного прокси. Обратный прокси — это распространенный шаблон архитектуры сервера, при котором обратный прокси-сервер выступает в роли посредника между клиентом и целевым сервером. Когда клиент инициирует запрос, эти запросы сначала отправляются на обратный прокси-сервер, который затем перенаправляет их на фактический целевой сервер. После завершения обработки ответ от целевого сервера возвращается обратному прокси и, в конечном итоге, передается клиенту.

Важно понимать, что обратный прокси сам по себе не решает напрямую проблемы кросс-доменных запросов, но позволяет обойти ограничения политики одного источника в браузере. Когда клиенту необходимо выполнить кросс-доменный запрос, он фактически отправляет запрос на обратный прокси-сервер, а не напрямую на целевой сервер. Поскольку обратный прокси-сервер и целевой сервер обычно находятся в одной сетевой среде или конфигурации, их общение не подвержено ограничениям политики одного источника. Это позволяет обратному прокси-серверу свободно перенаправлять запросы клиента на целевой сервер и возвращать ответы клиенту, косвенно достигая цели кросс-доменного доступа.
Поскольку APISIX выступает в роли API-шлюза, он изначально предназначен для развертывания между клиентом и сервером. Поэтому в небольших приложениях можно развернуть клиентское приложение и APISIX в одном домене и изменить адрес запроса клиента на адрес службы APISIX, чтобы обеспечить беспрепятственный доступ клиента к APISIX. Это позволяет использовать функциональность обратного прокси для предоставления кросс-доменного доступа клиенту. Кроме того, можно комбинировать другие плагины, чтобы обеспечить безопасность и надежность всего процесса обмена данными.
Заключение
В этой статье мы рассмотрели, как использовать APISIX для решения проблем кросс-доменных запросов, уделив особое внимание двум методам: CORS и обратный прокси. Правильно настроив плагин CORS, мы можем ослабить ограничения политики одного источника, накладываемые браузерами, позволяя кросс-доменным запросам получать доступ к ресурсам. С другой стороны, обратный прокси выступает в роли посредника, обходя политику одного источника браузеров и обеспечивая кросс-доменный доступ. Каждый метод имеет свои преимущества, и выбор подходящего решения зависит от конкретных требований. Независимо от того, используется ли CORS или обратный прокси, APISIX предлагает гибкие и мощные функции, помогая разработчикам легко решать проблемы кросс-доменных запросов и обеспечивать нормальную работу и удобство использования приложений.