すぐに忘れるので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の設定に関係なく読むことができない。