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

PythonのFlaskでJWT認証をやさしく解説!初心者でもわかるトークン認証の始め方

FlaskアプリでJWT認証を実装する方法!トークンの安全な運用を学ぼう
FlaskアプリでJWT認証を実装する方法!トークンの安全な運用を学ぼう

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

生徒

「Webアプリにログイン機能を付けたいんですけど、パスワードとか安全に管理するにはどうしたらいいですか?」

先生

「Flaskでは、JWTという仕組みを使うことで、安全にログイン管理や認証をすることができます。」

生徒

「JWTってなんですか?聞いたことないです…」

先生

「とてもいい質問ですね。まずはJWTの基本からやさしく説明しますね!」

1. JWTとは?初心者向けにやさしく解説

1. JWTとは?初心者向けにやさしく解説
1. JWTとは?初心者向けにやさしく解説

JWT(ジェイ・ダブリュー・ティー)とは、JSON Web Token(ジェイソン・ウェブ・トークン)の略です。これは、ログインしたユーザーの情報を安全にやりとりするための仕組み(トークン認証)です。

簡単に言えば、「この人はログイン済みですよ」という証明書を、デジタルな文字列にしたものです。サーバーは毎回パスワードを受け取らなくても、トークンを見て「ログイン済みかどうか」を判断できます。

イメージしやすい例だと、図書館の会員証やライブのリストバンドのようなものです。一度チェックを通れば、次からはそれを見せるだけで入れます。Webアプリでも、JWTをリクエストに付けて送ることで、認証済みユーザーとして扱われます。

初心者向け:トークン認証の超かんたんイメージ

下の例は「ログインできたらトークンを渡す」→「トークンがないと入れない」という流れを、イメージだけ掴めるように書いたものです。まずは雰囲気が分かればOKです。


# トークン認証のイメージ(説明用の超シンプル例)
token = "login_ok_token"  # 本物のJWTはもっと長い文字列になります

# ①ログイン成功したら token を受け取る
# ②次からはアクセス時に token を付けて送る
# ③サーバー側は token を見て「ログイン済み」と判断する

つまりJWTは、WebアプリやAPIでログイン状態を安全に扱うための「合格証」のような存在だと覚えておきましょう。

2. FlaskでJWTを使うために必要なライブラリ

2. FlaskでJWTを使うために必要なライブラリ
2. FlaskでJWTを使うために必要なライブラリ

PythonのFlask(フラスク)でJWT認証を使うには、Flask-JWT-Extendedというライブラリを使うのが簡単で便利です。JWTの「発行」「確認」「保護されたページの制御」まで、必要な機能がひとまとめになっているので、はじめてでも迷いにくいのが特徴です。

インストールは、ターミナル(コマンド入力画面)で次の1行を実行するだけです。


pip install Flask Flask-JWT-Extended

初心者向け:インストールできたかの簡単チェック

次のコードを実行してエラーが出なければ、ライブラリの準備はOKです(「読み込めるか」を確認しているだけの短いサンプルです)。


from flask import Flask
from flask_jwt_extended import JWTManager

app = Flask(__name__)
app.config["JWT_SECRET_KEY"] = "test_key"
jwt = JWTManager(app)

print("JWTの準備ができました")

FlaskはPythonでWebアプリを作るためのフレームワーク、Flask-JWT-ExtendedはJWTを扱うための拡張機能です。ここまでできれば、次の章のコード例もスムーズに動かせます。

3. JWTを使ったFlaskアプリの基本的なコード例

3. JWTを使ったFlaskアプリの基本的なコード例
3. JWTを使ったFlaskアプリの基本的なコード例

ここでは、FlaskでJWT認証を動かすための「最小セット」を紹介します。やることはシンプルで、①ログインでトークン(JWT)を発行して、②トークンがある人だけが入れるページを用意するだけです。

まずは全体の形をつかむのが目的なので、ユーザー名とパスワードは分かりやすい例にしています(本番では必ずデータベースやハッシュ化などを使います)。


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

app = Flask(__name__)

# JWTを作るための秘密鍵(外に漏らさないこと)
app.config["JWT_SECRET_KEY"] = "ひみつのカギ"
jwt = JWTManager(app)

# ①ログインしてトークンを発行する
@app.route("/login", methods=["POST"])
def login():
    username = request.json.get("username")
    password = request.json.get("password")

    # ここは説明用の簡易チェック
    if username != "admin" or password != "password":
        return jsonify({"msg": "ユーザー名またはパスワードが違います"}), 401

    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token), 200

# ②トークンが必要な保護されたページ
@app.route("/protected", methods=["GET"])
@jwt_required()
def protected():
    current_user = get_jwt_identity()
    return jsonify({"logged_in_as": current_user}), 200

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

初心者向け:このコードで何が起きている?

