CORS 문제 Server 해결책 (Filter)

** 참고문서
CORS 크로스 도메인 이슈 (No ‘Access-Control-Allow-Origin’ header is present on the requested resource)

위 문서는 Spring 개발시 여러 도메인을 가질 경우, Ajax에서 발생하는 CORS 문제 해결에 대해 설명합니다.

크로스도메인문제 발생시 오류메시지

XMLHttpRequest cannot load http://www.ABC.co.kr.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://S1.ABC.co.kr' is therefore not allowed access.

이에 대한 한글 안내는 이렇게 써 있습니다.

교차 원본 요청 차단: 동일 출처 정책으로 인해 http://xxx.co.kr 에 있는 원격 자원을 읽을 수 없습니다. 자원을 같은 도메인으로 이동시키거나 CORS를 활성화하여 해결할 수 있습니다.

이에 대한 해결책

설명이 이것저것 잡다하게 많은데요, 실제 이를 해결하는 방법은 어렵지 않습니다.
크로스 도메인 요청을 허용할 웹 서버에서 크로스 도메인 이슈를 문제 삼지 않을 도메인을 지정해주면 됩니다.

들어오는 모든 요청에 대해 처리해주기 위해 Filter 를 하나 만들어야 될 것 같습니다.
필터(Filter) 이름은 SimpleCORSFilter 로 하기로 하고 SimpleCORSFilter class 를 Filter interface를 구현하여, 생성하도록 합니다.
그리고 이 필터를 웹서비스의 web.xml 에 등록하여 줍니다.

필터 추가를 위해서는 web.xml 수정과 SimpleCORSFilter.java 작성이 필요합니다.

** web.xml 수정: 필터 등록

<!-- 필터 이름과 클래스 등록 -->
<filter>
    <filter-name>cors</filter-name>
    <filter-class>com.company.project.util.domain.SimpleCORSFilter</filter-class>
</filter>
<!-- 필터가 적용될 대상: url 패턴 -->
<filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

** SimpleCORSFilter.java 추가 :
필터를 통해 내보내지는 모든 응답(response) HTTP Header에 Access-Control-* 설정을 넣는다. 추가되는 항목은.. (filter는 이런 용도에 쓰인다)

  • response.setHeader(“Access-Control-Allow-Methods”, “POST, GET, OPTIONS, DELETE”);
  • response.setHeader(“Access-Control-Max-Age”, “3600”);
  • response.setHeader(“Access-Control-Allow-Headers”, “x-requested-with”);
  • response.setHeader(“Access-Control-Allow-Origin”, “*”);
package com.company.project.util.domain;

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;
import org.springframework.stereotype.Component;

@Component
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-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

        // 허용대상: 전부 허용하던지
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 허용대상: 아래 3개의 도메인만 허용하던지
        // response.addHeader("Access-Control-Allow-Origin", "http://S1.ABC.co.kr");
        // response.addHeader("Access-Control-Allow-Origin", "http://S2.ABC.co.kr");
        // response.addHeader("Access-Control-Allow-Origin", "http://S3.ABC.co.kr");

        chain.doFilter(req, res);
    }
    public void init(FilterConfig filterConfig) {}
    public void destroy() {}
}

이런 방법에 대한 글을 전에도 읽은 것 같은데, 이제서야 이해가 되네요. 역시 이해될 때까지 반복하는게 중요!! 그리고 출처 글쓴이에게 감사드립니다.

  1. 님 허용대상 추가하는거 하나만 되는데 두개는 못하나여???

    좋아하기

    응답

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: