2025. 3. 5. 22:50ㆍSpring 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.com
→ https://example.com/api/data
(허용)
✔ 다른 출처(Cross-Origin) 요청 예시
❌ https://evil.com
→ https://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 = 3600
→ CORS 캐시를 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 |