第五章:フロントエンドの宿敵 - CORS クロスオリジン制限を分かりやすく解析して解決する

これは世界中の無数の新人フロントエンドエンジニアが経験する悲劇的なストーリーです。

前章で完璧に Axios API 呼び出しコードを書き上げ、Vite フロントエンドサーバー(localhost:5173 で動作)が FastAPI バックエンドサーバー(localhost:8000 で動作)に最新の打刻データをリクエストする準備が整いました。 あなたは期待に胸を膨らませてブラウザを開き、美しい Data Table が実際のデータで埋まるのを楽しみにしています。 しかし、画面には永遠に「📡 サーバーからデータ取得中...」が表示されたままか、あるいは真っ赤な「❌ 打刻記録を取得できませんでした」が表示されます。

慌ててキーボードの F12 を押して開発者ツールの Console を開くと、恐ろしいほどの赤い文字列が目に飛び込んできます: Access to XMLHttpRequest at 'http://localhost:8000/api/punches' from origin 'http://localhost:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

おめでとうございます!あなたはフロントエンドエンジニアとしてのキャリアで最も重要な通過儀礼を経験しました:CORS(クロスオリジンリソースシェアリング)ポリシーによって門前払いを食らったのです

🎯 本章の目標

  1. 最も分かりやすい比喩で、CORSとは何か?なぜブラウザがこんなに冷酷にブロックするのかを理解する
  2. 概念を明確化:CORSエラーはフロントエンドのコードミスか、それともバックエンドの設定不足か?
  3. 赤いエラーメッセージをAIに貼り付けて瞬時に解決する方法を学ぶ
  4. FastAPIバックエンドでCORSミドルウェアを正しく設定し、安全な許可リストメカニズムを構築する

🛡️ CORSクロスオリジン制限とは?(なぜこんな仕組みがあるのか?)

多くの新人は憤慨します:「この2つのサーバーはどちらも私のPC内にあるのに!なぜ通信できないの?」 実はこれはあなたのせいではなく、ブラウザ(Chrome/Safari)のセキュリティ保護メカニズムなのです。この仕組みは 同一オリジンポリシー(Same-Origin Policy) と呼ばれています。

極めて危険なシナリオを想像してみてください: あなたが朝、あるネット銀行(secure-bank.com)にログインし、ブラウザには銀行のログイン認証情報(Cookie)が保存されています。 午後、あなたは誤ってある掲示板の悪意あるフィッシングサイト(evil-hacker.com)を開いてしまいました。 この悪意あるサイトにはJavaScriptコードが仕込まれており、バックグラウンドで銀行のURL(secure-bank.com/api/transfer)に「ハッカーに100万円を振り込む」というAPIリクエストを送信します。 CORSがなければ、あなたのブラウザにはすでに銀行のログイン認証情報があるため、この振込は実際に成功してしまいます!あなたは破産です!

この脆弱性を解決するため、ブラウザは鉄のルールを定めました: 「リクエストを送信するウェブサイトのURL(localhost:5173)と、リクエストを受信するサーバーのURL(localhost:8000)が、ドメイン(Domain)またはポート(Port)で異なる場合、これは『クロスオリジン(Cross-Origin)』と見なされる」 クロスオリジンのAPIリクエストに対して、ブラウザは非常にうるさく通過をブロックします!

ただし...リクエストを受信するバックエンドサーバー(FastAPI)がブラウザに大声で「問題ないよ、localhost:5173は我が社の仲間だ、彼にデータを渡すことを許可する!」と伝えられれば別です。

これがCORSを解決する最も核心的な原理です:解決策は決してフロントエンドにはありません!バックエンドサーバーで「許可リスト(Allow Origins)」を設定し、フロントエンドに権限を開放する必要があります!


🚀 実践:エラーをAIに貼り付け、バックエンドに許可リストを追加する

