Что такое CORS?

👨‍💻 Frontend Developer 🟡 Часто попадается 🎚️ Средний
#Браузер

Краткий ответ

CORS (Cross-Origin Resource Sharing) — это политика безопасности браузера, которая запрещает веб-страницам делать запросы к другим доменам без разрешения. Защищает пользователей от кражи данных. 🛡️

// ❌ Ошибка CORS:
// Сайт example.com пытается запросить данные с api.other.com
fetch('https://api.other.com/data')
  .then(response => response.json())
  .catch(error => console.log('CORS ошибка!')); // Блокировано браузером
 
// ✅ Решение — сервер должен разрешить запрос

Полный ответ

CORS — как охранник на входе в здание, который проверяет, можно ли тебе входить и брать оттуда вещи. Без разрешения — нельзя! security guard 🚫

Что такое “один источник” (same-origin)

Браузер считает запросы “одного источника”, если совпадают:

  • Протокол (http/https)
  • Домен (example.com)
  • Порт (80/443)
// ✅ Один источник (same-origin):
// https://example.com/page1
// https://example.com/page2
 
// ❌ Разные источники (cross-origin):
// https://example.com ❌ https://api.com
// http://example.com ❌ https://example.com  
// https://example.com ❌ https://example.com:8080

Когда CORS блокирует

Простой запрос

// ❌ Блокируется, если сервер не разрешает:
fetch('https://api.other.com/users')
  .then(response => response.json())
  .catch(error => {
    console.log('CORS блокирует запрос!'); // Ошибка в консоли
  });

Почему блокирует

// ❌ Проблема — защита пользователя:
// Вредоносный сайт evil.com не должен 
// красть данные с bank.com!
 
// CORS требует явного разрешения от сервера

Как работает CORS

Preflight запрос

// Для сложных запросов браузер сначала отправляет OPTIONS:
 
// 1. Браузер: OPTIONS /api/data (preflight запрос)
// 2. Сервер: "Разрешаю!" (Access-Control-Allow-Origin: *)
// 3. Браузер: GET /api/data (настоящий запрос)
// 4. Сервер: Отправляет данные

Заголовки CORS

// Сервер должен отправить заголовки:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization

Решение проблем с CORS

На стороне сервера

// ✅ Сервер разрешает:
// Access-Control-Allow-Origin: * (все домены)
// Или конкретно:
// Access-Control-Allow-Origin: https://example.com

Во время разработки

// ✅ Для разработки:
// 1. Использовать proxy сервер
// 2. Отключить CORS в браузере (только для тестов!)
// 3. Использовать расширения браузера

Частые ошибки

Путать с ошибками сети

// ❌ Ошибка — думать, что сервер вернул ошибку:
fetch('https://api.other.com/data')
  .catch(error => {
    // Это CORS блокирует, не сервер!
  });
 
// ✅ Правильно — смотреть в Network tab в DevTools

Игнорировать безопасность

// ❌ Плохо — разрешать всем:
// Access-Control-Allow-Origin: * 
// Для чувствительных данных!
 
// ✅ Лучше — ограничить конкретными доменами

Простые правила

  1. Один источник — протокол, домен, порт должны совпадать ✅
  2. CORS блокирует — запросы к другим доменам без разрешения 🚫
  3. Preflight — сложные запросы сначала проверяются 🎯
  4. Заголовки — сервер должен отправить CORS заголовки 📬
  5. Безопасность — защищает от кражи данных пользователя 🔐

Понимание CORS помогает решать проблемы с запросами к API и создавать безопасные веб-приложения! 💪


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