FlaskのAPIで認証(JWT)を実装する方法!初心者でもわかるトークン認証の仕組み
生徒
「Webアプリでログインが必要な仕組みってどう作るんですか?」
先生
「FlaskでJWT(ジェイソン・ウェブ・トークン)を使ったトークン認証を実装すると、安全にログインができますよ。」
生徒
「JWT?難しそうですが、初心者でもできますか?」
先生
「安心してください。JWTは紙のチケットのようなもので、一度認証が成功すると、そのチケットを使って次も安心して使える仕組みです。」
1. JWT(トークン認証)って何?
JWTとは「Json Web Token(ジェイソン・ウェブ・トークン)」の略で、ログインに成功した人だけが受け取れる特別なチケットのような仕組みです。 一度このチケットを受け取れば、その後の通信では毎回ユーザー名やパスワードを送らなくても、 「この人はすでに本人確認が終わっています」とサーバーに伝えられます。
プログラミング未経験の方は、テーマパークの再入場スタンプを想像すると分かりやすいです。 入口で一度チェックを受けてスタンプを押してもらえば、次からはスタンプを見せるだけで中に入れます。 JWTも同じで、最初のログイン後はトークン(スタンプ)を見せて認証します。
初心者向け:超シンプルなイメージ
① ログイン成功 → トークンをもらう
② APIにアクセス → トークンを一緒に送る
③ サーバー側で確認 → OKなら処理を続行
このようにJWTは「ログイン後の証明書」として働きます。 パスワードを何度も送らずに済むため、安全性と使いやすさを両立できるのが大きな特徴です。
2. なぜJWTが必要?
Webサービスでは、「この操作をしているのは誰なのか」を正しく判断することがとても重要です。 たとえば、マイページの表示や個人情報の更新などは、本人以外が操作できてはいけません。 そのため、サーバー側では毎回「本当にログイン済みの人か?」を確認する仕組みが必要になります。
もしJWTがなければ、APIにアクセスするたびにユーザー名やパスワードを送る必要があります。 これは手間がかかるだけでなく、情報が盗まれるリスクも高くなってしまいます。 JWTを使えば、一度のログインで発行したトークンを見せるだけで、安全に本人確認ができます。
初心者向け:JWTがある場合・ない場合の違い
【JWTがない場合】
毎回 → ユーザー名 + パスワード を送る
【JWTがある場合】
最初だけログイン → その後は トークン を送る
JWTは「あなたは確認済みです」と示す安全な証明書の役割を持っています。 無駄な認証処理を減らしつつ、セキュリティも保てるため、多くのAPIで使われている理由の一つです。
3. 環境を準備しよう
ここでは、FlaskでJWT認証のAPIを作るための準備をします。難しく考えなくて大丈夫で、 まずは必要な道具(ライブラリ)をインストールするだけです。 これが終わると、トークンの発行やチェックを手作業で書かなくても、楽に実装できるようになります。
ターミナル(WindowsならPowerShellやコマンドプロンプト)を開いて、次のコマンドを実行してください。
pip はPythonの「アプリストア」みたいなもので、必要な部品を追加できます。
pip install Flask Flask-JWT-Extended
初心者向け:インストールできたか確認する方法
うまく入ったか不安なときは、次のコマンドで一覧を確認できます。
表示の中に Flask と Flask-JWT-Extended があればOKです。
pip show Flask
pip show Flask-JWT-Extended
Flask-JWT-Extended は、JWTトークンの作成(発行)や認証のチェックをまとめて助けてくれる拡張機能です。
初心者でも少ないコードで「ログインAPI」と「保護されたAPI」を作れるようになります。
4. JWTでログインAPIを作ってみよう
ここからは、実際にログイン用のAPIを作って、JWTトークンを発行してみます。 流れはシンプルで「ユーザー名とパスワードを受け取る → 合っていればトークンを返す」です。 まずは動く形をつかむのが大事なので、サンプルでは分かりやすいようにユーザー情報を固定しています。
初心者向け:このAPIでやること
・/login にユーザー名とパスワードを送る
・正しければ JWT(トークン)を返す
・間違っていれば 401(認証エラー)を返す
トークンが返ってきたら、「ログイン成功の合図」です。次のAPI呼び出しでこのトークンを使っていきます。
それでは、最小構成のサンプルコードです。コピペして app.py などの名前で保存して動かせます。
JWT_SECRET_KEY はトークンを作るための重要な鍵なので、本来は簡単な文字ではなく十分に長いものを設定します。
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required
app = Flask(__name__)
# JWTの署名に使う秘密鍵(本番では推測されにくい長い文字列にする)
app.config['JWT_SECRET_KEY'] = '秘密の鍵を設定してください'
jwt = JWTManager(app)
@app.route('/login', methods=['POST'])
def login():
# JSONで送られてきた値を取り出す
username = request.json.get('username')
password = request.json.get('password')
# 例として固定のユーザーで判定(学習用)
if username == 'user' and password == 'pass':
# ログイン成功 → トークンを発行
token = create_access_token(identity=username)
return jsonify(access_token=token)
# ログイン失敗 → 401エラー
return jsonify(msg='ユーザー名かパスワードが違います'), 401
@app.route('/protected')
@jwt_required()
def protected():
return jsonify(msg='認証済みユーザーだけが見れます')
if __name__ == '__main__':
app.run(debug=True)
初心者向け:送るデータの例(ログインの中身)
/login に送るのは、次のようなJSONです。形が合っていればOKで、難しいことはしていません。
{
"username": "user",
"password": "pass"
}
正しい情報なら access_token が返ってきます。これがJWTトークンで、ログイン済みの証明として扱われます。
5. コードのポイント解説
ここでは、先ほどのログインAPIで特に重要な3つのポイントを、初心者向けにかみ砕いて説明します。 「何となく動いている」状態から、「何をしているコードなのか分かる」状態になることを目標にしましょう。
-
JWT_SECRET_KEY
JWTトークンを作るときに使われるサーバー専用の合言葉です。 この値を使ってトークンに署名することで、「サーバーが発行した本物のトークンかどうか」を判定できます。 もし他人に知られると偽のトークンを作られる危険があるため、本番では必ず安全に管理します。 -
create_access_token
ログインに成功したユーザーに対して、JWTトークンを発行するための関数です。 ここで渡しているidentityは、「このトークンは誰のものか」を示す情報になります。 あとでAPIにアクセスするとき、この情報を元に本人確認が行われます。 -
@jwt_required()
このデコレーターは、「トークンを持っている人だけ通れます」という目印です。 付けた関数は、正しいJWTトークンがないと実行されません。 そのため、ログイン後にしか見せたくないAPIを守る役割を持っています。
初心者向け:全体の流れを一言で
ログイン成功 → トークン発行 → トークン付きでAPIアクセス → 認証OKなら処理
この3つを理解できれば、JWT認証の基本はクリアです。
あとは「どのAPIを守りたいか」を考えて、@jwt_required() を付けていくだけになります。
6. トークンの仕組みをイメージしよう
イメージとしては、入場チケットのようなものです。見せると中に入れるけれど、チケットが偽物・期限切れだと入れません。
Flask-JWT-Extendedは「有効期限」や「中身のチェック」などを自動でやってくれる便利な道具です。
7. エラーになったときの対処法
- トークンがない/間違っている:401エラーになります。「トークンが必要です」などと返しましょう。
- トークンが古い:期限切れの場合は「期限切れのトークンです」と返しましょう。
8. セキュリティの注意点
秘密鍵は絶対に他人に教えてはいけません。公開リポジトリ(GitHubなど)には書かず、環境変数を使いましょう。
HTTPS(暗号化)通信を使うことで、トークンが盗まれるリスクを減らすことができます。
9. JWTを使ったAPI開発のメリット
JWTを使うと、スケーラブル(拡張しやすい)な認証システムを作ることができます。分散されたサーバーでもトークンさえあれば安全に認証ができるのが魅力です。
Flask-JWT-Extendedを使えば、初心者でも短いコードで安心して使える認証機能が作れます!
まとめ
Flaskで実装するJWT認証は、初心者でも取り組みやすいわかりやすい構造を持ちながら、実践的で安全なAPI開発に欠かせない技術として多くの場面で活用されます。とくに、認証済みかどうかを示す情報を毎回パスワードに頼らずに扱える点は、現代のWebサービスにおいて非常に重要です。今回学んだ内容を振り返ると、まずJWTという仕組みが「改ざんされにくい署名つきデータ」であり、「ログイン後に発行される安全なチケット」として使われるという理解が深まりました。そして、Flask-JWT-Extendedを使うことで、トークン生成、認証チェック、有効期限の管理などを非常に簡単に扱える点も実感できたはずです。
さらに、実際の開発では、秘密鍵の安全管理、HTTPS通信の利用、トークンの期限設定、再発行の仕組みなど、より実践的な運用を意識することが求められます。また、JWTは認証だけでなく、ユーザー識別やアクセス制御にも応用でき、マイクロサービスなどの分散アーキテクチャでも高い相性を持っています。こうした特性を理解しておくことで、より大規模な開発や複雑な仕組みの設計にも役立つ力を身につけることができます。
FlaskでのJWT認証は最初の一歩として非常に良い題材です。基本的なログインAPIと保護されたエンドポイントの作成を通じて、Web開発の根幹となる「認証」「安全な通信」「ユーザー管理」を自然と理解できるからです。特に、初心者がつまずきやすい「状態管理」をトークンという形で扱えるため、セッション管理よりも直感的で理解しやすい点も魅力です。今回の学びを土台にして、Refresh Tokenの実装、Cookieとの組み合わせ、ロールベースアクセス制御などにも取り組むと、より高度なAPI開発へスムーズに進むことができます。
サンプルコードでもう一度チェック
まとめとして、もう一度簡単な保護エンドポイントのサンプルを確認しておきましょう。
@app.route('/mypage')
@jwt_required()
def mypage():
return jsonify(msg='ようこそ!このページは認証済みユーザーだけが利用できます')
このように、認証が必要な場所に@jwt_required()を付けるだけで保護が可能になります。非常に簡単でありながら、安全性と拡張性の両方を備えていることがわかります。
生徒
「JWTって最初は難しそうでしたが、仕組みがわかると便利ですね。ログイン後のチケットって考えるとイメージしやすかったです。」
先生
「その理解が大事ですよ。認証後のデータを安全に扱うためにJWTはとてもよく使われる方法ですし、Flask-JWT-Extendedのおかげで実装もとても簡単です。」
生徒
「保護されたページを作るのもデコレーターを付けるだけでしたよね。あれなら初心者でも作れそうです!」
先生
「その通り。これができれば、もっと大きなアプリでも認証部分で困らなくなりますよ。次はトークンの更新やユーザーごとの権限管理も挑戦してみましょう。」
生徒
「はい!今回の内容でAPI開発がもっと楽しくなりそうです。」