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.