CORS 구성을 Spring 컨트롤러에 자동으로 추가

4748 단어 corsspring

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 beanApplicationContext을 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/

좋은 웹페이지 즐겨찾기