Knowledge Map

Flask내의 CORS 본문

PYTHON/Flask

Flask내의 CORS

2016. 4. 12. 21:16

이런 코드가 있다.

from flask.ext.cors import CORS


CORS 가 무엇일까? ==> CORS ( Cross Origin Resource Sharing) 이다.


CORS (Cross-Origin Resource Sharing) : Request를 받는 서버와 Data를 제공하는 서버가 분리되어있는 경우, Domain이 다른 웹서비스가 Ajax로 데이터를 요청할 수 있는 경우가 생기는데 이것을 따로 컨트롤 해주어야 한다고 한다. (http://zzagu.com/?p=56)


이것은 크로스 도메인 이슈를 해결하기 위한 방법이라고 한다.

자바에서는 xml 설정을 통해서 크로스 도메인 이슈를 해결한다.


http://ooz.co.kr/232  <= 이런 식으로


Flask에서는 CORS라는 모듈을 받은 다음에 그걸 연결하고 적용할 URI을 지정하는 방식으로 처리한다.


1
CORS(app, resources=r'/사이트 이름 또는 원하는 것/api/*', headers={'Content-Type''token''If-Modified-Since''Cache-Control''Pragma'})
cs


대충 이런 식으로..

자세한 사항은

https://media.readthedocs.org/pdf/flask-cors/2.1.0/flask-cors.pdf <=를 참조한다. 공식 문서인듯 영어임.



============================= 수정사항 =======================

동료한테 물어봤더니 플라스크에서 처리해준게 아니라고 한다.

크로스 도메인 이슈는 서로 다른 도메인에서 생기는 문제이며 보통 맨처음 주소 글자가 하나라도 다름으로서 생기는 문제이다.

지금 하고 있는 프로젝트에서는 첫 주소 글자가 서로 동일하다.


하지만 그렇다고 해서 안생기는 것은 아니다.

그것을 막기 위해서 Angular에서 따로 api관련된 js 파일을 만들어 주고 그것을 서버와 연결해주는 파일에 연결을 해준다.

그래서 뷰단에서 일어나는 모든 처리들에 대해서 그 api관련 js 파일을 거치도록 만들고 그 거치는 과정에서

미리 지정되어 있는 api 서버 주소를 같이 보내게끔 해서 해당 api 주소를 막지 않고 접속할수 있게끔 처리했다고 한다.







크로스 도메인 이슈에 대한 글들


웹 사이트 개발 시, 주요한 이슈중의 하나를 꼽자면 크로스 도메인(Cross Domain)이 있습니다.

 

최근 대부분의 웹 브라우저는 Javascript(JQuery)를 이용하여 AJAX 등을 통해서 다른 도메인의 서버의 URL 을 호출하여 데이터를 가져오는 경우, 보안 문제를 발생시킵니다.

 

만약 우리 웹 서비스에서만 사용하기 위해 다른 서브 도메인을 가진 API 함수를 제공하는 API 서버를 구축하였는데, 다른 웹 서비스에서 이 API 서버에 접근하여 마음대로 API를 호출하여 사용한다면 문제가 되겠죠.

 

그래서 Javascript 는 동일 출처 정책(Same Origin Policy) 라는 정책을 두어 다른 도메인의 서버에 요청하는 것을 보안 문제로 간주하고 이를 차단합니다. 즉, Javascript는 자신이 속한 동일한 도메인 내에서만 서버 요청을 허용하고, 처리해주겠다는 것인데요. 이것은 www.ozit.co.kr 도메인에서 호출된 AJAX는www.ozit.co.kr 도메인 내에 있는 URL만을 호출할 수 있다는 의미입니다. 다시말하면 www.ozit.co.kr 도메인에서 www.tistory.com 의 URL을 AJAX로 호출할 수 없다는 의미이죠.

 

이를 다른 말로는 샌드박스(Sandbox)라고도 합니다. 샌드박스는 보호된 영역 안에서만 프로그램을 동작시킬 수 있도록 하며, 외부에 의해 영향을 받지 않도록 하는 모델을 말하는데요. 이 말뜻은 단어에서 유추할 수 있듯이 어린아이들이 뛰어놀 때, 다치지 않고, 그 안에서만 놀 수 있도록 만든 '모래 놀이통'에서 왔습니다.

 

그런데, 하나의 도메인을 가진 웹 서버에서 모든 처리를 하기에는 효율성이나 성능 등 여러 문제로 각 기능별도 여러 서버를 두는 경우가 많은데요. (API 서버, WAS 서버, 파일(이미지) 서버 등등)

물리적으로 분리된 서버이고, 다른 용도로 구축된 서버이니, 당연히 각각 다른 도메인을 가진 서버들일 텐데, 서로간에 AJAX 통신을 할 수 없는 것일까요? 즉, 서로 다른 도메인간의 호출을 의미하는 크로스 도메인 문제를 해결할 수는 없는 것일까요?

(물리적으로 동일한 서버에서도 여러 도메인을 사용할 수 있는데, 이 때에도 동일하게 크로스 도메인 이슈는 발생합니다. 크로스 도메인은 물리적인 서버나 환경의 이슈가 아닌 도메인 이름 자체의 이슈입니다.)

 

참고로 아래에서 설명드릴 방식은 서버측에서 크로스 도메인을 허용하여 문제를 해결하는 방식인데, 서버의 수정 없이 클라이언트 단에서 이를 해결하는 방법 또한 있습니다. 하지만 100% 해결은 불가능합니다. jsonp, document.domain 값 설정, 크롬 브라우저의 특수 옵션 사용 등 몇몇 방법이 있으나, 범용적인 웹 서비스에서 사용이 어렵거나(사용자가 직접 세팅해야 한다거나), 그 기능이 제한적인 경우가 대부분입니다. 실제 서버에서 해결해주는 것이 표준화된 방법이고, 100% 해결 가능한 방법입니다.

 

 

아래는 크로스 도메인 문제가 발생하면 뜨는 오류 메시지입니다.

 

 

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

 

출처 : http://ooz.co.kr/232



- crossdomain 이슈사항 정리 -
1. 전제조건 
- 조건 1: 내가 보고 있는 페이지의 주소는 http://www.aaa.com 이다.
- 조건 2: http://www.aaa.com의 페이지가 http://www.bbb.com의 rest api 를 호출하여 데이터를 JSON으로 가져오려고 한다.

2. 결론
 조건 1의 내가 이용하는 페이지의 주소의 도메인과 조건 2의 데이터를 가지고 오기위한 서버의 도메인이 서로 상이할 경우 crossdomain이라고 부른다. 이러한 crossdomain은 서버 공격 및 보안 취약성을 갖게 되므로 서로 신뢰할 수 있는 경우에만 이를 허용하는 서비스를 구축하는 것이 일반적이다.

출처 : http://igna.tistory.com/19




물론 가장 좋은건 MDN을 참고하는 것이다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Access_control_CORS




Comments