ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Spring에서 CORS 처리(설정)하는 방법
    Spring 2022. 10. 27. 08:25
    반응형

    ❗️ Spring에서 Cors를 적용하는 방법에 대해 작성해본다.

    CORS(Cross-Origin Resource Sharing)

    CORS(Cross-origin 리소스 공유)는 최신 웹 브라우저의 보안 기능이다.

    이 기능을 사용하면 웹 브라우저가 어떤 도메인이 외부 웹 사이트 또는 서비스를 요청할 수 있을지 협상할 수 있다.
    대부분의 리소스 요청이 외부 도메인(예: 웹 서비스용 엔드포인트)으로 전송되기 때문에 CORS는 중요한 고려 대상이다. 

    CORS는 다음을 기준으로 cross-origin 요청 시 리소스 공유 여부를 결정한다.

     

    1. 요청을 수행한 특정 도메인
    2. 수행 중인 HTTP 요청 유형(GET, PUT, POST, DELETE 등)

    즉, 간단히 정의하면 CORS는 웹서버와 WAS가 서로 도메인이 다른 경우 브라우저단에서 처리하는 보안 기능이다.



    CORS 작동 방식

    가장 간단한 경우 브라우저 스크립트는 다른 도메인 내 서버의 리소스에 대해 GET 요청을 수행한다.
    요청이 GET 요청을 제출하도록 승인된 도메인에서 전송된 경우 해당 서버의 CORS 구성에 따라 cross-origin 서버는 요청된 리소스를

    반환하여 응답한다. 요청하는 도메인 또는 HTTP 요청 유형이 승인되지 않은 경우에는 요청이 거부되지만, CORS는 요청을 실제로 제출하기 전에 요청을 사전에 보낼 수 있다. 이 경우 preflight 요청은 OPTIONS 액세스 요청 작업을 전송하는 방식으로 이루어진다.
    cross-origin 서버의 CORS 구성이 요청하는 도메인에 대한 액세스 권한을 부여하는 경우 서버에서는 요청하는 도메인이 요청한 리소스에 대해 수행 가능한 HTTP 요청 유형을 모두 나열하는 preflight 응답으로 회신한다.

    출처:https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v2/developer-guide/cors.html



    Spring(Spring Boot)에서 CORS를 처리해야 하는 이유를 정리하자면, 아래와 같다.
    1. 도메인이 서로 다를 경우 브라우저에서 원 요청을 보내기 이전에 preflight로 OPTIONS 메소드로 요청
    2. 서버에서 넘어오는 response Header에 있는 CORS 설정을 통하여 원 요청을 보낼지 판단

    3. 서버에서 interceptor를 통한 로그인 검증 혹은 SpringSecurity 사용시 원요청뿐만 아니라 OPTIONS 메소드로 넘어오는

        preflight도 타기 때문에 서버에서는 Authorization 값을 읽어들이지 못하여 정상적인 로그인 검증 불가능

    4. 이로 인해 에러가 발생하고 브라우저에서는 정상적인 CORS 설정이 있는 response를 받지 못하여 CORS Error 출력.

     

    따라서, CORS 환경에서 위와 같은 처리를 하는 경우 OPTIONS Method는 interceptor단에서 정상 처리로 넘기던가 SpringSecurity에서 OPTIONS 요청은 permitAll()을 적용 해주어야 한다.


    📌 적용 방법

    💡 Spring에서 CORS 적용을 위해서는 WebMvcConfigurer의 구현체에서  addCorsMappings 메소드를 통해
         원하는 설정을 적용한다.

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .maxAge(3600);
    }

     

     

    💡 Interceptor에서의 처리

     

    💡 Spring Security 에서의 처리

     

    위와 같은 방법들로 Spring(Spring Boot)에서 CORS를 적용할 수 있다.




    Reference:

    https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v2/developer-guide/cors.html

     

    반응형

    댓글

Designed by Tistory.