Что такое CORS

Ответ

CORS (Cross-Origin Resource Sharing) — механизм безопасности браузеров, который разрешает или блокирует запросы между разными источниками (доменами, протоколами, портами). Без CORS браузер блокирует AJAX-запросы к другому домену из соображений безопасности.

Сервер должен явно разрешить кросс-доменные запросы, отправляя специальные заголовки:

  • Access-Control-Allow-Origin — указывает разрешенные домены (* для всех)
  • Access-Control-Allow-Methods — разрешенные HTTP-методы (GET, POST и т.д.)
  • Access-Control-Allow-Headers — разрешенные заголовки запроса

Пример простого CORS-запроса:

fetch('https://api.example.com/data', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
})

Для сложных запросов (например, с нестандартными заголовками) браузер сначала отправляет OPTIONS-запрос (preflight).

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня с CORS — это просто пиздец, какой-то театр абсурда, ей-богу. Представь: твой фронтенд на localhost:3000 пытается по-братски стукнуться к API на api.krutoi-servis.ru, а браузер такой: «Нихуя, дружок-пирожок, не пущу!». И всё, приехали. Безопасность, мать её.

Короче, это такой механизм, чтобы один домен не мог просто взять и выебать данные с другого домена без спросу. Логично, в принципе, а то пидары всякие налетели бы.

И чтобы это обойти, серверу надо крикнуть браузеру специальные заголовки, типа «Я, блядь, разрешаю!». Главные из них:

  • Access-Control-Allow-Origin — тут сервер орёт, с каких адресов можно приползать. Можно поставить звёздочку (*), это типа «пускай все, похуй», но это часто не айс.
  • Access-Control-Allow-Methods — а вот это уже про то, какие методы можно: GET, POST, или там DELETE, чтобы всё нахуй стереть.
  • Access-Control-Allow-Headers — ну и какие заголовки в запросе можно слать, кроме стандартных.

Вот смотри, простой запрос, вроде ничего такого:

fetch('https://api.example.com/data', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
})

Но если ты, сука, захочешь прицепить свой хедер, типа X-My-Secret-Token, то начинается цирк. Браузер, такой блядь предусмотрительный, сначала шлёт запрос OPTIONS (это называется preflight), и вопрошает: «А можно, а?». И если сервер в ответе не разрешит этот твой самопальный заголовок — всё, пизда, основной запрос даже улетать не будет. Ёперный театр, короче.

Вот так и живём: фронтенд хочет как лучше, а браузер ему — «да иди ты нахуй», пока сервер не даст добро. Волнение ебать, пока всё не настроишь.