解決策がバックエンドにあると分かったので、Reactの中で無駄に忙しくする必要はありません。 FastAPIでCORSを設定する複雑な構文を暗記する必要もなく、ブラウザで見た赤いエラーメッセージをコピーして、AIに問題を投げるだけです!

🔥【Vibe Prompt 実践呪文】 私のフロントエンドはVite + Reactで、http://localhost:5173 で動作しています。 バックエンドはFastAPIで、http://localhost:8000 で動作しています。 フロントエンドがAPIを呼び出すと、ブラウザにこのエラーが表示されます: [blocked by CORS policyの赤いエラーメッセージを貼り付け]

これはFastAPIバックエンドで解決する必要があると理解しています。 FastAPIに追加する必要があるCORSMiddlewareのコードを教えてください。 localhost:5173を含む許可オリジン(allow_origins)と、将来デプロイする可能性のあるVercelのURL形式も設定してください。

AIはすぐにあなたの苦悩を理解し、適切な解決策を提供してくれます。FastAPIプロジェクトに戻り、main.pyを開き、以下のコードをapp = FastAPI()の直下に貼り付けましょう:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# 📝 許可リスト設定:どのURLからデータを取得することを許可するか?
origins = [
    "http://localhost:5173",           # ローカル開発用のViteフロントエンド
    "http://127.0.0.1:5173",           # ViteがこのIPを使用する場合もある
    "https://my-line-punch.vercel.app" # 将来クラウドにデプロイするフロントエンドURL
]

# 🛡️ FastAPIの入り口にCORS警備員(Middleware)を配置
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,     # 許可リストを警備員に渡す
    allow_credentials=True,    # フロントエンドが認証情報(Cookie/Tokenなど)を持ち込むことを許可するか?
    allow_methods=["*"],       # GET, POST, PUT, DELETEを許可するか?("*"は全て許可を意味)
    allow_headers=["*"],       # カスタムヘッダー(Authorizationなど)を許可するか?
)

貼り付けて保存すると、FastAPIは自動的に再読み込み(Reload)します。 さあ、Viteフロントエンドのページに戻り、大胆にキーボードのF5を押して更新しましょう。 魔法のようなことが起こります!赤いエラーは跡形もなく消え、あなたが書いたloadingのスピナーが止まった後、Supabaseデータベースの実際の打刻記録が、Data Tableを完璧に埋め尽くします!


💼 [ビジネス応用シナリオ] なぜallow_origins=["*"]を使ってはいけないのか?

多くの初心者がネットでチュートリアルを探すと、allow_origins=["*"](全世界のウェブサイトからのデータ取得を許可)を設定する方法を見つけます。 大学の期末レポートだけなら、これが最も早く、決してエラーになりません。

しかし、企業クライアント向けにビジネスシステムを構築する場合、これは災害レベルのセキュリティホールです。 これは、どんなハッカーや競合他社でも、あなたのAPIを呼び出すウェブページを書けば、会社の従業員リストや給与データを簡単に取得できることを意味し、ブラウザは全くブロックしません。

これがVibe Codingが提唱する考え方です:AIを使って素早くコードを書く���とはできますが、「このコードのビジネスリスクがどこにあるのか」を知る必要があります。厳格な「ドメイン許可リスト」を使用することこそが、あなたとクライアントの資産を保護し、シニアエンジニアの価値所在でもあります。

✅ 本章のまとめ

この章は非常に重要です!今後10年間の開発キャリアにおいて、どんなサービスを接続する際にも、Consoleにblocked by CORS policyという文字を見かけたら、 すぐに反射的に自分に言い聞かせてください:「これは私のフロントエンドのコードミスではない!バックエンドの許可リストに私のURLが追加されていないだけだ!

フロントエンド最大の障害を乗り越えたことを祝福します。次に、実際のデータを手に入れた後、テキストだけのテーブルは少し退屈です。 次の章では、データ可視化の世界に飛び込み、AIを使って上司の目を輝かせる「美しいインタラクティブなチャート」を瞬間的に作成する方法を教えます!

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!