CORS

2025. 3. 5. 22:50Spring Framework/Web on Servlet Stack

📌 Spring MVC의 CORS (Cross-Origin Resource Sharing) 정리

🔹 1️⃣ CORS란?

CORS(Cross-Origin Resource Sharing)다른 도메인에서 AJAX Request을 허용할지 결정하는 보안 정책입니다.
웹 브라우저는 보안 문제로 인해 같은 출처(Same-Origin)의 요청만 허용하며,
다른 출처(Origin)에서 오는 Request는 기본적으로 차단됩니다.

같은 출처(Same-Origin) 요청 예시
https://example.comhttps://example.com/api/data (허용)

다른 출처(Cross-Origin) 요청 예시
https://evil.comhttps://example.com/api/data (차단)

📌 CORS를 설정하면 특정 도메인의 요청을 허용할 수 있음!

🔹 2️⃣ CORS 처리 방식

CORS 요청은 3가지 유형으로 구분됩니다.
1. Preflight Request(Non-Simple Request): OPTIONS 메서드를 사용하여 사전 요청 확인
2. Simple Request: GET, POST 등의 간단한 요청
3. Actual Request: 본격적인 CORS 요청

📌 Spring MVC는 HandlerMapping을 활용해 CORS 요청을 자동으로 처리
Preflight 요청을 처리하고, 단순 요청 및 실제 요청에 대한 CORS 응답 헤더를 설정함

🔹 3️⃣ @CrossOrigin을 이용한 CORS 설정

Spring MVC에서는 컨트롤러 단위에서 @CrossOrigin 어노테이션을 사용하여 CORS를 설정할 수 있습니다.

📍 ✔ 기본 사용법

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin  // 모든 도메인에서 접근 허용
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        return new Account(id, "John Doe");
    }

    @DeleteMapping("/{id}") // CORS 미설정 -> 기본 정책(차단) 적용
    public void remove(@PathVariable Long id) {
        // 삭제 로직
    }
}

@CrossOrigin을 적용하면 해당 메서드는 모든 도메인의 요청을 허용
@DeleteMapping 메서드는 CORS 설정이 없으므로 기본 보안 정책이 적용되어 차단됨

🔹 4️⃣ @CrossOrigin 상세 설정

📍 ✔ 특정 Origin만 허용

@CrossOrigin(origins = "https://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
    return new Account(id, "Jane Doe");
}

origins = "https://domain2.com"이 도메인에서만 요청 허용

📍 ✔ 클래스 레벨에서 @CrossOrigin 설정

@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        return new Account(id, "Jane Doe");
    }
}

✔ 클래스에 적용하면 해당 컨트롤러의 모든 엔드포인트가 설정을 상속받음
maxAge = 3600CORS 캐시를 1시간(3600초) 동안 유지

📍 ✔ 메서드마다 다른 설정 적용

@CrossOrigin(maxAge = 3600) // 전체 기본 설정
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("https://domain2.com") // 특정 메서드에서만 설정
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        return new Account(id, "Alice");
    }
}

@CrossOrigin("https://domain2.com") → 특정 메서드에서만 허용 도메인을 다르게 설정 가능

🔹 5️⃣ 글로벌 CORS 설정

📍 ✔ Java 기반 글로벌 CORS 설정 (WebMvcConfigurer)

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**") // "/api/**" 패턴에 CORS 적용
            .allowedOrigins("https://domain2.com") // 허용할 도메인
            .allowedMethods("PUT", "DELETE") // 허용할 HTTP 메서드
            .allowedHeaders("header1", "header2", "header3") // 허용할 헤더
            .exposedHeaders("header1", "header2") // 노출할 헤더
            .allowCredentials(true) // 쿠키 포함 요청 허용
            .maxAge(3600); // 캐시 유지 시간 (1시간)
    }
}

addMapping("/api/**")/api/로 시작하는 모든 요청에 CORS 적용
allowedOrigins("https://domain2.com") → 특정 도메인만 허용
allowCredentials(true)쿠키 및 인증 정보 포함 요청 허용
maxAge(3600)CORS 설정을 1시간 동안 캐시

📍 ✔ XML 기반 글로벌 CORS 설정

<mvc:cors>
    <mvc:mapping path="/api/**"
        allowed-origins="https://domain1.com, https://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2"
        allow-credentials="true"
        max-age="123" />
</mvc:cors>

Java 설정과 동일한 기능을 XML로 구성 가능

🔹 6️⃣ CorsFilter를 사용한 CORS 설정

Spring에서 필터를 통해 CORS를 설정할 수도 있음
✔ Spring Security와 함께 사용할 때 CorsFilter를 적용해야 할 수도 있음

📍 CorsFilter 설정 코드

CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com"); // 허용할 도메인
config.addAllowedHeader("*"); // 모든 헤더 허용
config.addAllowedMethod("*"); // 모든 HTTP 메서드 허용

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config); // 모든 경로에 적용

CorsFilter filter = new CorsFilter(source);

setAllowCredentials(true)쿠키 및 인증 정보 허용
addAllowedOrigin("https://domain1.com") → 특정 도메인만 허용
addAllowedMethod("*") → 모든 HTTP 메서드 허용

📌 Spring Security와 함께 사용할 경우 CorsFilter보다 Spring Security의 CORS 설정을 활용하는 것이 권장됨

🔹 7️⃣ CORS Summary 📝

CORS는 보안 강화를 위한 정책으로, 기본적으로 브라우저가 다른 도메인의 요청을 차단함
Spring에서는 @CrossOrigin을 사용하여 간단하게 설정 가능
글로벌 CORS 설정은 WebMvcConfigurer에서 addCorsMappings를 사용하여 적용 가능
필터(CorsFilter)를 사용하여 더 세부적인 CORS 설정이 가능
쿠키 포함 요청 (allowCredentials(true)) 사용 시 보안 위험을 고려해야 함

 

💡 Spring의 강력한 CORS 설정 기능을 활용하면 보안성과 유연성을 동시에 확보 가능! 🚀

 

출처 : https://docs.spring.io/spring-framework/reference/web/webmvc-cors.html

 

CORS :: Spring Framework

The @CrossOrigin annotation enables cross-origin requests on annotated controller methods, as the following example shows: @RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retriev

docs.spring.io

 

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

URI Links  (0) 2025.03.05
Logging  (1) 2025.02.28
Multipart Resolver  (0) 2025.02.28
View Resolution  (0) 2025.02.28
Exceptions  (0) 2025.02.28