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

FlaskとJWTの連携をさらに強化!初心者でもわかる実践的な活用例とセキュリティ設計

FlaskとJWTの連携をさらに強化する実践的な活用例
FlaskとJWTの連携をさらに強化する実践的な活用例

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

生徒

「先生、Flaskでログイン機能を作ったときに、JWTっていうのを使うと便利って聞いたんですけど、それって何ですか?」

先生

「JWTは『JSON Web Token(ジェイソン・ウェブ・トークン)』の略で、ユーザーの認証情報を安全にやり取りするための仕組みなんです。最近のWebアプリやAPIでとてもよく使われていますよ。」

生徒

「Flaskでも使えるんですか?難しそうに聞こえますけど…」

先生

「Flaskでも簡単に使えます!今日はFlaskとJWTを連携させて、より実践的な使い方をわかりやすく解説していきましょう。」

1. JWT(JSON Web Token)とは?

1. JWT(JSON Web Token)とは?
1. JWT(JSON Web Token)とは?

JWT(ジェイソン・ウェブ・トークン)は、ユーザーのログイン状態を安全に保持するための「デジタルなカギ」のようなものです。たとえば、あなたがWebアプリにログインすると、その情報をサーバーが「署名付きのトークン」にして発行します。このトークンをブラウザやアプリ側に保存し、次のアクセス時に一緒に送ることで、「この人はログイン済みです」と確認できます。

JWTは3つの部分からできています。

  • ヘッダー(Header):どんな方式で暗号化しているかを示す部分
  • ペイロード(Payload):ユーザー情報などのデータ部分
  • 署名(Signature):データ改ざんを防ぐためのチェック部分

この3つを組み合わせた文字列をトークンとして使います。例えばこんな形です。


    xxxxx.yyyyy.zzzzz

2. FlaskでJWTを使うための準備

2. FlaskでJWTを使うための準備
2. FlaskでJWTを使うための準備

FlaskでJWTを使うには、「Flask-JWT-Extended」というライブラリを使うのが便利です。ターミナルで次のようにインストールします。


    pip install Flask-JWT-Extended

これで、JWTを使って認証やトークンの検証ができるようになります。

3. 基本的なログインとトークン発行の仕組み

3. 基本的なログインとトークン発行の仕組み
3. 基本的なログインとトークン発行の仕組み

まずはログイン時にトークンを発行する基本的な例を見てみましょう。


from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app = Flask(__name__)
app.config["JWT_SECRET_KEY"] = "super-secret-key"
jwt = JWTManager(app)

# 仮のユーザー情報
users = {"admin": "1234", "user": "abcd"}

@app.route("/login", methods=["POST"])
def login():
    username = request.json.get("username")
    password = request.json.get("password")

    if username in users and users[username] == password:
        token = create_access_token(identity=username)
        return jsonify(access_token=token)
    return jsonify({"msg": "認証失敗"}), 401

@app.route("/protected", methods=["GET"])
@jwt_required()
def protected():
    current_user = get_jwt_identity()
    return jsonify(message=f"{current_user}さん、保護されたページへようこそ!")

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

このコードでは、/loginに正しいユーザー情報を送ると、JWTトークンが発行されます。そして/protectedにアクセスする際に、そのトークンをヘッダーに含めて送信すると、認証されたユーザーだけが閲覧できます。

4. トークンの有効期限とリフレッシュ機能を追加する

4. トークンの有効期限とリフレッシュ機能を追加する
4. トークンの有効期限とリフレッシュ機能を追加する

トークンには有効期限を設けるのが一般的です。これを設定することで、期限切れのトークンを防ぎ、セキュリティを高められます。


from datetime import timedelta

app.config["JWT_ACCESS_TOKEN_EXPIRES"] = timedelta(minutes=5)

これで、発行されたトークンは5分後に無効になります。さらに、リフレッシュトークンを発行して、古いトークンが切れても新しいトークンを取得できるようにできます。


from flask_jwt_extended import create_refresh_token, jwt_refresh_token_required

@app.route("/refresh", methods=["POST"])
@jwt_refresh_token_required
def refresh():
    current_user = get_jwt_identity()
    new_token = create_access_token(identity=current_user)
    return jsonify(access_token=new_token)

これで、一定時間ごとにトークンを更新しながら安全なログイン状態を保てます。

5. ロール(権限)をJWTに含める実践例

5. ロール(権限)をJWTに含める実践例
5. ロール(権限)をJWTに含める実践例

JWTのペイロード部分にユーザーのロール(権限)を含めることで、アクセス制御も可能です。


@app.route("/admin", methods=["GET"])
@jwt_required()
def admin_only():
    current_user = get_jwt_identity()
    if current_user != "admin":
        return jsonify(msg="このページは管理者のみがアクセスできます"), 403
    return jsonify(msg="管理者ページへようこそ!")

このように、トークンに含まれるユーザー情報を使ってページごとの制御を行うことで、Flaskの認可(アクセス許可)機能を強化できます。

6. 実践的なJWT活用パターン

6. 実践的なJWT活用パターン
6. 実践的なJWT活用パターン

実際のWebアプリケーションでは、次のような設計パターンがよく使われます。

  • ① APIベース認証: ReactやVueなどのフロントエンドからJWTを使ってログインする方式
  • ② モバイルアプリとの連携: スマホアプリがサーバーAPIにアクセスするときも同じトークンを利用
  • ③ サードパーティ連携: 外部サービスと安全にデータをやり取りする際の認証トークンとして使用

これらを実装することで、セッションを使わずにスケーラブル(拡張しやすい)なアプリ設計が可能になります。

7. JWTを安全に使うための注意点

7. JWTを安全に使うための注意点
7. JWTを安全に使うための注意点

JWTは非常に便利ですが、使い方を誤るとセキュリティリスクがあります。安全に使うためのポイントを覚えておきましょう。

  • ・秘密鍵(secret key)を絶対に漏らさない:トークンを偽造される恐れがあります。
  • ・HTTPS通信を使う:平文通信だとトークンが盗まれる危険があります。
  • ・短い有効期限を設定する:長期間のトークンは危険です。
  • ・リフレッシュトークンを併用する:セキュリティと利便性を両立できます。

FlaskとJWTを正しく組み合わせることで、安全で信頼性の高いWeb認証システムを構築できます。

カテゴリの一覧へ
新着記事
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文の代替としての使い方をやさしく解説