JWT認証の仕組みとシークレットキー管理
はじめに
JWT(JSON Web Token)は現代のWebアプリケーションで広く使用されている認証・認可の仕組みです。しかし、その実装方法やセキュリティ考慮事項について誤解している開発者も少なくありません。本記事では、JWTの基本的な仕組みから、実際の実装方法、特に重要なシークレットキーの管理方法までを解説します。
JWTの基本概念
JWTとは?
JWTは、JSONオブジェクトをエンコードしたトークンで、ドット(.)で区切られた3つの部分で構成されています:
ヘッダー.ペイロード.署名
例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
最も重要なポイント
❌ サーバーはJWTを保存しない
多くの開発者が誤解するポイントですが、サーバーは発行したJWTをデータベースなどに保存しません。
代わりに、サーバーは秘密鍵(シークレットキー)だけを保持し、その場でJWTを検証します。
シークレットキーの管理方法
❌ やってはいけないこと
# コード内に直接書く(GitHubに上がると漏洩)
SECRET_KEY = "my_secret_123"
✅ 正しい管理方法(.envファイルを使用)
プロジェクト構造:
my_project/
├── .gitignore # .envを追加
├── .env # 実際のキー(Git管理外)
└── app.py
.gitignoreに追加:
.env
.envファイル:
JWT_SECRET_KEY=your_super_secret_key_here
コードでの使用方法:
import os
from dotenv import load_dotenv
load_dotenv() # .envファイルを読み込み
SECRET_KEY = os.getenv("JWT_SECRET_KEY")
実装の流れ
1. ログイン時
# 秘密鍵でJWTに署名
import jwt
token = jwt.encode(
{"user_id": 123},
SECRET_KEY, # ← .envから取得した秘密鍵
algorithm="HS256"
)
# クライアントにtokenを返す
2. APIアクセス時
# 同じ秘密鍵でJWTを検証
try:
payload = jwt.decode(
token,
SECRET_KEY, # ← 同じ秘密鍵
algorithms=["HS256"]
)
# 認証成功
except:
# 認証失敗
まとめ
- JWTは「ヘッダー.ペイロード.署名」の3部分で構成
- サーバーはJWTを保存せず、秘密鍵だけを保持
- 秘密鍵は絶対に公開せず、.envファイルで管理
- .envファイルはGit管理から除外する
この基本的な理解があれば、安全なJWT認証システムを実装できます。
参考リソース
- JWT.io - JWTのデコード/検証ツール
