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

FlaskのAPIで認証(JWT)を実装する方法!初心者でもわかるトークン認証の仕組み

FlaskのAPIで認証(JWT)を実装する方法!トークン認証の仕組みを学ぼう
FlaskのAPIで認証(JWT)を実装する方法!トークン認証の仕組みを学ぼう

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

生徒

「Webアプリでログインが必要な仕組みってどう作るんですか?」

先生

「FlaskでJWT(ジェイソン・ウェブ・トークン)を使ったトークン認証を実装すると、安全にログインができますよ。」

生徒

「JWT?難しそうですが、初心者でもできますか?」

先生

「安心してください。JWTは紙のチケットのようなもので、一度認証が成功すると、そのチケットを使って次も安心して使える仕組みです。」

1. JWT(トークン認証)って何?

1. JWT(トークン認証)って何?
1. JWT(トークン認証)って何?

JWTとは「Json Web Token(ジェイソン・ウェブ・トークン)」の略で、ログインに成功した人だけが受け取れる特別なチケットのような仕組みです。 一度このチケットを受け取れば、その後の通信では毎回ユーザー名やパスワードを送らなくても、 「この人はすでに本人確認が終わっています」とサーバーに伝えられます。

プログラミング未経験の方は、テーマパークの再入場スタンプを想像すると分かりやすいです。 入口で一度チェックを受けてスタンプを押してもらえば、次からはスタンプを見せるだけで中に入れます。 JWTも同じで、最初のログイン後はトークン(スタンプ)を見せて認証します。

初心者向け:超シンプルなイメージ


① ログイン成功 → トークンをもらう
② APIにアクセス → トークンを一緒に送る
③ サーバー側で確認 → OKなら処理を続行

このようにJWTは「ログイン後の証明書」として働きます。 パスワードを何度も送らずに済むため、安全性と使いやすさを両立できるのが大きな特徴です。

2. なぜJWTが必要?

2. なぜJWTが必要?
2. なぜJWTが必要?

Webサービスでは、「この操作をしているのは誰なのか」を正しく判断することがとても重要です。 たとえば、マイページの表示や個人情報の更新などは、本人以外が操作できてはいけません。 そのため、サーバー側では毎回「本当にログイン済みの人か?」を確認する仕組みが必要になります。

もしJWTがなければ、APIにアクセスするたびにユーザー名やパスワードを送る必要があります。 これは手間がかかるだけでなく、情報が盗まれるリスクも高くなってしまいます。 JWTを使えば、一度のログインで発行したトークンを見せるだけで、安全に本人確認ができます。

初心者向け:JWTがある場合・ない場合の違い


【JWTがない場合】
毎回 → ユーザー名 + パスワード を送る

【JWTがある場合】
最初だけログイン → その後は トークン を送る

JWTは「あなたは確認済みです」と示す安全な証明書の役割を持っています。 無駄な認証処理を減らしつつ、セキュリティも保てるため、多くのAPIで使われている理由の一つです。

3. 環境を準備しよう

3. 環境を準備しよう
3. 環境を準備しよう

ここでは、FlaskでJWT認証のAPIを作るための準備をします。難しく考えなくて大丈夫で、 まずは必要な道具(ライブラリ)をインストールするだけです。 これが終わると、トークンの発行やチェックを手作業で書かなくても、楽に実装できるようになります。

ターミナル(WindowsならPowerShellやコマンドプロンプト)を開いて、次のコマンドを実行してください。 pip はPythonの「アプリストア」みたいなもので、必要な部品を追加できます。


pip install Flask Flask-JWT-Extended

初心者向け:インストールできたか確認する方法

うまく入ったか不安なときは、次のコマンドで一覧を確認できます。 表示の中に FlaskFlask-JWT-Extended があればOKです。


pip show Flask
pip show Flask-JWT-Extended

Flask-JWT-Extended は、JWTトークンの作成(発行)や認証のチェックをまとめて助けてくれる拡張機能です。 初心者でも少ないコードで「ログインAPI」と「保護されたAPI」を作れるようになります。

4. JWTでログインAPIを作ってみよう

4. JWTでログイン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. コードのポイント解説

5. コードのポイント解説
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. トークンの仕組みをイメージしよう

6. トークンの仕組みをイメージしよう
6. トークンの仕組みをイメージしよう

イメージとしては、入場チケットのようなものです。見せると中に入れるけれど、チケットが偽物・期限切れだと入れません。

Flask-JWT-Extendedは「有効期限」や「中身のチェック」などを自動でやってくれる便利な道具です。

7. エラーになったときの対処法

7. エラーになったときの対処法
7. エラーになったときの対処法
  • トークンがない/間違っている:401エラーになります。「トークンが必要です」などと返しましょう。
  • トークンが古い:期限切れの場合は「期限切れのトークンです」と返しましょう。

8. セキュリティの注意点

8. セキュリティの注意点
8. セキュリティの注意点

秘密鍵は絶対に他人に教えてはいけません。公開リポジトリ(GitHubなど)には書かず、環境変数を使いましょう。

HTTPS(暗号化)通信を使うことで、トークンが盗まれるリスクを減らすことができます。

9. JWTを使ったAPI開発のメリット

9. JWTを使ったAPI開発のメリット
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開発がもっと楽しくなりそうです。」

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

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

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

FlaskでJWT認証を使うと、どんなAPIで役に立ちますか?

FlaskでJWT認証を使うと、ログインが必要なWebアプリやAPIで「認証済みユーザーだけがアクセスできる」仕組みを簡単に作れます。ユーザーページ、マイページ、個人情報閲覧APIなどで活躍します。
カテゴリの一覧へ
新着記事
New1
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
New2
Flask
Flask-WTFでファイルアップロードフォームを完全ガイド!初心者でもわかる画像やPDFのアップロード方法
New3
Flask
FlaskでCSRF対策を実装する方法!安全なフォーム送信を学ぼう
New4
Python
Pythonの文字列型(str)を完全解説!連結・分割・検索の方法を紹介
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.4
Java&Spring記事人気No4
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.5
Java&Spring記事人気No5
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.6
Java&Spring記事人気No6
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.7
Java&Spring記事人気No7
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
No.8
Java&Spring記事人気No8
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策