Тестер системы CORS
Ошибки типа CORS характеризуются классическим красным сигналом в консоли браузера: при запросе на API из другого источника браузер блокирует ответ. Этот тестер отправляет предварительный запрос OPTIONS по любому введённому URL, с выбранным вами источником и методом, затем декодирует заголовки Access-Control*, чтобы точно определить, что сервер разрешает, что он блокирует и почему браузер выдаёт ошибку.
Как проверить поддержку CORS
-
1
Введите целевой URL-адрес
Эндпойнт API, который необходимо вызвать из фронт-энда. Укажите строку запроса и протокол.
-
2
Установите метод и исходную точку
GET/POST/PUT/DELETE/PATCH. Оригинальный адрес может быть URL вашего сайта или любым иным адресом, который вы хотите имитировать.
-
3
Поймите preflight
Тестер всегда отправляет запрос OPTIONS с выбранными вами источником и методом, а также заголовком Access-Control-Request-Headers: Content-Type, ровно тот preflight, который браузер отправляет перед JSON-запросом.
-
4
Проведите тест
Тестер отправляет preflight и передаёт HTTP-статус, а также заголовки ответа CORS: Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials и Max-Age.
-
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. Полезно для отладки почтовых серверов, анализа журналов и проверки антиспам-фильтров.