본문 바로가기
frontend (React) 개발

CORS (Cross-Origin Resource Sharing) 란?

by 꼰대코더 2025. 1. 23.

 

기본적으로 웹브라우저는 시큐리티상 다른 Origin(도메인, 프로토콜, 포트) 리소스에의 액세스를 불허한다. 주로 아래와 같은 효과가 있다.

 

1. API 주소만 안다고 하면 아무렇게나 액세스하여 데이터를 훔쳐갈 수 있는데 이를 방지하는 효과.

2. CSRF(Cross-Site Request Forgeries) 를 방지하는데 예를 들면 사용자가 특정 사이트에 로그인 상태에서 스팸메일의 악성 링크를 클릭하면 로그인 세션으로 API 에 접근하여 원치 않는 결과를 초래 할 수 있다.

 

위의 예에서는 웹 페이지는 example.com 으로 부터 발행되서 그 안에서 api.example.com/func 을 액세스하고 있지만 엄격히 말해 서브도메인도 별도의 도메인으로 취급되므로 아래와 같은 에러가 발생하게 된다.

 각각 다른 Address를 사용하는 Frontend(React) 와 Backend(Flask) 를 분리해서 개발하는 환경에서 CORS 는 골치아픈 일이 된다.

 

 Flask CORS 대응

pip install flask-cors

 

1. 전체 Origin을 허용하자고 하는 경우

GET method 의 경우

@app.route("/", methods=["GET"])
def get_example():
    """GET in server"""
    response = jsonify(message="Simple server is running")

    # Enable Access-Control-Allow-Origin
    response.headers.add("Access-Control-Allow-Origin", "*")
    return response

 

POST, PUT, DELETE method 의 경우

@app.route("/", methods=["POST"])
@cross_origin()
def post_example():
    """POST in server"""
    return jsonify(message="POST request returned")

 

또는 일괄적으로

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(
    app,
    supports_credentials=True

 

2. 특정 api 만 전체 Origin을 허용하는 경우

"/api/" 로 시작하는 패스는 허용

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

@app.route("/api/v1/users")
def list_users():
  return "user example"

 

3. 특정 도메인만 허용하는 경우 (white list)

CORS(app, origins=['http://allowed-domain1.com', 'http://allowed-domain2.com'])