/login に正しい情報でアクセスすると、access_token(JWT)が返ってきます。これが「ログイン済みの証明書」です。

/protected@jwt_required() が付いているので、トークンなしだと入れません。逆に、リクエストにトークンを付けると中に入れて、ログイン中のユーザー名も確認できます。

まずは「トークンを発行する場所」と「トークンが必要な場所」の2つを作る、という流れだけ押さえておきましょう。

4. コードの解説:初めてでもわかるように説明

4. コードの解説:初めてでもわかるように説明
4. コードの解説:初めてでもわかるように説明

ここでは、先ほどのサンプルコードで使われている重要な部分を、プログラミング未経験の方でもイメージしやすいように順番に説明します。「何となく動いている」状態から、「何をしているか分かる」状態になるのが目標です。

  • JWT_SECRET_KEY
    JWTを作るときに使われる秘密の鍵です。これがあることで、トークンが改ざんされていないかを確認できます。家の鍵と同じで、他人に知られると安全性が一気に下がるため、実際の開発ではコードに直接書かず、環境変数などで管理します。
  • /login
    ユーザー名とパスワードを受け取り、正しければJWTを発行する「ログイン専用の入口」です。ここで発行されたトークンが、後のアクセスで使われます。
  • create_access_token()
    「このユーザーはログイン済み」という情報をもとに、JWTを作るための関数です。今回はユーザー名をそのまま登録していますが、実際にはユーザーIDなどを使うことが多いです。
  • @jwt_required()
    このデコレーターが付いた関数は、トークンを持っている人だけが実行できます。入口でトークンをチェックしてくれる「見張り役」だと考えると分かりやすいです。

初心者向け:全体の流れを一言でまとめると

まずログインしてJWTを受け取り、そのJWTを持っている間だけ、保護されたページに入れる――これがFlaskでのJWT認証の基本的な考え方です。この仕組みを理解できれば、ログイン機能付きのWebアプリを作る土台が完成します。

5. トークンを安全に扱うためのポイント

5. トークンを安全に扱うためのポイント
5. トークンを安全に扱うためのポイント

トークンはとても大事な情報です。安全に使うために、以下のことを守りましょう。

  • トークンをブラウザのCookieやLocalStorageに保存するときは注意:JavaScriptから簡単に見えないように設定しましょう。
  • 秘密鍵は外部に公開しない:GitHubなどにアップしないように。
  • トークンの有効期限を設定する:ずっと使えるトークンは危険です。短い時間で切れるように設定しましょう。

6. 実際にリクエストして動作を確認する方法

6. 実際にリクエストして動作を確認する方法
6. 実際にリクエストして動作を確認する方法

ログインしてトークンをもらい、そのトークンを使って保護されたページにアクセスします。以下は簡単な例です。

```

①ログインリクエスト

ツール(Postmanなど)で次のようにPOSTリクエストを送ります。

```

POST /login
Content-Type: application/json

{
  "username": "admin",
  "password": "password"
}
```

②保護されたページへのアクセス

①で取得したaccess_tokenを使って、GETリクエストを送ります。

```

GET /protected
Authorization: Bearer (ここにトークン)
```

うまくいくと、次のようなレスポンスが返ってきます。

```

{
  "logged_in_as": "admin"
}

7. FlaskでのJWT運用が向いている場面とは?

7. FlaskでのJWT運用が向いている場面とは?
7. FlaskでのJWT運用が向いている場面とは?

JWT認証は、下記のようなWebアプリやサービスにぴったりです。

  • スマホアプリと連携するAPI
  • ログイン機能が必要なWebサービス
  • 複数のサーバーでユーザー認証情報を共有したい場合

データベースに毎回ログイン情報を問い合わせず、トークンを見て判断できるので、処理も速くなります。

8. 初心者が注意するべき落とし穴とは?

8. 初心者が注意するべき落とし穴とは?
8. 初心者が注意するべき落とし穴とは?

はじめてJWTを使うときに、以下のようなミスをしやすいです。

  • トークンをURLに含める:これは危険なので絶対に避けましょう。
  • トークンの期限を長くしすぎる:万が一漏れたら長く使われてしまいます。
  • HTTPSでアクセスしていない:トークンは通信中に盗まれることもあるので、HTTPSは必須です。

まとめ

まとめ
まとめ

