Loading...
Spring Framework Reference Documentation 7.0.2의 CORS의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
See equivalent in the Reactive stack
Spring MVC는 CORS (Cross-Origin Resource Sharing)를 처리할 수 있게 해줍니다. 이 섹션에서는 그 방법을 설명합니다.
See equivalent in the Reactive stack
보안상의 이유로, 브라우저는 현재 origin 밖의 리소스에 대한 AJAX 호출을 금지합니다. 예를 들어, 한 탭에는 당신의 은행 계좌가 있고 다른 탭에는 evil.com이 있을 수 있습니다. evil.com의 스크립트는 당신의 자격 증명으로 은행 API에 AJAX 요청을 보내서는 안 됩니다. 예를 들어, 당신의 계좌에서 돈을 인출하는 것과 같은 행위를 말합니다!
Cross-Origin Resource Sharing (CORS)는 IFRAME이나 JSONP를 기반으로 한 덜 안전하고 덜 강력한 우회 방법을 사용하는 대신 어떤 종류의 cross-domain 요청이 허용되는지를 지정할 수 있게 해주는 대부분의 브라우저에 의해 구현된 W3C 명세입니다.
See equivalent in the Reactive stack
credentialed 요청과 함께 CORS를 사용하려면 allowedCredentials를 활성화해야 합니다. 이 옵션은
설정된 도메인과 높은 수준의 신뢰 관계를 형성하며, 쿠키 및 CSRF 토큰과 같은 민감한 사용자별 정보를
노출함으로써 웹 애플리케이션의 공격 표면을 증가시킨다는 점에 유의해야 합니다.
credential을 활성화하는 것은 설정된 "*" CORS 와일드카드가 처리되는 방식에도 영향을 줍니다:
allowOrigins에서 허용되지 않지만, 대신
allowOriginPatterns 프로퍼티를 사용하여 동적인 origin 집합과 매칭할 수 있습니다.allowedHeaders 또는 allowedMethods에 설정된 경우, Access-Control-Allow-Headers
및 Access-Control-Allow-Methods 응답 헤더는 CORS preflight 요청에서 지정된
관련 헤더 및 메서드를 복사하여 처리됩니다.exposedHeaders에 설정된 경우, Access-Control-Expose-Headers 응답 헤더는
설정된 헤더 목록 또는 와일드카드 문자로 설정됩니다. CORS 명세는
Access-Control-Allow-Credentials가 true로 설정된 경우 와일드카드 문자를 허용하지
않지만, 대부분의 브라우저는 이를 지원하며 CORS 처리 중에 모든 응답 헤더를
사용할 수 있는 것은 아니므로, 그 결과 와일드카드 문자는 allowCredentials 프로퍼티의
값과 관계없이 지정되면 헤더 값으로 사용됩니다.이러한 와일드카드 구성은 편리할 수 있지만, 가능한 경우 더 높은 수준의 보안을 제공하기 위해 유한한 값 집합을 구성하는 것이 권장됩니다.
See equivalent in the Reactive stack
CORS 명세는 preflight, simple, actual 요청을 구분합니다. CORS가 어떻게 동작하는지 알아보려면 이 외에도 많은 자료 중에서 이 글을 읽거나 자세한 내용은 명세를 참고할 수 있습니다.
Spring MVC HandlerMapping 구현은 CORS에 대한 built-in support를 제공합니다. 요청을
핸들러에 성공적으로 매핑한 후, HandlerMapping 구현은 주어진 요청과 핸들러에 대한
CORS 설정을 확인하고 추가 작업을 수행합니다. preflight 요청은 직접 처리되며,
simple 및 actual CORS 요청은 가로채어 검증되고 필요한 CORS 응답 헤더가 설정됩니다.
cross-origin 요청(Origin 헤더가 존재하고 요청의 호스트와 다른 경우)을 활성화하려면
명시적으로 선언된 CORS 설정이 필요합니다. 일치하는 CORS 설정이 없으면
preflight 요청은 거부됩니다. simple 및 actual CORS 요청의 응답에는 CORS 헤더가
추가되지 않으며, 그 결과 브라우저는 이를 거부합니다.
각 HandlerMapping은 URL 패턴 기반의 CorsConfiguration 매핑으로
개별적으로 설정
할 수 있습니다. 대부분의 경우, 애플리케이션은 이러한 매핑을 선언하기 위해
MVC Java 설정 또는 XML 네임스페이스를 사용하며, 그 결과 단일 전역 맵이 모든
HandlerMapping 인스턴스에 전달됩니다.
HandlerMapping 수준의 전역 CORS 설정을 보다 세분화된 핸들러 수준의 CORS
설정과 결합할 수 있습니다. 예를 들어, 어노테이션이 적용된 컨트롤러는
클래스 또는 메서드 수준의 @CrossOrigin 어노테이션을 사용할 수 있습니다(다른 핸들러는
CorsConfigurationSource를 구현할 수 있습니다).
전역과 로컬 설정을 결합하는 규칙은 일반적으로 추가적입니다. 예를 들어,
모든 전역 및 모든 로컬 origin이 그렇습니다. 하나의 값만 허용될 수 있는 속성의 경우,
예를 들어 allowCredentials 및 maxAge는 로컬 값이 전역 값을 오버라이드합니다. 자세한 내용은
CorsConfiguration#combine(CorsConfiguration)
을 참고하십시오.
source에서 더 많은 내용을 배우거나 고급 커스터마이제이션을 수행하려면 다음 코드들을 확인하십시오:
CorsConfigurationCorsProcessor,DefaultCorsProcessorAbstractHandlerMapping
@CrossOriginSee equivalent in the Reactive stack
@CrossOrigin
어노테이션은 다음 예제에서 보듯이 어노테이션이 적용된 컨트롤러 메서드에서
cross-origin 요청을 활성화합니다:
1@RestController 2@RequestMapping("/account") 3public class AccountController { 4 5 @CrossOrigin 6 @GetMapping("/{id}") 7 public Account retrieve(@PathVariable Long id) { 8 // ... 9 } 10 11 @DeleteMapping("/{id}") 12 public void remove(@PathVariable Long id) { 13 // ... 14 } 15}
1@RestController 2@RequestMapping("/account") 3class AccountController { 4 5 @CrossOrigin 6 @GetMapping("/{id}") 7 fun retrieve(@PathVariable id: Long): Account { 8 // ... 9 } 10 11 @DeleteMapping("/{id}") 12 fun remove(@PathVariable id: Long) { 13 // ... 14 } 15}
기본적으로, @CrossOrigin은 다음을 허용합니다:
allowCredentials는 기본적으로 활성화되어 있지 않은데, 이는 쿠키 및 CSRF 토큰과 같은
민감한 사용자별 정보를 노출하는 신뢰 수준을 형성하며 적절한 경우에만 사용해야 하기 때문입니다.
이를 활성화하는 경우 allowOrigins는 하나 이상의 특정 도메인(특수 값 "*"는 제외)으로
설정해야 하며, 또는 대안으로 allowOriginPatterns 프로퍼티를 사용하여 동적인 origin 집합과
매칭할 수 있습니다.
maxAge는 30분으로 설정됩니다.
@CrossOrigin은 클래스 수준에서도 지원되며, 다음 예제에서 보듯이 모든 메서드에 상속됩니다:
1@CrossOrigin(origins = "https://domain2.com", maxAge = 3600) 2@RestController 3@RequestMapping("/account") 4public class AccountController { 5 6 @GetMapping("/{id}") 7 public Account retrieve(@PathVariable Long id) { 8 // ... 9 } 10 11 @DeleteMapping("/{id}") 12 public void remove(@PathVariable Long id) { 13 // ... 14 } 15}
1@CrossOrigin(origins = ["https://domain2.com"], maxAge = 3600) 2@RestController 3@RequestMapping("/account") 4class AccountController { 5 6 @GetMapping("/{id}") 7 fun retrieve(@PathVariable id: Long): Account { 8 // ... 9 } 10 11 @DeleteMapping("/{id}") 12 fun remove(@PathVariable id: Long) { 13 // ... 14 } 15}
다음 예제에서 보듯이, 클래스 수준과 메서드 수준 모두에서 @CrossOrigin을 사용할 수 있습니다:
1@CrossOrigin(maxAge = 3600) 2@RestController 3@RequestMapping("/account") 4public class AccountController { 5 6 @CrossOrigin("https://domain2.com") 7 @GetMapping("/{id}") 8 public Account retrieve(@PathVariable Long id) { 9 // ... 10 } 11 12 @DeleteMapping("/{id}") 13 public void remove(@PathVariable Long id) { 14 // ... 15 } 16}
1@CrossOrigin(maxAge = 3600) 2@RestController 3@RequestMapping("/account") 4class AccountController { 5 6 @CrossOrigin("https://domain2.com") 7 @GetMapping("/{id}") 8 fun retrieve(@PathVariable id: Long): Account { 9 // ... 10 } 11 12 @DeleteMapping("/{id}") 13 fun remove(@PathVariable id: Long) { 14 // ... 15 } 16}
See equivalent in the Reactive stack
세분화된 컨트롤러 메서드 수준 설정 외에도, 일부 전역 CORS 설정을
정의하고 싶을 수 있습니다. URL 기반 CorsConfiguration 매핑을 개별적으로
어떤 HandlerMapping에든 설정할 수 있습니다. 그러나 대부분의 애플리케이션은 이를 위해
MVC Java 설정 또는 MVC XML 네임스페이스를 사용합니다.
기본적으로, 전역 설정은 다음을 활성화합니다:
GET, HEAD, POST 메서드.allowCredentials는 기본적으로 활성화되어 있지 않은데, 이는 쿠키 및 CSRF 토큰과 같은
민감한 사용자별 정보를 노출하는 신뢰 수준을 형성하며 적절한 경우에만 사용해야 하기 때문입니다.
이를 활성화하는 경우 allowOrigins는 하나 이상의 특정 도메인(특수 값 "*"는 제외)으로
설정해야 하며, 또는 대안으로 allowOriginPatterns 프로퍼티를 사용하여 동적인 origin 집합과
매칭할 수 있습니다.
maxAge는 30분으로 설정됩니다.
See equivalent in the Reactive stack
MVC Java 설정에서 CORS를 활성화하려면, 다음 예제에서 보듯이 CorsRegistry 콜백을
사용할 수 있습니다:
1@Configuration 2@EnableWebMvc 3public class WebConfig implements WebMvcConfigurer { 4 5 @Override 6 public void addCorsMappings(CorsRegistry registry) { 7 8 registry.addMapping("/api/**") 9 .allowedOrigins("https://domain2.com") 10 .allowedMethods("PUT", "DELETE") 11 .allowedHeaders("header1", "header2", "header3") 12 .exposedHeaders("header1", "header2") 13 .allowCredentials(true).maxAge(3600); 14 15 // Add more mappings... 16 } 17}
1@Configuration 2@EnableWebMvc 3class WebConfig : WebMvcConfigurer { 4 5 override fun addCorsMappings(registry: CorsRegistry) { 6 7 registry.addMapping("/api/**") 8 .allowedOrigins("https://domain2.com") 9 .allowedMethods("PUT", "DELETE") 10 .allowedHeaders("header1", "header2", "header3") 11 .exposedHeaders("header1", "header2") 12 .allowCredentials(true).maxAge(3600) 13 14 // Add more mappings... 15 } 16}
XML 네임스페이스에서 CORS를 활성화하려면, 다음 예제에서 보듯이 <mvc:cors> 엘리먼트를
사용할 수 있습니다:
1<mvc:cors> 2 3 <mvc:mapping path="/api/**" 4 allowed-origins="https://domain1.com, https://domain2.com" 5 allowed-methods="GET, PUT" 6 allowed-headers="header1, header2, header3" 7 exposed-headers="header1, header2" allow-credentials="true" 8 max-age="123" /> 9 10 <mvc:mapping path="/resources/**" 11 allowed-origins="https://domain1.com" /> 12 13</mvc:cors>
See equivalent in the Reactive stack
built-in
CorsFilter를 통해 CORS support를 적용할 수 있습니다.
CorsFilter를 Spring Security와 함께 사용하려는 경우, Spring Security에는 CORS에 대한 built-in support가 있다는 점을 명심하십시오.
필터를 설정하려면, 다음 예제에서 보듯이 CorsConfigurationSource를 생성자에 전달하면 됩니다:
1CorsConfiguration config = new CorsConfiguration(); 2 3// Possibly... 4// config.applyPermitDefaultValues() 5 6config.setAllowCredentials(true); 7config.addAllowedOrigin("https://domain1.com"); 8config.addAllowedHeader("*"); 9config.addAllowedMethod("*"); 10 11UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 12source.registerCorsConfiguration("/**", config); 13 14CorsFilter filter = new CorsFilter(source);
1val config = CorsConfiguration() 2 3// Possibly... 4// config.applyPermitDefaultValues() 5 6config.allowCredentials = true 7config.addAllowedOrigin("https://domain1.com") 8config.addAllowedHeader("*") 9config.addAllowedMethod("*") 10 11val source = UrlBasedCorsConfigurationSource() 12source.registerCorsConfiguration("/**", config) 13 14val filter = CorsFilter(source)
Range Requests
API Versioning