カテゴリ: Flask 更新日: 2025/12/07

Flask×フロントエンドのCORS対応を学ぼう!初心者でもわかる安全な設定方法

Flask×フロントのCORS対応を学ぼう!セキュアな設定方法
Flask×フロントのCORS対応を学ぼう!セキュアな設定方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Flaskで作ったAPIをフロントエンドのHTMLやJavaScriptから呼び出そうとしたら、『CORSエラー』って出て通信できないんですけど、どうすればいいんですか?」

先生

「それは“クロスオリジン通信”に関するエラーですね。ブラウザが安全のために、別のドメインやポート番号からの通信を制限しているんです。Flaskでも設定を変えれば解決できますよ。」

生徒

「クロスオリジンってなんですか?難しそうです…。」

先生

「大丈夫、ゆっくり説明していきますね。CORSの仕組みとFlaskでの設定方法を順番に学んでいきましょう!」

1. CORSとは?初心者にもわかるクロスオリジンの意味

1. CORSとは?初心者にもわかるクロスオリジンの意味
1. CORSとは?初心者にもわかるクロスオリジンの意味

CORS(コース)とは「Cross-Origin Resource Sharing(クロス・オリジン・リソース・シェアリング)」の略で、異なるオリジン(つまりドメイン・プロトコル・ポート)間でのデータのやり取りを制御する仕組みです。

例えば、次のような場合は「オリジンが違う」と判断されます。

  • http://localhost:5000(Flaskサーバー)
  • http://127.0.0.1:3000(フロントエンド開発環境)

ブラウザはセキュリティ上の理由で、別のオリジンからAPIを呼び出すときに制限をかけます。これがCORSエラーの正体です。つまり「安全のために通信をブロックしている」ということなんです。

この制限を正しく緩めて、安全に通信できるようにするのが「CORS対応」です。

2. CORSエラーが起きる例を見てみよう

2. CORSエラーが起きる例を見てみよう
2. CORSエラーが起きる例を見てみよう

FlaskでAPIを作り、別のHTMLファイルからJavaScriptで呼び出すと、次のようなエラーが出ることがあります。


Access to fetch at 'http://localhost:5000/data' from origin 'http://127.0.0.1:3000' has been blocked by CORS policy

これは「CORSポリシー(CORSの規則)」によって通信がブロックされたという意味です。ブラウザがサーバーに「このサイトからアクセスしてもいい?」と事前に問い合わせをしますが、Flask側がそれを許可していないため、通信が止められてしまいます。

3. FlaskでCORSを有効にするには?

3. FlaskでCORSを有効にするには?
3. FlaskでCORSを有効にするには?

Flaskでは、Flask-CORSという拡張機能を使えば簡単にCORSを有効化できます。まずはインストールしましょう。


pip install flask-cors

次に、Flaskアプリに組み込みます。


from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)  # これで全てのオリジンからのアクセスを許可

@app.route('/data')
def get_data():
    return jsonify({"message": "CORS対応済みAPIです!"})

if __name__ == '__main__':
    app.run(debug=True)

このようにCORS(app)を1行書くだけで、他のドメインやポートからのアクセスができるようになります。これでフロントエンドのJavaScriptからAPIを呼び出してもエラーになりません。

4. JavaScriptでFlask APIを呼び出してみよう

4. JavaScriptでFlask APIを呼び出してみよう
4. JavaScriptでFlask APIを呼び出してみよう

次のようにフロントエンドからFetch APIを使ってFlaskのデータを取得してみましょう。


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Flask CORSテスト</title>
</head>
<body class="container p-4">
    <h2>Flask CORS通信テスト</h2>
    <button id="btn" class="btn btn-primary">データ取得</button>
    <p id="result" class="mt-3"></p>

    <script>
        document.getElementById("btn").addEventListener("click", async () => {
            const res = await fetch("http://localhost:5000/data");
            const data = await res.json();
            document.getElementById("result").textContent = data.message;
        });
    </script>
</body>
</html>

ボタンを押すと、Flaskから「CORS対応済みAPIです!」というメッセージが表示されます。これでFlaskとフロントエンドのCORS通信が成功です。

5. セキュアなCORS設定をしよう(安全対策)

5. セキュアなCORS設定をしよう(安全対策)
5. セキュアなCORS設定をしよう(安全対策)

しかし、CORS(app)だけでは「すべてのオリジンを許可する」設定になるため、安全ではありません。本番環境では、許可するオリジンを限定する必要があります。


CORS(app, resources={r"/*": {"origins": ["https://example.com", "https://myapp.com"]}})

このようにして、特定のサイト(例:自分のWebアプリ)からのアクセスだけを許可できます。

さらに、CORS設定には次のようなオプションもあります。

  • supports_credentials=True:クッキー(ログイン情報)を含める場合に必要
  • methods:許可するHTTPメソッド(GET、POSTなど)を制限
  • max_age:ブラウザがCORS情報をキャッシュする時間

CORS(app, resources={
    r"/api/*": {
        "origins": ["https://myfrontend.com"],
        "methods": ["GET", "POST"],
        "supports_credentials": True
    }
})

このように細かく設定することで、不要なアクセスを防ぎ、安全にCORSを使うことができます。

6. CORSエラーを防ぐためのポイント

6. CORSエラーを防ぐためのポイント
6. CORSエラーを防ぐためのポイント

最後に、CORSでよくあるトラブルを防ぐためのポイントをまとめておきましょう。

  • 必ずFlask側にFlask-CORSを設定する。
  • 本番環境ではオリジンを限定する。
  • クッキーを使う場合はsupports_credentials=Trueを忘れない。
  • フロントエンドとバックエンドのURL(http/https、ポート番号)を確認する。

これらを意識することで、CORSエラーを未然に防ぎ、Flaskとフロントエンドの通信をスムーズかつ安全に行うことができます。

カテゴリの一覧へ
新着記事
New1
Django
Djangoプロジェクトのディレクトリ構造を完全解説!初心者でも迷わないフォルダの見方
New2
Flask
Flask×Flask-SocketIOでチャットアプリを作る流れを初心者向けにやさしく解説
New3
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
New4
Flask
Flask-WTFでファイルアップロードフォームを完全ガイド!初心者でもわかる画像やPDFのアップロード方法
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.5
Java&Spring記事人気No5
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.8
Java&Spring記事人気No8
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説