0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JWT認証の仕組み:シークレットキー管理の要点

Posted at

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")

実装の流れ

deepseek_mermaid_20251201_0134ff.png

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:
    # 認証失敗

まとめ

  1. JWTは「ヘッダー.ペイロード.署名」の3部分で構成
  2. サーバーはJWTを保存せず、秘密鍵だけを保持
  3. 秘密鍵は絶対に公開せず、.envファイルで管理
  4. .envファイルはGit管理から除外する

この基本的な理解があれば、安全なJWT認証システムを実装できます。

参考リソース

  • JWT.io - JWTのデコード/検証ツール
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?