Тестер системы CORS

Далее

Ошибки типа CORS характеризуются классическим красным сигналом в консоли браузера: при запросе на API из другого источника браузер блокирует ответ. Этот тестер отправляет предварительный запрос OPTIONS по любому введённому URL, с выбранным вами источником и методом, затем декодирует заголовки Access-Control*, чтобы точно определить, что сервер разрешает, что он блокирует и почему браузер выдаёт ошибку.

Как проверить поддержку CORS

  1. 1

    Введите целевой URL-адрес

    Эндпойнт API, который необходимо вызвать из фронт-энда. Укажите строку запроса и протокол.

  2. 2

    Установите метод и исходную точку

    GET/POST/PUT/DELETE/PATCH. Оригинальный адрес может быть URL вашего сайта или любым иным адресом, который вы хотите имитировать.

  3. 3

    Поймите preflight

    Тестер всегда отправляет запрос OPTIONS с выбранными вами источником и методом, а также заголовком Access-Control-Request-Headers: Content-Type, ровно тот preflight, который браузер отправляет перед JSON-запросом.

  4. 4

    Проведите тест

    Тестер отправляет preflight и передаёт HTTP-статус, а также заголовки ответа CORS: Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials и Max-Age.

  5. 5

    Устраните неправильную конфигурацию

    В отчёте указываются недостающие или неверные данные: отсутствие поля Allow-Origin, наличие запрещённого заголовка или использование недопустимого метода.

Важные заголовки

Заголовок Назначение
Access-Control-Allow-Origin Какие источники могут читать ответ
Access-Control-Allow-Methods Preflight: какие методы разрешены
Access-Control-Allow-Headers Preflight: какие заголовки запроса разрешены
Access-Control-Allow-Credentials Разрешены ли cookie/аутентификация
Access-Control-Expose-Headers Какие заголовки ответа может читать JS
Access-Control-Max-Age Сколько кэшируется результат preflight

Простые запросы и запросы с preflight

Запрос считается «простым» (без preflight) только если выполнены все условия:

  • Метод, GET, HEAD или POST.
  • Заголовки ограничены Accept, Accept-Language, Content-Language, Content-Type (с определёнными значениями).
  • Content-Type, если он есть, это application/x-www-form-urlencoded, multipart/form-data или text/plain.

Всё остальное, тело JSON, заголовок Authorization, пользовательский заголовок X-Foo, метод PUT/DELETE/PATCH, вызывает preflight OPTIONS. Сервер должен ответить на preflight правильными заголовками Allow-*, иначе реальный запрос так и не будет отправлен.

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

  • «No Access-Control-Allow-Origin header» → сервер не задаёт этот заголовок. Исправляйте на стороне сервера, а не клиента.
  • *«Credentials mode requires Allow-Origin not to be » → если вы отправляете cookie, Allow-Origin должен быть конкретным источником (или возвращать заголовок Origin).
  • «Request header X not allowed» → добавьте X в Access-Control-Allow-Headers в ответе на preflight.
  • «Method not allowed» → добавьте метод в Access-Control-Allow-Methods.
  • «Redirect not allowed in preflight» → preflight не может следовать за перенаправлениями. Конечная точка OPTIONS должна отвечать напрямую.

Allow-Origin: * против возврата Origin

Access-Control-Allow-Origin: * удобен, но его нельзя сочетать с учётными данными. В продакшене возвращайте Origin из запроса (после проверки по списку разрешённых) и задавайте Allow-Credentials: true, если нужны cookie.

Прокси как обходной путь

Если вы не управляете сервером, тонкий прокси на вашем собственном домене полностью убирает CORS, браузер видит запрос как same-origin. Многие хостинговые платформы (Vercel, Netlify, Cloudflare) предлагают правила переписывания (rewrite) как раз для этого.

Часто задаваемые вопросы

Чтобы предотвратить доступ вредоносной страницы к конфиденциальным данным на другом сайте с использованием cookie вашего браузера, отсутствие CORS может позволить сайту evil.com запросить внутренний API вашего банка от имени вас. CORS обязывает банк явно разрешать чтение данных из других источников (cross-origin).

Только при разработке. У Chromium есть флаг --disable-web-security, но он затрагивает все сайты и опасен. Правильное решение, заголовки на стороне сервера или прокси.

Postman не является браузером, он полностью игнорирует механизм CORS. Использование CORS обеспечивается исключительно браузерами при запросах на JavaScript. Сервер, работающий в Postman, не обладает автоматической поддержкой стандартов CORS.

Изображения и классические теги <script> загружаются из других источников без CORS, но JavaScript не может читать их содержимое. <img crossorigin> и fetch() уже соблюдают CORS, именно поэтому без него отрисованные на canvas изображения становятся «испорченными» (tainted).

Сопутствующие инструменты

Проверка API-эндпоинта

Проверьте в браузере HTTP- или HTTPS-эндпоинт с разрешённым CORS: итоговый статус, доступные заголовки, время и ограниченный предпросмотр тела.

Анализатор заголовков электронной почты

Конфиденциально анализируйте исходные заголовки писем в браузере: цепочку Received, время и метаданные SPF, DKIM, DMARC и ARC без загрузки сообщения.

Поиск IP-адреса

Проверьте публичный адрес IPv4 или IPv6, чтобы увидеть примерную страну, регион, город, координаты, ISP, ASN, организацию и часовой пояс.

Тест скорости

Быстрый и бесплатный тест скорости интернета прямо в браузере. Измерьте скорость загрузки в Мбит/с, а также задержку и джиттер и узнайте, готово ли соединение к стримингу 4K, играм и видеозвонкам. Без приложений и регистрации.

Поиск DNS

Проверяйте записи DNS A, AAAA, MX, TXT, NS, CNAME и SOA любого домена без терминала.

Обратный DNS-поиск

Проверьте PTR-запись для адреса IPv4 или IPv6. Полезно для отладки почтовых серверов, анализа журналов и проверки антиспам-фильтров.