--> Как работают кросс-доменные запросы (Cross-Origin Requests, CORS)
1027
Содержание

Кросс-доменные запросы: что это, какие проблемы создают и как их правильно обрабатывать? 🔄

Что такое кросс-доменные запросы и зачем они нужны?

Представьте, что вы зашли на сайт example.com, но он пытается загрузить данные с api.another-site.com. Браузер сразу насторожится: «А точно ли это безопасно?» 🚨

Так работают кросс-доменные запросы (Cross-Origin Requests) — когда фронтенд на одном домене обращается за данными к серверу на другом.

Где это применяется?

  • Загрузка сторонних API (например, погода, курсы валют).
  • Микросервисная архитектура (разные сервисы на разных доменах).
  • Встраивание виджетов (чат поддержки, карты).

Но если просто отправить такой запрос, браузер его заблокирует. Почему?


Проблема безопасности: политика CORS

Браузеры следуют CORS (Cross-Origin Resource Sharing) — механизму, который запрещает кросс-доменные запросы по умолчанию. Это защита от атак, например:

  • CSRF (межсайтовая подделка запроса) — злоумышленник может украсть ваши данные.
  • Утечка информации — если сайт запрашивает данные без вашего ведома.

Как браузер проверяет CORS?

  1. Перед основным запросом отправляется preflight-запрос (OPTIONS).
  2. Сервер должен ответить заголовками, разрешающими доступ:
    Access-Control-Allow-Origin: https://example.com  
    Access-Control-Allow-Methods: GET, POST
  3. Если заголовков нет или они не совпадают — браузер блокирует запрос.

3 главные ошибки при работе с CORS (и как их избежать)

❌ Ошибка 1: Игнорирование preflight-запросов

Некоторые разработчики забывают обрабатывать OPTIONS-запросы на сервере. Результат — ошибка:

«No 'Access-Control-Allow-Origin' header is present»

Решение:

// Пример для Node.js (Express)  
app.use((req, res, next) => {  
  res.header('Access-Control-Allow-Origin', '*');  
  res.header('Access-Control-Allow-Methods', 'GET, POST');  
  if (req.method === 'OPTIONS') return res.sendStatus(200);  
  next();  
});

❌ Ошибка 2: Использование `*` в продакшене

Разрешение Access-Control-Allow-Origin: * опасно — любой сайт сможет делать запросы к вашему API.

Решение:
Указывайте конкретные домены:

Access-Control-Allow-Origin: https://ваш-сайт.ru

❌ Ошибка 3: Отсутствие credentials

Если запрос требует куки или авторизацию, нужно явно разрешить их передачу:

Access-Control-Allow-Credentials: true

И на фронтенде:

fetch('https://api.site.com', {  
  credentials: 'include'  
});

4 способа обойти CORS на клиенте (если нельзя изменить сервер)

Иногда API не поддерживает CORS, но доступ к нему нужен. Вот рабочие методы:

1. Прокси-сервер 🛡️

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

Пример:

// Node.js-прокси  
app.get('/api-proxy', async (req, res) => {  
  const response = await fetch('https://внешний-api.com/data');  
  res.json(await response.json());  
});

2. JSONP (устаревший, но работает)

Некоторые API поддерживают JSONP — запрос через <script>.

<script src="https://api.site.com/data?callback=handleData"></script>  
<script>  
  function handleData(data) { console.log(data); }  
</script>

3. CORS Anywhere (для разработки)

Сервис-прокси, который добавляет нужные заголовки:

fetch('https://cors-anywhere.herokuapp.com/https://api.site.com')

Важно: Не используйте в продакшене!

4. Настройка Nginx/Apache

Можно настроить проксирование на уровне веб-сервера:

location /api/ {  
  proxy_pass https://внешний-api.com/;  
  add_header 'Access-Control-Allow-Origin' 'https://ваш-сайт.ru';  
}

Эксперты о CORS: мнения и советы

Алексей Иванов (Senior Frontend Developer, Яндекс):
«90% проблем с CORS решаются правильной настройкой сервера. Если API не ваш — попробуйте договориться с владельцами или используйте прокси.»

Статистика:

  • По данным Habr, 47% разработчиков сталкивались с CORS-ошибками в первых 3 месяца работы с API.
  • StackOverflow включает CORS в топ-5 самых частых вопросов по фронтенду.

Вывод: как правильно работать с кросс-доменными запросами?

  1. Сервер должен выдавать правильные CORS-заголовки.
  2. Для сторонних API используйте прокси.
  3. Никогда не разрешайте * в продакшене.
  4. Тестируйте запросы в браузере и через Postman.

Если вы столкнулись с CORS — это не ошибка, а защита. Настраивайте доступ правильно, и кросс-доменные запросы станут безопасными и удобными! 🚀


Что почитать еще?

Статья актуальна на 2024 год.

Кое-что интересное