← Назад к вопросам

Зачем нужен CORS?

1.0 Junior🔥 191 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужен CORS?

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

Проблема Same-Origin Policy

Bраузеры по умолчанию запрещают JavaScript-коду из одного источника обращаться к ресурсам другого источника. Это защита от XSS-атак и кражи данных:

fetch('https://api.other-domain.com/data')
  .then(res => res.json())
  .catch(err => console.error('CORS Error'));

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

Preflight запрос:

Перед отправкой POST, PUT, DELETE браузер отправляет OPTIONS запрос:

// OPTIONS /api/data HTTP/1.1
// Origin: https://example.com
// Access-Control-Request-Method: POST

Ответ сервера:

// HTTP/1.1 200 OK
// Access-Control-Allow-Origin: https://example.com
// Access-Control-Allow-Methods: GET, POST, PUT, DELETE
// Access-Control-Allow-Headers: Content-Type, Authorization

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

  • Access-Control-Allow-Origin — какие источники могут получать доступ
  • Access-Control-Allow-Methods — разрешённые HTTP-методы
  • Access-Control-Allow-Headers — разрешённые заголовки запроса
  • Access-Control-Allow-Credentials — разрешить ли отправку cookies
  • Access-Control-Max-Age — кеширование preflight на N секунд

Примеры использования

1. Простой GET-запрос (без preflight):

fetch('https://api.example.com/users')
  .then(res => res.json())
  .then(data => console.log(data));

2. POST с JSON (требует preflight):

fetch('https://api.example.com/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'John' })
});

3. С аутентификацией (cookies):

fetch('https://api.example.com/me', {
  method: 'GET',
  credentials: 'include'
});

Конфигурация на серверах

Express.js:

const cors = require('cors');

app.use(cors({
  origin: 'https://example.com',
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  credentials: true,
  maxAge: 86400
}));

FastAPI (Python):

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
  CORSMiddleware,
  allow_origins=['https://example.com'],
  allow_methods=['*'],
  allow_headers=['*'],
  allow_credentials=True,
  max_age=86400
)

Типичные CORS ошибки

Ошибка: Access to XMLHttpRequest has been blocked by CORS policy: No Access-Control-Allow-Origin header

Это означает, что сервер не добавил необходимый заголовок.

Best Practices

  • Не используй wildcard (*) для публичных API — всегда указывай конкретные домены
  • Используй credentials осторожно — требует конкретного Access-Control-Allow-Origin
  • Кешируй preflight через Access-Control-Max-Age для производительности
  • Минимизируй разрешённые методы и заголовки
  • На production убедись, что CORS настроен правильно

CORS — это не блокировка, а явное разрешение сервера на доступ к его ресурсам с других источников.