はじめに (対象読者・この記事でわかること)

この記事は、ReactとFastAPIを使ったWebアプリケーション開発に取り組んでいる開発者、特にフロントエンドとバックエンドを連携させる際にCORSエラーに直面している方を対象としています。

この記事を読むことで、CORSエラーの根本原因を理解し、ReactとFastAPIを連携させるための具体的なCORS設定方法を習得できます。ミドルウェアの設定、環境変数の活用、開発環境と本番環境での違いなどを理解し、実際のプロジェクトで即座に適用できるようになります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - JavaScriptとReactの基本的な知識 - PythonとFastAPIの基本的な知識 - HTTP通信の基本的な理解 - CORS(オリジン間リソース共有)の基本的な概念

CORSエラーの原因と背景

CORS(Cross-Origin Resource Sharing)は、Webブラウザが異なるオリジン間でのリソース共有を許可するための仕組みです。Reactで開発したフロントエンドとFastAPIで開発したバックエンドを連携させる際、これらが異なるオリジン(ドメイン、ポート、プロトコルが異なる)で動作する場合、ブラウザの同一オリジンポリシーによりリクエストがブロックされます。

特に開発環境では、Reactアプリケーションがデフォルトで使用するポート(通常3000)とFastAPIが使用するポート(通常8000)が異なるため、CORSエラーが頻繁に発生します。このエラーは、サーバー側からの適切なヘッダー設定によって解決できますが、その仕組みを理解しておくことが重要です。

FastAPIとReactの連携における具体的なCORS設定方法

ステップ1:FastAPI側でのCORS設定

FastAPIでは、fastapi.middleware.corsモジュールを使用してCORSを簡単に設定できます。まずは基本的な設定から見ていきましょう。

Python
from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware app = FastAPI() # CORSミドルウェアの設定 app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:3000"], # Reactアプリのオリジンを許可 allow_credentials=True, allow_methods=["*"], # 全てのHTTPメソッドを許可 allow_headers=["*"], # 全てのHTTPヘッダーを許可 )

この設定により、Reactアプリからのリクエストが許可されます。allow_originsに指定したオリジンからのリクエストのみが許可されるため、他のオリジンからのアクセスは依然としてブロックされます。

ステップ2:環境変数を活用した柔軟な設定

開発環境と本番環境でオリジンが異なる場合、環境変数を使用して動的に設定するのがベストプラクティスです。

Python
import os from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware app = FastAPI() # 環境変数からオリジンを取得、デフォルト値を設定 allowed_origins = os.getenv("ALLOWED_ORIGINS", "http://localhost:3000").split(",") app.add_middleware( CORSMiddleware, allow_origins=allowed_origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )

この方法により、.envファイルで環境ごとに許可するオリジンを簡単に切り替えることができます。

ステップ3:React側でのリクエスト設定

ReactからAPIリクエストを送信する際は、axiosfetchなどのHTTPクライアントを使用します。特に、認証情報(クッキーなど)を含める場合は、withCredentialsオプションを設定する必要があります。

Javascript
// axiosを使用した例 import axios from 'axios'; const apiClient = axios.create({ baseURL: 'http://localhost:8000/api', withCredentials: true, // クッキーを含める場合に必要 }); // APIリクエストの例 const fetchData = async () => { try { const response = await apiClient.get('/items'); console.log(response.data); } catch (error) { console.error('Error fetching data:', error); } };

ステップ4:本番環境でのCORS設定

本番環境では、許可するオリジンを厳格に指定することが重要です。環境変数を使用して、本番環境のドメインを許可リストに追加します。

Python
# 環境変例例(.envファイル) ALLOWED_ORIGINS=https://yourdomain.com,https://www.yourdomain.com

ステップ5:高度なCORS設定

よりセキュアな設定が必要な場合は、以下のようなオプションを活用します。

Python
app.add_middleware( CORSMiddleware, allow_origins=[ "https://yourdomain.com", "https://www.yourdomain.com", "http://localhost:3000", ], allow_credentials=True, allow_methods=["GET", "POST", "PUT", "DELETE"], # 必要なメソッドのみ許可 allow_headers=["Content-Type", "Authorization"], # 必要なヘッダーのみ許可 expose_headers=["*"], # クライアントに公開するヘッダー max_age=600, # プリフライトリクエストのキャッシュ時間(秒) )

ハマった点やエラー解決

  1. サブドメインを含む複数のオリジンを許可する場合 ワイルドカード(*)を使用すると、サブドメインを含む全てのオリジンが許可されますが、セキュリティ上のリスクがあります。特定のオリジンを明示的に指定するのが安全です。

  2. 認証情報を含むリクエストが失敗する allow_credentialsTrueに設定していない場合、クッキーや認証情報を含むリクエストがブロックされます。また、allow_origins"*"を指定している場合、allow_credentialsFalseにする必要があります。

  3. プリフライトリクエスト(OPTIONSメソッド)の対応不足 FastAPIは自動的にプリフライトリクエストに対応していますが、カスタムヘッダーやメソッドを使用する場合は、allow_methodsallow_headersに明示的に指定する必要があります。

解決策

これらの問題を解決するためのベストプラクティス:

  1. 開発環境と本番環境で設定を切り替える ```python import os

if os.getenv("ENVIRONMENT") == "production": allowed_origins = ["https://yourdomain.com", "https://www.yourdomain.com"] else: allowed_origins = ["http://localhost:3000"] ```

  1. 認証情報を含むリクエストに対応する python app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:3000"], # "*"は使用不可 allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )

  2. カスタムヘッダーやメソッドを使用する場合 python app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:3000"], allow_credentials=True, allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], allow_headers=["Content-Type", "Authorization", "X-Custom-Header"], )

  3. Nginxなどのリバースプロキシを使用する場合 セキュリティ上の理由から、CORS設定はアプリケーションサーバーではなくリバースプロキシ側で行うこともあります。

まとめ

本記事では、ReactとFastAPIを連携させる際のCORSエラーの原因と解決方法を具体的なコード例と共に解説しました。CORS設定はWebアプリケーションのセキュリティに直結する重要な要素ですので、環境ごとに適切な設定を行うことが重要です。

  • CORSエラーはブラウザの同一オリジンポリシーによるもの
  • FastAPIではCORSMiddlewareを使用して簡単に設定可能
  • 環境変数を活用して開発環境と本番環境で柔軟に設定を切り替える
  • 認証情報を含むリクエストには特別な設定が必要

この記事で学んだ知識を活用して、スムーズにフロントエンドとバックエンドの連携を実現してください。今後は、認証機能との連携やパフォーマンス最適化についても記事にする予定です。

参考資料