Flask-CORSの使い方 [備忘録]

すぐに忘れるのでFlask-CORSの設定をまとめます。

基本的な使い方

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

これは全てのアクセス元に対してCORSを許可します。

特定のサイトのみCORS許可したいとき

CORS(app, origins=["https://example.com"])

”example.com” のみCORS設定します。

パスごとに異なるORIGINを許可


app = Flask(__name__)

CORS(app, resources={
    r"/api/*": {
        "origins": ["https://front-site.com"]
    },
    r"/admin/*": {
        "origins": ["https://my-admin.com"]
    }
})

ユーザー用のサービスサイトからは/api。管理者用サイトからは/admin のようにパスごとにORIGINSを変更したいとき。

ユーザーサイトからは管理者画面にリクエストできないので安全性が増します。

その他、実用的なCORS設定

supports_credentials=True

Cookie(JWTやsessionなど)や Authorization ヘッダを含むリクエストを許可したい場合に必須

max-age

fetch()メソッドのプリフライト(OPTIONS)結果をブラウザキャッシュする時間。

CORS(app, max_age=3600)  # 1時間キャッシュ

プリフライトが多いとAPIが重くなるので、キャッシュ時間が長い方がパフォーマンスが改善します。

allow_headers

フロントが送信できるheadersを指定できる

# 例
CORS(app, allow_headers=["Authorization", "X-API-KEY"])

”Content-Type”はJSON送信時に自動で許可されることが多いです。

expose_headers

クライアント側(ブラウザ)で読み取れるレスポンスヘッダを指定。

CORS(app, expose_headers=["X-Total-Count", "X-RateLimit-Remaining"])

指定しなかった場合や、空のリストを渡した場合はデフォルトのレスポンスヘッダ(安全なもの)のみJSで読み取れます。

デフォルトで読み取れるヘッダ

  • Content-Type
  • Cache-Control
  • Last-Modified

cookie認証はJavaScriptから読む必要がないので、この件とは関係なし。

そもそもSet-Cookie情報はブラウザJSで読むことが禁止されているので、expose_headersの設定に関係なく読むことができない。

タイトルとURLをコピーしました