Что такое CORS (Cross-Origin Resource Sharing)?

«Что такое CORS (Cross-Origin Resource Sharing)?» — вопрос из категории Безопасность, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Проблема, которую решает CORS: Браузер по умолчанию блокирует межсайтовые HTTP-запросы, инициированные скриптами (например, вызовы API с fetch или XMLHttpRequest), в соответствии с политикой Same-Origin Policy. CORS позволяет серверу явно объявить, какие внешние источники имеют право на доступ к его ресурсам.

Как это работает:

  1. Для простых запросов (GET, POST, HEAD с определенными заголовками) браузер добавляет заголовок Origin, а сервер отвечает с заголовком Access-Control-Allow-Origin.
  2. Для непростых запросов (например, с пользовательскими заголовками или методом PUT) браузер сначала отправляет предзапрос (preflight) методом OPTIONS, чтобы проверить разрешения сервера.

Пример заголовков ответа сервера (C# ASP.NET Core):

// В Startup.cs или Program.cs
app.UseCors(builder =>
    builder.WithOrigins("https://trusted-site.com")
           .AllowAnyMethod()
           .AllowAnyHeader());

Или более детальная настройка через middleware:

app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Access-Control-Allow-Origin", "https://my-frontend.com");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
    context.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization");

    if (context.Request.Method == "OPTIONS")
    {
        context.Response.StatusCode = 200;
        return;
    }
    await next();
});

Ключевые моменты:

  • CORS контролируется сервером, а не клиентом.
  • Это защита в браузере. Инструменты вроде Postman или curl не применяют политику CORS.
  • Для работы с учетными данными (куки, заголовки авторизации) необходимо также установить Access-Control-Allow-Credentials: true на сервере, а на клиенте — credentials: 'include'.

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