PythonのFlaskで実装するJWT認証は、初心者でも理解しやすい構造でありながら、実際のWebアプリケーションやAPI開発の現場でも広く使われている重要な仕組みです。今回学んだ内容を振り返ると、まず「JWTとは何か」という基礎を押さえることが非常に大切で、トークン認証の流れを理解することで、ログイン済みユーザーを安全に識別できる仕組みを構築できるようになります。特に、署名付きのトークンでユーザー情報を安全にやりとりできる点は、セッション方式とは異なる大きな特徴で、分散環境やモバイルアプリとの連携でも効果を発揮します。 FlaskでJWTを扱う際には、Flask-JWT-Extendedという便利な拡張機能を使うことで、初心者でも簡単にトークン発行や保護されたエンドポイントの作成ができるようになります。今回の記事で紹介したサンプルコードのように、シンプルな数行の設定とルーティングを追加するだけで、ログインと認証済みページの制御が実現できます。特に「@jwt_required()」のデコレーターや「create_access_token」などの関数は、初心者がまず覚えておくべき重要なポイントです。 また、JWTを扱ううえで欠かせないセキュリティ知識として、「秘密鍵は外部に漏らさない」「トークンを長期間使える設定にしない」「HTTPS通信を前提にする」といった点は非常に重要です。特に初心者が犯しがちなミスとして、トークンをURLに含めてしまったり、LocalStorageに保存したままXSSに対策せず放置してしまうことがあります。この記事では、それらの注意点を丁寧に整理したため、Flaskアプリを安全に運用する基礎がしっかり身につく内容になっています。 掲載したサンプルプログラムでは、最小構成で「ログインしてJWTを発行する」「トークンを持つユーザーだけがアクセスできるページをつくる」という流れを実装しました。これを応用することで、ユーザーごとのマイページ、ログイン後だけ利用できるAPI、スマートフォンアプリとの連携など、幅広い実装ができるようになります。初心者がつまずきやすい部分も細かく整理したため、FlaskとJWTの組み合わせを使ったアプリ開発の基礎固めとして最適です。 さらに、トークン認証は軽量で高速な仕組みであるため、複数のサーバー間で認証を共有したい場合にも向いています。セッション方式とは異なり、サーバーがユーザーの状態を保存しないため、シンプルな構成で大規模なアプリにも対応できます。APIバックエンドとしてFlaskを使う場合にも相性がよく、今回のような基本構造を理解しておくことは非常に価値があります。 以下では、記事内で使用した構成に合わせて簡単なサンプルコードを確認しながら、もう一度ポイントを整理しておきます。

サンプルコードの振り返り


@app.route("/login", methods=["POST"])
def login():
    username = request.json.get("username")
    password = request.json.get("password")
    if username != "admin" or password != "password":
        return jsonify({"msg": "ログイン情報が正しくありません"}), 401

    access_token = create_access_token(identity=username)
    return jsonify({"access_token": access_token})

@app.route("/protected", methods=["GET"])
@jwt_required()
def protected():
    current_user = get_jwt_identity()
    return jsonify({"login_user": current_user})

ログイン処理の基本、トークンを使ったページ保護の仕組み、トークンの取得と送信の流れをしっかり押さえておけば、FlaskでのWeb開発がよりスムーズになります。また、APIを使った外部サービスとの連携や、スマートフォンアプリとのデータ交換でも、JWTは非常に重要な役割を果たします。

先生と生徒の振り返り会話

生徒

「きょう学んだFlaskのJWT認証、すごく便利ですね!最初はむずかしいと思っていたけど、流れを理解したら分かりやすかったです。」

先生

「そうですね。ポイントはトークンのしくみを理解することと、安全に扱うルールを守ることです。Flask-JWT-Extendedを使えば、初心者でも迷わず実装できますよ。」

生徒

「ログインしてトークンをもらって、それをつけてアクセスするだけで認証ができるのがすごいです。API開発でも役立ちそうですね!」

先生

「その通りです。Webサービスだけでなく、アプリ連携でもよく使われます。今回の基礎が理解できたなら、次はリフレッシュトークンなどにも挑戦できますよ。」

生徒

「もっと自分のアプリにも組み込んでみたいです!ありがとうございました!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JWTとは何ですか?Flaskとどう関係していますか?

JWTとは「JSON Web Token」の略で、ログイン済みユーザーの情報を安全にやりとりするためのトークンです。FlaskではこのJWTを使って認証・認可の仕組みを実装することができます。
カテゴリの一覧へ
新着記事
New1
Flask
Flaskでデータベースエラーを処理する方法!初心者にもわかる例外の使い方
New2
Flask
FlaskでリダイレクトやURL生成を行う方法!便利な関数の使い方を解説
New3
Flask
FlaskでPOSTリクエストを受け取る方法!初心者でもわかるJSONデータの受け取り方
New4
Flask
Flask‑Mailの使い方!アプリからメールを送信する基本方法を解説
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Django
DjangoとFlaskの違いを完全比較!初心者でもわかるPythonフレームワーク入門
No.3
Java&Spring記事人気No3
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.4
Java&Spring記事人気No4
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.5
Java&Spring記事人気No5
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.6
Java&Spring記事人気No6
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.7
Java&Spring記事人気No7
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説
No.8
Java&Spring記事人気No8
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説