스프링 HandlerInterceptor로 구현해본 CORS 구현체

이 인터셉터는 어제 정리해둔 CORS를 스프링의 HandlerInterceptor를 이용해서 처리하는 코드를 작성해본 것입니다. 하지만… 테스트는 하지 않았으니.. 반드시 테스트 해보시고 사용하시기 바랍니다. 흠….

simple 방식과 preflight 방식 모두 지원하도록 만들었습니다.

매우 단순하게 구현해본 구현체라서 확장성을 고려하려면 설정 방식을 여기에 코딩한 것처럼 단일값으로 적어주는게 아니라.. 특정 URL 패턴마다 지원할 Methods나 Headers를 따로 정의하고.. 요청에 들어온 헤더 정보와 비교해서.. 지원할 Methods와 Headers의 값으로 응답 헤더를 지정해 주는 것이 더 좋을 것 같다.

CORS, Cross-Origin Resource Sharing이 뭐다냐…

흠냐…

1. http://www.bennadel.com/blog/2327-Cross-Origin-Resource-Sharing-CORS-AJAX-Requests-Between-jQuery-And-Node-js.htm

여기가면 두 개의 링크가 있는데 그 두개의 링크는..

2. http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

3. http://remysharp.com/2011/04/21/getting-cors-working/

이 중에서 윗글(2번 링크) 마지막에 CORS  예제 링크가 있습니다.

4. http://arunranga.com/examples/access-control/

이곳은 예제 모음이고.. 여기에 세부적인 예외 페이지 링크가 걸려있습니다. 크롬이나 파폭 인스팩터로 구경할 수 있습니다.

CORS는 최신 브라우저만 지원됩니다.

* 지원 브라우저 (두번째 링크에 잘 설명되어있습니다.)

  • 파폭 3.5+
  • IE8+
  • 사파리 4+
  • 크롬

* CORS 지원 브라우저중에서 IE와 비IE 브라우저의 차이점 (두번째 링크에 잘 설명되어있습니다.)

  • 다른 브라우저는 XmlHttpRequest를 그대로 사용하지만 IE는 XDomainRequest라는 걸 사용해야 합니다.
  • CORS의 추가적인 헤더 정보를 활용해서 Preflighted 요청이라는 걸 보낼 수 있지만 IE8은 그럴 수 없습니다.

=> 결국 IE는 CORS를 적용할 수 있는 버전이 제한적이며 적용할 수 있는 버전도 다른 브라우저오는 다른 형태로 처리해주어야 합니다.

* 쉬운 방법의 CORS와 preflighted 요청을 이용한 CROS

– 쉬운 방법의 CORS는 다른 도메인에 있는 리소스를 그냥 XmlHttpRequest로 요청하면 됩니다. 그냥… 그렇게 하면 CORS를 지원한느 브라우저가 알아서 부가적으로 ORIGIN이라는 헤더를 붙여서 상대방 도메인의 서버로 요청을 보내고… 그럼 그 서버가 만약에 크로스 도메인을 지원할꺼면.. 응답의 헤더에 Access-Control-Allow-Origin이라는 곳에 요청에 들어온 도메인을 그대로 적어 보내주거나 퍼블릭한 데이터면 *를 적어 보내주면 됩니다.

단순하죠…

그냥 요청하면 -> 브러우저가 ORIGIN 헤더 붙여서 전송… —-> 그럼 처리해줄 서버가 응답에 Access-Control-Allow-Origin 헤더 붙여서 응답.

– preflighted 요청을 사용하는 경우는 다릅니다. 사전답사를 한다고 해야할까. 다른 도메인으로 요청을 보내려고 하면.. 부가적인 헤더 정보를 가지고 먼저 OPTIONS 메서드 요청을 보냅니다. 그럼 서버에서 특정 헤더 정보를 가지고 응답을 해줘야하죠. 그 응답을 가지고 다른 도메인에 요청을 보내도 되는지 확인이 되면… 그때 본래 요청을 보내고 응답을 받게 됩니다.

그냥 요청하면 -> preflighted 요청이 날아감 —-> 서버가 OPTIONS 요청 처리 —-> 본래 요청 날림 —-> 서버가 본래 요청 처리해서 응답.

이때 주고받는 요청/응답 헤더 정보는 세번째 글에 잘 설명이 되어있습니다.