intermediate
CORS и preflight requests
Диагностируйте origin checks, simple vs preflighted requests, allowed headers/methods, credentials, caching и server-side CORS policy.
CORS применяет браузер, а не curl или server-to-server. Простые cross-origin GET/POST могут идти без preflight; запросы с кастомными headers, non-simple Content-Type или методами PUT/DELETE вызывают OPTIONS preflight.
app.use((req, res, next) => {
const origin = req.headers.origin;
if (allowedOrigins.has(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
res.setHeader('Access-Control-Allow-Credentials', 'true');
}
if (req.method === 'OPTIONS') {
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
return res.status(204).end();
}
next();
});
Сервер должен ответить на preflight до основного запроса. `Access-Control-Expose-Headers` перечисляет response headers, доступные JavaScript.
На интервью: «CORS error» часто — failed preflight или нет exposed header; CORS не заменяет authentication.
Типовые ошибки: отражать любой Origin в production; wildcard с credentials; долгий кэш preflight после смены политики.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Правила simple vs preflighted.
- Конкретный origin при cookies.
- Явный OPTIONS на API routes.
- Тест с реального browser origin.