Проверка CORS и Security Headers

Анализ CORS-политики (Access-Control-Allow-Origin), Preflight-запросов, а также всех заголовков безопасности: CSP, HSTS, X-Frame-Options и других.

Введите URL и нажмите «Проверить».

Настройка CORS

Что такое CORS?

CORS (Cross-Origin Resource Sharing) — механизм, который позволяет серверу разрешить загрузку ресурсов с других доменов. Браузер блокирует cross-origin запросы, если сервер не отправит правильный заголовок Access-Control-Allow-Origin.

Пример: ваш фронтенд на app.example.com делает fetch к API на api.example.com. Без CORS браузер заблокирует запрос.

Nginx
location /api/ {
    # Разрешить конкретный источник (без credentials можно *)
    add_header Access-Control-Allow-Origin "https://app.example.com" always;

    # Разрешённые методы
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;

    # Разрешённые заголовки
    add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With" always;

    # Заголовки, доступные JS-клиенту
    add_header Access-Control-Expose-Headers "Content-Length, X-Request-Id" always;

    # Передача кук и авторизации (нельзя вместе с Allow-Origin: *)
    add_header Access-Control-Allow-Credentials "true" always;

    # Кэширование preflight-ответа (в секундах)
    add_header Access-Control-Max-Age "86400" always;

    # Обработка preflight (OPTIONS)
    if ($request_method = OPTIONS) {
        return 204;
    }
}

Директива always — заголовок отправляется всегда, включая ответы с кодами 4xx/5xx.

Безопасность CORS
  • Не используйте Access-Control-Allow-Origin: * если передаются cookie или авторизация. * не работает с allowCredentials: true.
  • Явно перечисляйте разрешённые источники — не используйте динамическое отражение Origin без валидации (риск атак).
  • Ограничивайте методы — не разрешайте PUT/DELETE если API только читает данные.
  • Preflight кэширование — ставьте Access-Control-Max-Age чтобы браузер не слал OPTIONS перед каждым запросом.
  • Expose-Headers — без этого заголовка JS-клиент не увидит кастомные заголовки ответа.
  • Vary: Origin — при динамическом Allow-Origin добавляйте Vary: Origin для корректного кэширования.