はじめに
ウェブアプリケーションがますます洗練されるにつれて、異なるオリジンまたはドメイン間でリソースを共有する必要が生じることがよくあります。ただし、ユーザーのデータを保護しセキュリティを維持するために、ブラウザは同一オリジンポリシーと呼ばれるポリシーを実装しており、デフォルトではオリジン間でのリソース共有を防止します。そこで、CORS(Cross-Origin Resource Sharing)が登場します。CORSは、開発者が必要な場合にこのデフォルトポリシーを上書きし、異なるオリジン間でリソースを制御された形で共有することを可能にする仕組みです。
FastAPIの文脈では、CORSを適切に設定することは、Webアプリケーションが異なるサービスと安全にインタラクトするために重要です。この記事では、FastAPIでCORSミドルウェアを設定する方法について説明します。テストや開発に適したシンプルな設定から、本番環境向けのより高度な設定までを取り上げます。
CORSミドルウェアの設定
FastAPIは、ウェブパーツにStarletteを使用しており、その中にはミドルウェアシステムが含まれています。CORSは、Starletteに含まれる特定のミドルウェアクラスを介して処理されますが、FastAPIでも利用できます。
使用するには、CORSMiddleware
をインポートし、アプリケーションに追加します。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allows all origins
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
この基本的な設定では、全てのオリジン、メソッド、ヘッダーを許可し、またクレデンシャルも許可しています。
この設定は寛容であり、テストに適していますが、本番アプリケーションではより制限的な設定を行う必要があります。実際のシナリオでは、allow_origins
内の"*"
を、FastAPIアプリケーションと通信を許可するURLのリストに置き換え、allow_methods
とallow_headers
をアプリケーションが正常に機能するために必要な具体的なメソッドとヘッダーに制限することになります。
FastAPIでのCORSの処理
シンプルなCORSの設定
FastAPIでのシンプルなCORSの設定は、全てのオリジン、メソッド、ヘッダーを許可することで実装されます。これは通常、開発中に使用されますが、セキュリティ上の問題から本番環境では推奨されません。
以下は、シンプルなCORSの設定の例です。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allows all origins
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
高度なCORSの設定
本番環境では、より高度なCORSの設定が必要になります。これには、許可されるオリジン、メソッド、ヘッダーのリストを指定する必要があります。
以下は、FastAPIでの高度なCORSの設定の例です。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"http://localhost:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Authorization", "Content-Type"],
)
この例では、指定されたオリジンのみを許可しています。オリジンはorigins
リストに記載されています。また、GET
とPOST
メソッドのみを許可し、Authorization
とContent-Type
ヘッダーのみを許可しています。
特定のオリジンの処理
特定のオリジンを処理する必要がある場合もあります。上記の例のorigins
リストにそれらを追加することで対応できます。ただし、特定のドメインの全てのサブドメインを許可する必要がある場合はどうすればよいでしょうか。
そこで、allow_origin_regex
パラメータが重要になります。このパラメータを使用すると、許可されるオリジンとして正規表現を指定することができます。以下に例を示します。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origin_regex='https?://.*\.example\.com',
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Authorization", "Content-Type"],
)
この例では、アプリケーションは正規表現https?://.*\.example\.com
に一致する任意のオリジンを許可します。これにはexample.com
の任意のサブドメインと、httpまたはhttpsプロトコルが含まれます。