PythonのFlaskでJWT認証をやさしく解説!初心者でもわかるトークン認証の始め方
生徒
「Webアプリにログイン機能を付けたいんですけど、パスワードとか安全に管理するにはどうしたらいいですか?」
先生
「Flaskでは、JWTという仕組みを使うことで、安全にログイン管理や認証をすることができます。」
生徒
「JWTってなんですか?聞いたことないです…」
先生
「とてもいい質問ですね。まずはJWTの基本からやさしく説明しますね!」
1. JWTとは?初心者向けにやさしく解説
JWT(ジェイ・ダブリュー・ティー)とは、JSON Web Token(ジェイソン・ウェブ・トークン)の略です。これは、ログインしたユーザーの情報を安全にやりとりするための仕組み(トークン認証)です。
簡単に言えば、「この人はログイン済みですよ」という証明書を、デジタルな文字列にしたものです。サーバーは毎回パスワードを受け取らなくても、トークンを見て「ログイン済みかどうか」を判断できます。
イメージしやすい例だと、図書館の会員証やライブのリストバンドのようなものです。一度チェックを通れば、次からはそれを見せるだけで入れます。Webアプリでも、JWTをリクエストに付けて送ることで、認証済みユーザーとして扱われます。
初心者向け:トークン認証の超かんたんイメージ
下の例は「ログインできたらトークンを渡す」→「トークンがないと入れない」という流れを、イメージだけ掴めるように書いたものです。まずは雰囲気が分かればOKです。
# トークン認証のイメージ(説明用の超シンプル例)
token = "login_ok_token" # 本物のJWTはもっと長い文字列になります
# ①ログイン成功したら token を受け取る
# ②次からはアクセス時に token を付けて送る
# ③サーバー側は token を見て「ログイン済み」と判断する
つまりJWTは、WebアプリやAPIでログイン状態を安全に扱うための「合格証」のような存在だと覚えておきましょう。
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アプリの基本的なコード例
ここでは、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. コードの解説:初めてでもわかるように説明
ここでは、先ほどのサンプルコードで使われている重要な部分を、プログラミング未経験の方でもイメージしやすいように順番に説明します。「何となく動いている」状態から、「何をしているか分かる」状態になるのが目標です。
-
JWT_SECRET_KEY:
JWTを作るときに使われる秘密の鍵です。これがあることで、トークンが改ざんされていないかを確認できます。家の鍵と同じで、他人に知られると安全性が一気に下がるため、実際の開発ではコードに直接書かず、環境変数などで管理します。 -
/login:
ユーザー名とパスワードを受け取り、正しければJWTを発行する「ログイン専用の入口」です。ここで発行されたトークンが、後のアクセスで使われます。 -
create_access_token():
「このユーザーはログイン済み」という情報をもとに、JWTを作るための関数です。今回はユーザー名をそのまま登録していますが、実際にはユーザーIDなどを使うことが多いです。 -
@jwt_required():
このデコレーターが付いた関数は、トークンを持っている人だけが実行できます。入口でトークンをチェックしてくれる「見張り役」だと考えると分かりやすいです。
初心者向け:全体の流れを一言でまとめると
まずログインしてJWTを受け取り、そのJWTを持っている間だけ、保護されたページに入れる――これがFlaskでのJWT認証の基本的な考え方です。この仕組みを理解できれば、ログイン機能付きのWebアプリを作る土台が完成します。
5. トークンを安全に扱うためのポイント
トークンはとても大事な情報です。安全に使うために、以下のことを守りましょう。
- トークンをブラウザのCookieやLocalStorageに保存するときは注意:JavaScriptから簡単に見えないように設定しましょう。
- 秘密鍵は外部に公開しない:GitHubなどにアップしないように。
- トークンの有効期限を設定する:ずっと使えるトークンは危険です。短い時間で切れるように設定しましょう。
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運用が向いている場面とは?
JWT認証は、下記のようなWebアプリやサービスにぴったりです。
- スマホアプリと連携するAPI
- ログイン機能が必要なWebサービス
- 複数のサーバーでユーザー認証情報を共有したい場合
データベースに毎回ログイン情報を問い合わせず、トークンを見て判断できるので、処理も速くなります。
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サービスだけでなく、アプリ連携でもよく使われます。今回の基礎が理解できたなら、次はリフレッシュトークンなどにも挑戦できますよ。」
生徒
「もっと自分のアプリにも組み込んでみたいです!ありがとうございました!」