본문 바로가기

# Development/Flask

[Flask] CORS (Cross-Origin Resource Sharing) 설정

CORS (Cross-Origin Resource Sharing) 설정

CORS란?

CORS는 보안상의 이유로 필요한 경우에만 서버와 협의하여 데이터를 요청할 수 있도록하는 장치이다.

CORS를 알기 위해서는 우선 Origin이 무엇인지 이해가 필요하다.

Origin (출처)

우리가 특정 사이트를 접속을 위해 사용하는 URL은 아래의 그림과 같은 요소로 구성되어 있다.

각 구성요소는 다음의 특징을 가진다.

  • Protocol(Scheme) : http, https
  • Host : 사이트 도메인
  • Port : 포트 번호
  • Path : 사이트 내부 경로
  • Query string : 요청의 key와 value값
  • Fragment : 해시 태크

CORS에서 얘기하는 Origin은 위의 URL 구성 요소 중 _Protocol + Host + Port_를 말한다.

Same-Origin, Cross-Origin 정책

Same-Origin은  Protocol, Host, Port이 모두 동일한 경우, Cross-Origin은 Protocol, Host, Port 중 한가지라도 다른 경우를 말한다.

 

웹에서 동일 출처(Same-Origin) 서버에 있는 리소스는 자유로이 가져올수 있지만, 다른 출처(Cross-Origin) 서버에 있는 이 리소스는 상호작용이 불가능하다. 브라우저에서는 보안의 이유로 cross-origin HTTP 요청들을 제한하기 때문이다. 모든 곳에서 데이터를 요청할 수 있게 되면, 악의적으로 정보를 추출하거나 사용자의 정보를 탈취할 수 있다.

CORS

그렇기 때문에 Cross-Origin 요청을 하기 위해서는 별도의 서버 동의가 필요하다. CORS(Cross-Origin Resource Sharing)는 HTTP_header를 사용해서 Cross-Origin에 대한 허락을 구하고 거절하는 매커니즘이다.


Flask CORS 설정방법

 Flask에서 CORS를 설정하는 방법은 전역 환경과, 블루프린트 두가지로 나뉜다. 블루프린트에 pre_fixed_url이 있는경우 다음의 방법을 통해 등록해 줄 수 있다.

General

from flask import Flask, session
from flask_cors import CORS

app = Flask(__name__)

cors = CORS(app, resources={
            r"/api/*": {"origins": "*"},
            r"test/api/*": {"origins": [
                                # 로컬
                                "http://localhost:8080",
                                "http://localhost:8081",
                                ]
                            }
                        }

BluePrint

from flask import Flask, session
from flask_cors import CORS

api_v1 = Blueprint('API_v1', __name__)

CORS(api_v1) # enable CORS on the API_v1 blue print

@api_v1.route("/api/v1/users/")
def list_users():
	...

 

 

<참고>