스프링 요청에 대해 인터셉터가 가로챌때(만) 크로스 도메인 이슈가 발생합니다.

조회수 1108회

rest api 만드는데 크로스 도메인 관련 오류하여 질문드립니다.

Access to XMLHttpRequest at '요청URL' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

일단 프론트와 백엔드는 각기 다른 서버에서 운영됩니다.

문제점은 같은 서버내에서 요청할때는 아무 문제가 없는데 크로스 도메인 요청, 그 중에서도 인터셉터에 해당하는 요청일때 크로스 도메인이슈가 발생하고 임의로 만든 header 값이 출력되지 않습니다.

현재 설정은 아래와 같습니다.

  1. crossfilter를 통해 크로스 도메인 요청을 허용해 주고 있습니다. 일단 보안은 무시해주세요..
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
    {
    response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE,OPTIONS");
                response.setHeader("Access-Control-Max-Age", "3600");
                response.setHeader("Access-Control-Allow-Headers", "*");
                response.setHeader("Access-Control-Allow-Origin", "*");             
                response.setHeader("Access-Control-Expose-Headers", "*");
                response.setHeader("Access-Control-Request-Headers","*");
                response.setHeader("Access-Control-Request-Method","*");
    chain.doFilter(req, response);
    }

  1. servlet.xml 일부입니다.
    <beans:bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <beans:property name="order" value="0" />
    </beans:bean>
    <beans:import resource="interceptor-context.xml" />

  1. interceptor-context.xml
<interceptors>
    <interceptor>
        <mapping path="/test/**" />
        <beans:bean class="인터셉터 클래스"></beans:bean>
    </interceptor>
</interceptors>

인터셉터 클래스

public class SessionInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {

        // 커스텀 헤더 출력
        System.out.println(request.getHeader("x-auth-token"));

        //토큰 인증 관련 처리 진행..

        return super.preHandle(request, response, handler);
    }

요청에 대한 CASE

CASE1. (/test/**) 에 해당하지 않는 (인터셉터에 걸리지 않는) 요청

이 요청은 header의 x-auth-token 이라는 값을 체크하는데 crossdomain 이슈가 발생하지 않고 정상적으로 토큰값이 넘어 옵니다.

CASE2. (/test/**) 에 해당하는 (인터셉터가 가로채는)요청

로컬에서 테스트시 정상적으로 응답하지만 서버에 직접 호출(crossdomain)하면 custom header인 x-auth-token (위 인터셉터 클래스에서 찍은) 값이 찍히지 않고 응답도 크로스 도메인 이슈가 발생하면서 http status code 500을 함께 반환합니다.

요약하자면 crossdomain 관련 이슈가 인터셉터를 탈때만 발생하고 그때 custom header도 사라집니다.

이유가 뭘까요..

(+) 그런데 postman으로 요청시에는 둘다 되서 jsonp인가 뭔가를 쓰던가 프론트에서 조정해야 되나 싶었는데 생각해보니 인터셉터를 타지 않을때는 서버로 직접요청(cross domain)해도 정상적으로 응답이 와서 이건 어느 장단에 맞춰야할지 모르겠네요..

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)