스프링 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 요청 처리 —-> 본래 요청 날림 —-> 서버가 본래 요청 처리해서 응답.

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

[Ruby] BoR 2장 예제

이번에는 루비에서 게터 세터를 편하게 만들 수 있도록 해주는 키워드를 살펴봤고.

@@두개를 사용해서 변수를 선언하면 클래스 스코프 변수가 된다.

상수를 만들 땐 대문자로 시작하는 변수를 만들면 되고.

파셜 클래스 기능이 있어서 기존 클래스에 새로운 메서드를 추가하는 것도 가능하다.

1.9부터는 최상위 클래스가 BasicObject다. 1.8까지는 Object였다.

[Ruby] BoR 1장 예제

  • “” 안에서 사용할 수 있는 #{} 이거 정말 편한것 같다.
  • 지금까지 본 변수 스코프는 세개… $, @, 아무것도 없는 로컬 변수.
  • 클래스와 객체 만드는 방법.
  • 게터 세터 만들기 귀찮다. 아무래도 루비 전용 IDE를 써야겠다.
  • p(객체) == 객체.inspect
  • 괄호()를 없애는게 좋은가.. 매번 써주는게 좋은가.. 모르겠다. 루비 코더는 어떻게 쓰나?

일단 이정도. 2장에선 본격적으로 다형성을 다루려는듯.

아참 지금 내가 보고 있는책은 The Book of Ruby라는 책임. 설명이 쉽고 재밌어보여서.. 라기보다 그냥 여러 책 중에서 대충 골랐다. 읽어보니까 잘 읽히길래 계속 보기로…

Mac OSX에 Ruby 1.9.3 설치하기

왜이렇게 힘들지? 기본으로 1.8 버전이 설치되어 있는데 최신 버전으로 설치하려고 홈페이지를 찾았갔다.

http://www.ruby-lang.org/en/downloads/

여러가지 방법이 있는데 제일 위에 RVM을 이용해보래. 나도 그래볼까하고 rvm을 설치하는데까지는 성공.

https://rvm.beginrescueend.com/rvm/install/

그런데 이 뒤부터 도무지 진행이 안 되네. rvm을 설치하고 나면 OSX에 기본으로 깔려이는 루비말고 RVM으로 설치한 루비를 기본으로 사용할 수 있도록 하는 명령어 설명이 나온다.

rvm requirements

라고 입력하면 자세히 설명해 주는데… 거기서 첫번째 명령어가 rvm install 1.8.7 이었나. 아무튼 그걸 설치하다가 ./configure에서 에러가 났다고 에러 로그를 확인하란다.

확인해보니까 OSX에 gcc가 없어서 ./configure를 못했데.. 이건 보통 XCode를 설치하면 깔리는걸로 알고 있는데.. XCode가 깔려있는데도 이런 에러가 나니까 황당하네… 그래서 XCode를 실행해봤는데 설치가 뭔가 잘못됐는지 실행하다가 자꾸 죽어.. 그래서 다시 설치했는데 꽤 오래 걸리데… 1.3기가니깐;;

아무튼 다시 설치하고 나서도 설치를 진행하는데 안 돼~ 도무지 안 돼~… 그래서 작전을 바꿈. RVM 꺼져…

Homebrew를 쓰기로 결정.

https://github.com/mxcl/homebrew/wiki/installation

brew를 설치하는건 간단히 한줄로 끝.

/usr/bin/ruby -e “$(curl -fsSL https://raw.github.com/gist/323731)”

그런 다음 루비 설치도 한 줄로 끝

brew install ruby

버전을 명시하는 부분이 없어서 좀 불안했는데 다행히 최신 버전으로 설치해주네.. 오호. 귿.

설치된 루비를 Path에 추가해주고 설치 끝.

오늘은 설치까지만… 원래 30분만 할려고 그랬는데 고작 설치하는데만 이게 몇시간이야;; 아이고.. @_@;;