Представьте, что вы зашли на сайт example.com, но он пытается загрузить данные с api.another-site.com. Браузер сразу насторожится: «А точно ли это безопасно?» 🚨
Так работают кросс-доменные запросы (Cross-Origin Requests) — когда фронтенд на одном домене обращается за данными к серверу на другом.
Но если просто отправить такой запрос, браузер его заблокирует. Почему?
Браузеры следуют CORS (Cross-Origin Resource Sharing) — механизму, который запрещает кросс-доменные запросы по умолчанию. Это защита от атак, например:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST
Некоторые разработчики забывают обрабатывать 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();
});
Разрешение Access-Control-Allow-Origin: * опасно — любой сайт сможет делать запросы к вашему API.
Решение:
Указывайте конкретные домены:
Access-Control-Allow-Origin: https://ваш-сайт.ru
Если запрос требует куки или авторизацию, нужно явно разрешить их передачу:
Access-Control-Allow-Credentials: true
И на фронтенде:
fetch('https://api.site.com', {
credentials: 'include'
});
Иногда API не поддерживает CORS, но доступ к нему нужен. Вот рабочие методы:
Создайте промежуточный сервер, который будет перенаправлять запросы.
Пример:
// Node.js-прокси
app.get('/api-proxy', async (req, res) => {
const response = await fetch('https://внешний-api.com/data');
res.json(await response.json());
});
Некоторые API поддерживают JSONP — запрос через <script>.
<script src="https://api.site.com/data?callback=handleData"></script>
<script>
function handleData(data) { console.log(data); }
</script>
Сервис-прокси, который добавляет нужные заголовки:
fetch('https://cors-anywhere.herokuapp.com/https://api.site.com')
Важно: Не используйте в продакшене!
Можно настроить проксирование на уровне веб-сервера:
location /api/ {
proxy_pass https://внешний-api.com/;
add_header 'Access-Control-Allow-Origin' 'https://ваш-сайт.ru';
}
Алексей Иванов (Senior Frontend Developer, Яндекс):
«90% проблем с CORS решаются правильной настройкой сервера. Если API не ваш — попробуйте договориться с владельцами или используйте прокси.»
Статистика:
* в продакшене.Если вы столкнулись с CORS — это не ошибка, а защита. Настраивайте доступ правильно, и кросс-доменные запросы станут безопасными и удобными! 🚀
Что почитать еще?
Статья актуальна на 2024 год.