Ответ
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), и вопрошает: «А можно, а?». И если сервер в ответе не разрешит этот твой самопальный заголовок — всё, пизда, основной запрос даже улетать не будет. Ёперный театр, короче.
Вот так и живём: фронтенд хочет как лучше, а браузер ему — «да иди ты нахуй», пока сервер не даст добро. Волнение ебать, пока всё не настроишь.