CORS(Cross-Origin Resource Sharing)
-> 교차출처 리소스 공유
cors는 무분별한 http 통신을 제한하기 위해서 같은 출처 혹은 설정된 특정 url에 한해서만 사이트간 HTTP 요청을 허용하는 것
기본 형태는
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class CORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, origin, content-type, accept");
response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
chain.doFilter(req, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
public void destroy() {
}
}
이런 형태의 필터를 추가하여야 하지만, 스프링 시큐리티를 사용하는 경우에는
WebSecurityConfig에서 configure 클래스에
.cors().configurationSource(corsConfigurationSource()).and()
를 추가하고
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOrigin("http://localhost:8080");
configuration.setAllowedMethods(Arrays.asList("GET","POST", "OPTIONS", "PUT","DELETE"));
configuration.setAllowedHeaders(Arrays.asList("*"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
위와 같은 형태로 WebSecurityConfig에 빈을 등록하여 사용한다
CORS는 configure에서 HttpSecurity의 cors() 메소드로 설정을 할 수 있으며, 빈으로 등록한 CorsConfigurationSource를 통해 CORS의 속성을 정의해 줄 수 있다.