JUNGKIMHOON
[Spring] CORS 오류 해결 본문
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