관리 메뉴

JUNGKIMHOON

[Spring] CORS 오류 해결 본문

Spring

[Spring] CORS 오류 해결

JUNGKIMHOON 2020. 9. 19. 19:39

CORS(Cross-Origin Resource Sharing) 교차 출처 리소스 공유

SOP(Same-origin policy의 반대 개념)

 

다른 출처의 자원을 공유할 수 있도록 설정하는 권한 체제

따라서 CORS를 설정해주지 않거나 제대로 설정하지 않은 경우, 원하는 대로 리소스를 공유하지 못한다.

 

백앤드와 프론트의 포트넘버가 다를 때 발생한다고 한다.

네이버 API, RIOT API 등 외부 API를 다룰 때 프런트에서 직접적으로 데이터를 요청할 때도 발생한다. (백엔드에서 요청받아 프런트로 넘겨줘야 한다.)

 

Configuration 적용
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedMethods("GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS");
            }
        };
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");  // 와일드 카드로 처리 ("http://localhost:8080" 으로 지정가능)
        config.addAllowedHeader("*");  
        config.addExposedHeader(HttpHeaders.AUTHORIZATION);
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers().frameOptions().disable();
        http
                .cors()
                .and()
                .csrf().disable().authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/h2/**").permitAll()
                .antMatchers(HttpMethod.POST, "/api/v1/login").permitAll()
                .anyRequest().authenticated()
                .and()
                // We filter the api/login requests
                .addFilterBefore(new JWTLoginFilter("/api/v1/login", authenticationManager()),
                        UsernamePasswordAuthenticationFilter.class);
        // And filter other requests to check the presence of JWT in header
        //.addFilterBefore(new JWTAuthenticationFilter(),
        //       UsernamePasswordAuthenticationFilter.class);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // Create a default account
        auth.userDetailsService(userDetailsService);
//        auth.inMemoryAuthentication()
//                .withUser("admin")
//                .password("password")
//                .roles("ADMIN");
    }
}

 

 

'Spring' 카테고리의 다른 글

[Spring] JWT를 활용한 인증 (feat. vue)  (0) 2020.09.30
Glory of REST  (0) 2020.08.29
Comments