Практики разработки ПО → Сетевые технологии → CORS
Основная идея
CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который позволяет веб-страницам запрашивать ресурсы с других доменов. Без CORS браузер блокирует такие запросы из-за политики одинакового источника (Same-Origin Policy).
Ключевые аспекты
Same-Origin Policy — базовая защита браузера, запрещающая запросы к другим доменам
CORS — способ «разрешить» кросс-доменные запросы через HTTP-заголовки
Preflight-запрос — предварительный OPTIONS-запрос для проверки разрешений
Заголовки — Access-Control-Allow-Origin и другие управляют доступом
Плюсы CORS
Защита пользователей от вредоносных сайтов
Контролируемый доступ к API с других доменов
Гибкая настройка разрешений на сервере
Стандартизированный механизм для всех браузеров
Минусы
Дополнительная настройка на сервере
Preflight-запросы увеличивают задержку
Сложность отладки ошибок CORS
Частые ошибки на собеседованиях
Путают CORS и Same-Origin Policy (CORS — это способ обойти SOP)
Думают, что CORS защищает сервер (он защищает пользователя браузера)
Не знают про preflight-запросы для «непростых» запросов
Пытаются решить проблему CORS на клиенте (решается только на сервере)
Введение и проблематика
Представьте: ваш фронтенд на https://myapp.com пытается получить данные с API https://api.example.com. Браузер блокирует запрос с ошибкой CORS. Почему это происходит и зачем нужна такая защита?
CORS — это не «проблема», а механизм безопасности. Он защищает пользователей от вредоносных сайтов, которые могут украсть данные.
Какую проблему решает CORS?
CORS позволяет серверам контролировать, какие сайты могут обращаться к их ресурсам. Это баланс между:
Безопасностью — защита от несанкционированного доступа
Функциональностью — возможность легитимных кросс-доменных запросов
Базовая теория
Same-Origin Policy (SOP)
Same-Origin Policy — это фундаментальная политика безопасности браузера, которая запрещает скриптам на одной странице получать данные с другого «источника» (origin).
sequenceDiagramparticipant User asПользовательparticipant Evil asevil.comparticipant Bank asbank.com User->>Evil:Заходит на evil.com Evil->>Bank:fetch('/api/balance')<br/>с cookies пользователя Bank-->>Evil:Баланс: $10,000 Evil->>Evil:Крадёт данные
🚫
Если бы не SOP, любой сайт мог бы выполнять запросы к вашему банку, соцсетям, почте — используя ваши cookies!
Что такое CORS?
CORS (Cross-Origin Resource Sharing) — это механизм, позволяющий серверам указывать, каким источникам разрешён доступ к их ресурсам.
Access to fetch at 'https://api.example.com/data' from origin'https://frontend.com' has been blocked by CORS policy:No 'Access-Control-Allow-Origin' header is present.
Решение на сервере (Node.js/Express)
js
constexpress=require('express');constapp=express();// Разрешить всем (НЕ для продакшена!)app.use((req, res, next) => {res.header('Access-Control-Allow-Origin','*');next();});
Основные CORS-заголовки
Заголовок
Описание
Пример
Access-Control-Allow-Origin
Разрешённый origin
https://myapp.com или *
Access-Control-Allow-Methods
Разрешённые методы
GET, POST, PUT
Access-Control-Allow-Headers
Разрешённые заголовки
Content-Type, Authorization
Access-Control-Allow-Credentials
Разрешить cookies
true
Access-Control-Max-Age
Кэш preflight (секунды)
86400
⚠️
Нельзя использовать Access-Control-Allow-Origin: * вместе с credentials: true. Нужно указать конкретный origin.
Пограничные кейсы
Cookies и credentials
Для отправки cookies в кросс-доменных запросах нужно: