프로젝트를 진행 하던 중 흔하게 발생하는 Cross-Origin Resource Sharing,CORS 에러가 발생했습니다.
Spring Boot에서 해결하는 방법 중 하나인 response header에 직접 허용을 추가하는 방식을 사용했는데 왠지 모르게 계속 에러가 발생했고, 미궁에 빠지나 했지만 매우 사소한 수정으로 해결이 되었습니다.
일단 제가 구글링을 통해서 해결한 방식을 간단하게 소개해보겠습니다.
일단 프로젝트 내에 어떤 위치에든 filter 폴더를 만들어준 뒤 CorsFilter.java 파일을 하나 생성해줍니다.
그리고 내용은 아래의 내용으로 채워주는데 Filter를 import 할 때에는 javax.servlet의 것을 import 해야 합니다.
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//여기에 내가 허용하고자 하는 클라이언트의 url을 입력해 줍니다.
//주의사항 "https://myurl.com/" 처럼 마지막에 '/'를 붙이면 CORS에러가 그대로 발생하게 됩니다.
response.setHeader("Access-Control-Allow-Origin", "https://myurl.com");
//response.setHeader("Access-Control-Allow-Origin", "*"); //이렇게 해서 모든 요청에 대해서 허용할 수도 있습니다.
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods","*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization");
if("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
}else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
}
}
저도 처음에는 간편한 방법인 @CrossOrigin 을 이용했었는데 이유는 모르겠지만 계속 CORS에러가 발생했고, 확실한 방법인 위의 방법을 사용하게 되었습니다. url마지막에 '/'가 들어가지 않도록 주의해주세요! 방금 '/'때문에 헤매다가 '/'가 원인임을 깨달아서 기록하고자 적게되었습니다. 이상입니다.