CORS: что это и как настроить

CORS (Cross-Origin Resource Sharing) — механизм браузера для контроля запросов между разными доменами. Неправильная настройка CORS — угроза безопасности.

безопасностьcorsзаголовкиapiweb-security

Что такое CORS

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

По умолчанию браузеры блокируют кросс-доменные (cross-origin) запросы по соображениям безопасности — это называется Same-Origin Policy. CORS позволяет серверу явно разрешить запросы с определённых источников.

Пример кросс-доменного запроса: фронтенд на https://app.example.com делает запрос к API на https://api.example.com. Браузер заблокирует это без настройки CORS.

Зачем нужен CORS

Безопасность API: CORS ограничивает список доменов, которые могут делать запросы к вашему API.

Защита от CSRF: правильная настройка CORS помогает предотвратить атаки подделки запросов.

Мобильные приложения и SPA: Single Page Applications на отдельном домене требуют CORS.

Микросервисная архитектура: взаимодействие между сервисами через браузер требует CORS.

Как работает CORS

Простые запросы (Simple Requests)

GET, POST с Content-Type: application/x-www-form-urlencoded — браузер добавляет заголовок Origin и проверяет ответ.

Предварительный запрос (Preflight)

Для сложных запросов (PUT, DELETE, кастомные заголовки) браузер сначала отправляет OPTIONS запрос:

OPTIONS /api/users HTTP/1.1
Origin: https://app.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type, Authorization

Сервер должен ответить:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400

Основные CORS заголовки

Ответные заголовки сервера

Access-Control-Allow-Origin — разрешённые источники:

Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Origin: *

Access-Control-Allow-Methods — разрешённые HTTP-методы:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS

Access-Control-Allow-Headers — разрешённые заголовки запроса:

Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With

Access-Control-Allow-Credentials — разрешить передачу куки:

Access-Control-Allow-Credentials: true

Access-Control-Max-Age — кеширование preflight ответа (секунды):

Access-Control-Max-Age: 86400

Настройка CORS в Next.js

// next.config.js
async headers() {
  return [{
    source: '/api/:path*',
    headers: [{
      key: 'Access-Control-Allow-Origin',
      value: 'https://app.example.com'
    }]
  }]
}

Настройка CORS в Nginx

location /api/ {
    add_header 'Access-Control-Allow-Origin' 'https://app.example.com' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;

    if ($request_method = 'OPTIONS') {
        return 204;
    }
}

Проверка CORS на reChecker

Используйте Security Headers для проверки CORS конфигурации. Инструмент покажет:

  • Наличие и значение Access-Control-Allow-Origin
  • Потенциально опасный wildcard (*)
  • Другие заголовки безопасности
  • Рекомендации по улучшению

FAQ

Wildcard (*) в CORS — это опасно? Да для API с авторизацией. Wildcard разрешает запросы с любого домена. Если API использует cookies для аутентификации, wildcard + Allow-Credentials создаёт уязвимость CSRF. Всегда указывайте конкретные домены.

CORS ошибки в браузере — как отлаживать? Откройте DevTools → Network вкладку → найдите заблокированный запрос. В Console будет детальное сообщение об ошибке. Проверьте что сервер возвращает правильные заголовки Access-Control-Allow-*.

CORS на сервере или в коде? Лучше на уровне сервера (Nginx/Apache) для единообразия. Но допустимо и в коде приложения, особенно если CORS правила сложные или зависят от пути запроса.

Попробуйте инструмент

Проверьте cors на вашем сайте с помощью бесплатного инструмента.

Security Headers

Техническая поддержка

Нашли баг, сбой или ошибку в работе сервиса? Есть предложение по улучшению? Напишите нам — мы читаем каждое сообщение и стараемся быстро исправлять проблемы.