В каких случаях возникает CORS?
DOM и браузер
CORS возникает при кросс-доменном запросе из браузера — когда origin страницы (протокол + домен + порт) отличается от origin запрашиваемого ресурса.
Что такое разный origin
Origin = протокол + домен + порт. Если хоть что-то отличается — запрос кросс-доменный, и вступает в силу CORS:
Страница: https://app.com
Запрос к: https://api.app.com → другой поддомен → CORS
Запрос к: http://app.com → другой протокол → CORS
Запрос к: https://app.com:8080 → другой порт → CORS
Запрос к: https://app.com/api → тот же origin → CORS нетКогда CORS применяется
fetch/XMLHttpRequestк другому origin.- Загрузка шрифтов, некоторых изображений (canvas), WebGL-текстур с другого origin.
Когда НЕ применяется
- Запросы к тому же origin.
- Обычные
<img>,<script>,<link>(они грузятся, но JS не может читать их содержимое кросс-доменно). - Запросы не из браузера (curl, сервер-сервер) — CORS там нет.
Простые и сложные запросы
- Простые (GET/POST с простыми заголовками) — идут сразу, браузер проверяет ответ.
- Сложные (другие методы, кастомные заголовки, JSON) — сначала preflight
OPTIONS.
Коротко для собеседования
CORS возникает при браузерном запросе к другому origin (отличается протокол, домен или порт). Тот же origin — CORS нет; запросы вне браузера — тоже. Сложные запросы предваряет preflight OPTIONS. Сервер разрешает доступ заголовками Access-Control-Allow-*.