Spring RESTful Access-Control-Allow-Origin 오류 해결
클라이언트와 서버 프로그램 작업할 때 REST 방식으로 구현할 경우~ 서로 다른 호스트에서 요청을 시도하면 Access-Control-Allow-Origin
오류가 발생한다.
나같은 경우 AngularJS 로 클라이언트(프론트엔드) 프로그램을 개발하고 스프링 프레임워크로 서버(백엔드) 프로그램을 개발하였다. 문제는 클라이언트 프로그램을 수정하면 매번 서버가 리로드되는 상황이 발생한다. Spring의 view 소스 경로를 변경하면 될 일이지만, 외부에서 소스를 직접 접근을 허용하고 싶지 않아서 경로 위치를 바꿀순 없었다.
그래서 클라이언트와 서버 프로그램의 서버를 분리하였는데… 위와 같은 문제가 발생한다.
클라이언트와 서버 프로그램의 호스트가 다르다보니 보안정책에 위배되어 오류가 발생한다.
AngularJS : http://localhost:8000
Spring : http://localhost:8080
이 문제를 해결하려면 아래와 같이 작업을 하면 된다.
@소스 SimpleCORSFilter.java
package com.syaku.commons;
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 SimpleCORSFilter 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-Methods", "POST, GET, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, origin, content-type, accept");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
그리고 web.xml 에 필터를 추가한다.
@소스 web.xml
<filter>
<filter-name>SimpleCORSFilter</filter-name>
<filter-class>com.syaku.commons.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SimpleCORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
출처 : https://spring.io/guides/gs/rest-service-cors
참고 : http://breadmj.wordpress.com/2013/08/21/implement-cors-using-spring-mvc