Ответ
CORS (Cross-Origin Resource Sharing, Совместное использование ресурсов между разными источниками) — это механизм, использующий дополнительные HTTP-заголовки, чтобы дать веб-приложению, работающему на одном домене (origin), право доступа к выбранным ресурсам с другого домена.
Браузеры из соображений безопасности блокируют межсайтовые HTTP-запросы, инициированные скриптами (политика Same-Origin). CORS — это стандарт, который позволяет серверу явно указать, какие внешние источники имеют право получать к нему доступ.
Как это работает на практике с Node.js/Express:
- Простой запрос (Simple Request): Для запросов GET/POST/HEAD с определёнными заголовками браузер сразу делает основной запрос, но проверяет заголовок
Access-Control-Allow-Originв ответе сервера. - Предварительный запрос (Preflight Request): Для «непростых» запросов (например, с кастомными заголовками или методом PUT/DELETE) браузер сначала отправляет запрос
OPTIONS(preflight) на тот же URL, чтобы проверить разрешённые методы и заголовки.
Базовая настройка CORS в Express с помощью middleware cors:
const express = require('express');
const cors = require('cors');
const app = express();
// Разрешить запросы с любого origin (для публичных API)
app.use(cors());
// Или настроить более строго
const corsOptions = {
origin: 'https://my-trusted-frontend.com', // Разрешить только конкретный домен
optionsSuccessStatus: 200, // Для старых браузеров
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization']
};
app.use(cors(corsOptions));
app.get('/api/data', (req, res) => {
res.json({ message: 'Этот ответ виден только с https://my-trusted-frontend.com' });
});
Важные нюансы:
- Заголовок
Access-Control-Allow-Origin: *несовместим с использованием учётных данных (куки, HTTP-аутентификация). В этом случае необходимо указывать конкретный origin. - CORS — это защита в браузере. Сервер должен самостоятельно валидировать Origin для предотвращения CSRF-атак и прямых запросов извне браузера (например, через cURL или Postman).
- Для обработки preflight-запросов
OPTIONSmiddlewarecorsавтоматически добавляет соответствующие заголовки.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