Что такое CORS и как он работает?

«Что такое CORS и как он работает?» — вопрос из категории Сети, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CORS (Cross-Origin Resource Sharing, Совместное использование ресурсов между разными источниками) — это механизм, использующий дополнительные HTTP-заголовки, чтобы дать веб-приложению, работающему на одном домене (origin), право доступа к выбранным ресурсам с другого домена.

Браузеры из соображений безопасности блокируют межсайтовые HTTP-запросы, инициированные скриптами (политика Same-Origin). CORS — это стандарт, который позволяет серверу явно указать, какие внешние источники имеют право получать к нему доступ.

Как это работает на практике с Node.js/Express:

  1. Простой запрос (Simple Request): Для запросов GET/POST/HEAD с определёнными заголовками браузер сразу делает основной запрос, но проверяет заголовок Access-Control-Allow-Origin в ответе сервера.
  2. Предварительный запрос (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-запросов OPTIONS middleware cors автоматически добавляет соответствующие заголовки.

Видео-ответы