CORS (Cross-Origin Resource Sharing — совместное использование ресурсов между разными источниками) — это механизм безопасности браузеров, который позволяет или запрещает веб-приложениям выполнять запросы к ресурсам с домена, отличного от домена самого приложения.
Same-Origin Policy (Политика одинакового источника):
CORS Headers (Заголовки CORS):
Access-Control-Allow-Origin
: разрешенные домены (*
для всех)Access-Control-Allow-Methods
: разрешенные HTTP-методыAccess-Control-Allow-Headers
: разрешенные заголовки запросаAccess-Control-Allow-Credentials
: разрешение передавать кукиAccess-Control-Max-Age
: кэширование настроек CORSOrigin
: текущий источник запросаAccess-Control-Request-Method
: метод для предварительного запросаAccess-Control-Request-Headers
: заголовки для предварительного запросаconst express = require('express');
const cors = require('cors');
const app = express();
// Простая настройка (разрешить все домены)
app.use(cors());
// Кастомная настройка
app.use(cors({
origin: 'https://your-frontend.com',
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true
}));
// Для конкретного маршрута
app.get('/api/data', cors(), (req, res) => {
res.json({ data: 'Some data' });
});
# settings.py
CORS_ALLOWED_ORIGINS = [
"https://your-frontend.com",
"http://localhost:3000",
]
# Или разрешить все:
CORS_ALLOW_ALL_ORIGINS = True
location /api/ {
add_header 'Access-Control-Allow-Origin' 'https://your-frontend.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
add_header 'Access-Control-Allow-Credentials' 'true';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
}
Для "непростых" запросов браузер сначала отправляет OPTIONS-запрос для проверки разрешений:
Простые запросы (не требуют preflight):
Не простые запросы (требуют preflight):
{
"proxy": "http://localhost:5000"
}
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:5000',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '')
}
}
}
})
Access-Control-Allow-Origin: *
с учетными даннымиNo 'Access-Control-Allow-Origin' header:
Credentials not supported when CORS is wildcard:
*
Access-Control-Allow-Credentials: true
Method not allowed:
Access-Control-Allow-Methods
// Сервер на Node.js с полной CORS-настройкой
app.use((req, res, next) => {
const allowedOrigins = ['https://production.com', 'http://localhost:3000'];
const origin = req.headers.origin;
if (allowedOrigins.includes(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
}
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Max-Age', '86400');
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
CORS — это важный механизм безопасности браузеров, требующий правильной настройки как на сервере (через специальные заголовки), так и на клиенте. Для разработки можно использовать прокси, а в продакшне необходимо точно настраивать разрешенные домены, методы и заголовки для баланса между функциональностью и безопасностью.