CORS 에러 해결

정명진·2022년 12월 16일
0
post-thumbnail

이번에 동기와 애플 프로비저닝 자동화 사이트를 구축하기 위해 프로젝트를 진행중

CORS 에러가 등장했다. 평소 Security를 적용해서 설정할땐 해당 문제를 마주하는 일이 없었는데 이번에는 그냥 하다보니 문제가 발생했다..

검색을 해보면 Controller단에 넣거나 Security 처럼 전역 설정이 있다. Controller 마다 넣는건 비효율적이라 생각해서 전역 설정을 하기로 했다.

하지만 전역 설정을 했는데도 오류가 발생하는 현상 발견...

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    LoggingInterceptor loggingInterceptor;
    /* (non-Javadoc)
     * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
     */
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        //NOTE: servlet context set in "application.properties" is "/api" and request like "/api/session/login" resolves here to "/session/login"!
        registry.addMapping("/**")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedOrigins("*")
                .allowedHeaders("*")
                .allowCredentials(false);
    }

}

이렇게 하면 된다더니 되지 않는다...

왜지?? 그래서 글을 정독하다가 서버에서 저렇게 설정을 해도 CORS는 기본적으로 브라우저에서 판단하기 때문에 소용이 없다는글을 발견하게 되었다..

그래서 이렇게 명시적으로 origin을 넣어주면 되지 않을까? 해서 이렇게 해봤다.

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    LoggingInterceptor loggingInterceptor;
    /* (non-Javadoc)
     * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
     */
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        //NOTE: servlet context set in "application.properties" is "/api" and request like "/api/session/login" resolves here to "/session/login"!
        registry.addMapping("/**")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedOrigins("http://localhost:3000")
                .allowedHeaders("*")
                .allowCredentials(false);
    }

}

하지만 그래도 되지 않았다 ㅋㅋㅋㅋ

뭐가 문제인고... 에러를 봤더니 이런 문구가 있다.

credential mode is include

그렇다. CORS는 기본적으로 부라우저 설정 기준으로 판단하기 때문에 명시적으로 origin을 설정했지만 allowCredentials이 false여서 문제가 발생하는것이다. include니까 true로 하면 되지 않을까??

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    LoggingInterceptor loggingInterceptor;
    /* (non-Javadoc)
     * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
     */
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        //NOTE: servlet context set in "application.properties" is "/api" and request like "/api/session/login" resolves here to "/session/login"!
        registry.addMapping("/**")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedOrigins("http://localhost:3000")
                .allowedHeaders("*")
                .allowCredentials(true);
    }

}

드디어 성공이다...

브라우저의 기준에 맞게 설정해줘야 한다는 사실을 기억하자!

profile
개발자로 입사했지만 정체성을 잃어가는중... 다시 준비 시작이다..

0개의 댓글