CORS 구성을 Spring 컨트롤러에 자동으로 추가
It could be useful to add with a less of code the expected CORS headers in your Spring boot configuration. Let's do this!
CORS (Cross-Origin Resource Sharing)은 원치 않는 호출로부터 리소스 API를 "보호"할 수 있는 메커니즘입니다. 보호라는 말은 리소스가 제공되는 원본 도메인 외부의 모든 도메인에서 리소스를 요청하도록 제한하는 것을 의미합니다.
@CrossOrigin으로 모든 리소스에 플래그 지정
이는 구성자가 원본 간 리소스 공유를 요청하는 데 필요한 유일한 단계입니다. 예를 들어 :
@CrossOrigin
@RestController
@RequestMapping(value = "/api/user")
public interface UserController { ...
CORS Spring 구성자 선언
이 Spring bean은 여러 가지를 담당합니다. 🔎 첫 번째 작업은 보호되어야 하는 경로를 찾는 리소스를 스캔하는 것입니다. 이 예제에서는 autowired bean
ApplicationContext
을 Spring 애플리케이션 컨텍스트의 진입점으로 사용합니다.@Autowired
public CorsConfig(ApplicationContext applicationContext) {
corsControllers = Stream.of(applicationContext.getBeanNamesForAnnotation(CrossOrigin.class))
.filter(Objects::nonNull)
.map(bean -> applicationContext.findAnnotationOnBean(bean, RequestMapping.class))
.filter(mapping -> Objects.nonNull(mapping) && mapping.path().length > 0)
.map(mapping -> mapping.path()[0])
.peek(path -> log.info("Register CORS configuration for \"{}\".", path))
.collect(toSet());
}
Please keep this code safe !
두 번째 작업은
WebMvcConfigurer
빈이 CORS Registry에 보호된 경로를 추가하도록 선언하는 것입니다.@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
for (String corsController : corsControllers) {
registry.addMapping(corsController)
.allowedOriginPatterns(allowedCorsOrigin)
.allowedHeaders("Authorization", ...)
.allowedMethods("OPTIONS", "PUT", "POST", ...);
}
}
};
}
흥미로운 점은 String 배열의 Ant 패턴에 의해 허용된 도메인 선언을 외부화할 수 있다는 것입니다. 속성 allowedCorsOrigin은 @Value로 주석이 달린 변수입니다(샘플 코드 참조).
CURL을 사용하여 Spring 구성 테스트
이제 실제 Spring 앱에서 구성을 테스트할 수 있습니다.
🟢여기서는 테스트에 유효한 도메인을 사용합니다.
❯ curl -H "Origin: https://fr.reservoircode.net" --verbose http://localhost:9999/api/user
* Trying 127.0.0.1:9999...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 9999 (#0)
> GET /api/user HTTP/1.1
> Host: localhost:9999
> User-Agent: curl/7.68.0
> Accept: */*
> Origin: https://fr.reservoircode.net
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< Access-Control-Allow-Origin: https://fr.reservoircode.net
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 20 May 2022 16:20:17 GMT
<
* Connection #0 to host localhost left intact
{"id":"1","name":"Ulrich"}
🔴여기서는 테스트에 유효하지 않은 도메인을 사용합니다.
❯ curl -H "Origin: https://foo.com" --verbose http://localhost:9999/api/user
* Trying 127.0.0.1:9999...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 9999 (#0)
> GET /api/user HTTP/1.1
> Host: localhost:9999
> User-Agent: curl/7.68.0
> Accept: */*
> Origin: https://foo.com
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 403
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< Transfer-Encoding: chunked
< Date: Fri, 20 May 2022 16:23:02 GMT
<
* Connection #0 to host localhost left intact
Invalid CORS request
내가 그것을 시도하자
Spring 부트 예제를 원하는 경우 저장소를 복제할 수 있습니다https://github.com/ulrich/spring-cors-autoconfig.
신용 사진 : https://pixabay.com/fr/users/jackmac34-483877/
Reference
이 문제에 관하여(CORS 구성을 Spring 컨트롤러에 자동으로 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ulrich/automatically-add-cors-configuration-to-spring-controllers-4n01텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)