Тест CORS

CORS-чекер

Проверьте, принимает ли API запросы с вашего origin. Делает preflight OPTIONS и реальный запрос, показывает все Access-Control-*-заголовки.

Что такое CORS?

CORS (Cross-Origin Resource Sharing) — механизм безопасности браузера. По умолчанию скрипт на https://a.com не может прочитать ответы с https://b.com. Сервер на b.com должен разрешить это, отправив заголовки Access-Control-Allow-Origin. Для не-простых запросов (POST с JSON, кастомные заголовки и т.д.) браузер сначала шлёт OPTIONS "preflight" для проверки прав — если ответ не разрешает ваш origin, метод или заголовки, реальный запрос блокируется и вы видите CORS-ошибку в DevTools.

CORS response-заголовки подробно

Access-Control-Allow-Origin

Указывает, какой origin разрешён. Конкретный origin, "*" (любой) или эхо origin запроса.

Access-Control-Allow-Credentials

Если "true", браузер шлёт cookies/auth. Несовместимо с Allow-Origin: *.

Access-Control-Allow-Methods

Какие HTTP-методы разрешает сервер. Актуально только в preflight-ответе.

Access-Control-Allow-Headers

Какие request-заголовки разрешает сервер. Актуально для нестандартных — Authorization, кастомные X-*.

Access-Control-Expose-Headers

Какие response-заголовки браузер отдаёт JavaScript. По умолчанию короткий safelist.

Access-Control-Max-Age

Сколько секунд браузер может кешировать preflight-результат. Большие значения снижают число OPTIONS-запросов.

FAQ CORS-чекера

Почему браузер показывает CORS-ошибки, а этот инструмент — заголовки?

CORS обеспечивает браузер, не сервер. Этот инструмент работает на нашем бэкенде, поэтому CORS-правила не применяются — мы видим сырой ответ. Браузер блокирует запрос на клиенте по заголовкам Access-Control-*. Если показанные здесь заголовки не совпадают с вашим origin/методом/заголовками — браузер заблокирует, даже если сервер ответил.

Что такое preflight OPTIONS-запрос?

Для "не простых" cross-origin-запросов (всё, что сложнее простого GET/HEAD/POST с базовыми заголовками) браузер сначала шлёт OPTIONS с вопросом «можно ли этот запрос?». Сервер отвечает Access-Control-Allow-Methods, Allow-Headers и Allow-Origin. Если разрешают реальный запрос — браузер идёт дальше. Иначе блокирует.

Почему Access-Control-Allow-Origin: * недостаточно для моего запроса?

Если запрос содержит credentials (cookies, Authorization-заголовок, TLS-клиентский сертификат), браузер отклоняет "*" и требует конкретный origin. Сервер должен вернуть ваш точный origin в Access-Control-Allow-Origin и установить Access-Control-Allow-Credentials: true.

Действует ли CORS для server-to-server-запросов?

Нет. CORS — фича безопасности только в браузере. curl, Node fetch на сервере, Postman или любой не-браузерный клиент CORS не учитывают. Если видите «ошибку CORS» вне браузера — реальная причина в другом (сеть, auth, неверный URL).

Как исправить CORS-ошибку?

Чинить на сервере, не на клиенте. Выставьте правильный Access-Control-Allow-Origin (origin фронта), Allow-Methods (используемые GET/POST и т.д.) и Allow-Headers (кастомные/auth). Для credentials добавьте Allow-Credentials: true. Обрабатывайте OPTIONS и возвращайте 2xx. Браузерные расширения, отключающие CORS — дев-костыль, реальное приложение не должно на них полагаться.