Для «непростых» запросов (POST с JSON, кастомные заголовки) браузер сначала отправляет preflight-запрос методом OPTIONS. Сервер возвращает заголовки, разрешающие или запрещающие запрос. Если разрешено — браузер отправляет основной запрос.
Access-Control-Allow-Origin — домен(ы), которым разрешён доступ (* или конкретный домен)Access-Control-Allow-Methods — разрешённые HTTP-методыAccess-Control-Allow-Headers — разрешённые заголовки запросаAccess-Control-Allow-Credentials — можно ли отправлять cookie с запросомCORS-заголовки устанавливает сервер — через middleware, конфигурацию Nginx/Apache или непосредственно в коде. Ошибка «blocked by CORS policy» всегда решается на стороне сервера, а не клиента.