Traffine I/O

日本語

2022-07-06

FastAPIでのCORSの設定

はじめに

ウェブアプリケーションがますます洗練されるにつれて、異なるオリジンまたはドメイン間でリソースを共有する必要が生じることがよくあります。ただし、ユーザーのデータを保護しセキュリティを維持するために、ブラウザは同一オリジンポリシーと呼ばれるポリシーを実装しており、デフォルトではオリジン間でのリソース共有を防止します。そこで、CORS(Cross-Origin Resource Sharing)が登場します。CORSは、開発者が必要な場合にこのデフォルトポリシーを上書きし、異なるオリジン間でリソースを制御された形で共有することを可能にする仕組みです。

FastAPIの文脈では、CORSを適切に設定することは、Webアプリケーションが異なるサービスと安全にインタラクトするために重要です。この記事では、FastAPIでCORSミドルウェアを設定する方法について説明します。テストや開発に適したシンプルな設定から、本番環境向けのより高度な設定までを取り上げます。

CORSミドルウェアの設定

FastAPIは、ウェブパーツにStarletteを使用しており、その中にはミドルウェアシステムが含まれています。CORSは、Starletteに含まれる特定のミドルウェアクラスを介して処理されますが、FastAPIでも利用できます。

使用するには、CORSMiddlewareをインポートし、アプリケーションに追加します。

python
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_methodsallow_headersをアプリケーションが正常に機能するために必要な具体的なメソッドとヘッダーに制限することになります。

FastAPIでのCORSの処理

シンプルなCORSの設定

FastAPIでのシンプルなCORSの設定は、全てのオリジン、メソッド、ヘッダーを許可することで実装されます。これは通常、開発中に使用されますが、セキュリティ上の問題から本番環境では推奨されません。

以下は、シンプルなCORSの設定の例です。

python
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の設定の例です。

python
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リストに記載されています。また、GETPOSTメソッドのみを許可し、AuthorizationContent-Typeヘッダーのみを許可しています。

特定のオリジンの処理

特定のオリジンを処理する必要がある場合もあります。上記の例のoriginsリストにそれらを追加することで対応できます。ただし、特定のドメインの全てのサブドメインを許可する必要がある場合はどうすればよいでしょうか。

そこで、allow_origin_regexパラメータが重要になります。このパラメータを使用すると、許可されるオリジンとして正規表現を指定することができます。以下に例を示します。

python
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プロトコルが含まれます。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!