Что такое CORS и для чего он нужен?

«Что такое CORS и для чего он нужен?» — вопрос из категории Сети, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Проблема, которую решает CORS: Политика одинакового источника (Same-Origin Policy, SOP) по умолчанию запрещает веб-странице выполнять запросы к домену, отличному от того, с которого она загружена. CORS — это стандартный способ ослабить это ограничение безопасным способом.

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

  1. Простой запрос (Simple Request): Для GET/POST/HEAD с разрешенными заголовками браузер сразу отправляет запрос с заголовком Origin.
  2. Предварительный запрос (Preflight Request): Для "непростых" запросов (например, с кастомными заголовками или методом PUT) браузер сначала отправляет запрос OPTIONS.
  3. Ответ сервера: Сервер должен ответить заголовками, разрешающими доступ:
    • Access-Control-Allow-Origin: https://frontend-app.com (или *)
    • Access-Control-Allow-Methods: GET, POST, PUT
    • Access-Control-Allow-Headers: Content-Type, Authorization

Пример настройки CORS в Spring Boot:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**") // Пути, для которых применяется CORS
                .allowedOrigins("https://trusted-client.com") // Разрешенный origin
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowCredentials(true) // Разрешить куки/авторизацию
                .maxAge(3600); // Кэшировать результат preflight на 1 час
    }
}

Важно: CORS контролируется браузером. Серверные клиенты (curl, Postman, backend-сервисы) не подвержены этим ограничениям.