CORS(Cross-Origin Resource Sharing)は、異なるオリジン間での HTTP リクエストを制御する仕組みである。Flask で API を公開する際、フロントエンドが別ドメインから呼び出す場合は CORS の設定が必要になる。
CORS とは
ブラウザはセキュリティ上、異なるオリジンへのリクエストを制限している。たとえば http://frontend.example.com から http://api.example.com への Ajax リクエストは、API 側が明示的に許可しないとブラウザにブロックされる。
Flask-CORS のインストール
pip install flask-cors
基本的な使い方
すべてのルートで CORS を有効にするには、以下のように設定する。
from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app)
これですべてのオリジンからのリクエストが許可される。
特定のオリジンのみ許可
本番環境では許可するオリジンを限定すべきである。
CORS(app, origins=['https://frontend.example.com'])
複数のオリジンを許可する場合はリストで指定する。
特定のルートのみに適用
デコレータを使えば、個別のルートに CORS を設定できる。
from flask_cors import cross_origin @app.route('/api/data') @cross_origin(origins=['https://frontend.example.com']) def get_data(): return {'data': 'value'}
詳細なオプション
CORS(app, origins=['https://frontend.example.com'], methods=['GET', 'POST', 'PUT', 'DELETE'], allow_headers=['Content-Type', 'Authorization'], supports_credentials=True)
| origins | 許可するオリジン |
| methods | 許可する HTTP メソッド |
| allow_headers | 許可するリクエストヘッダー |
| supports_credentials | Cookie や認証情報の送信を許可 |
Blueprint への適用
Blueprint 単位で CORS を設定することもできる。
from flask import Blueprint from flask_cors import CORS api_bp = Blueprint('api', __name__) CORS(api_bp, origins=['https://frontend.example.com'])
セキュリティ上の注意
origins='*' ですべてのオリジンを許可するのは、パブリック API 以外では避けるべきである。特に supports_credentials=True と組み合わせると、セキュリティリスクが高まる。許可するオリジンは必要最小限に絞ること。