JWT(SON Web Token)とは
JWT(JSON Web Token)とは、
ユーザーの認証情報や属性情報などを安全にやり取りするための、コンパクトなトークン形式のことです。
Webアプリ・API・モバイルアプリなどで幅広く使われています。
◆ JWTの基本構造
JWTは「ドット」で区切られた 3つの部分 から構成されます:
xxxxx.yyyyy.zzzzz
-
Header(ヘッダー)
・署名方式などのメタ情報
・例:{"alg": "HS256", "typ": "JWT"} -
Payload(ペイロード)
・ユーザーIDや有効期限などの「クレーム(claims:情報)」
・例:{"sub": "12345", "name": "seiichi", "exp": 1735640000} -
Signature(署名)
・偽造されていないことを保証するための署名
・サーバー側が秘密鍵で作成する
◆ JWTがよく使われる理由(メリット)
✔ サーバーレスでセッション管理できる
サーバーでセッション情報を持つ必要がなく、トークン自体に必要な情報が入っているため、
負荷が軽い。
✔ API間の認証に向いている
フロントエンド(ブラウザ)→バックエンドAPI
モバイルアプリ → サーバー
マイクロサービス間 など
どこでも使える。
✔ JSON形式で扱いやすい
扱いやすく、構造がシンプル。
◆ JWTの注意点(デメリット)
⚠ 一度発行したら無効化しにくい
セッションのようにサーバー側で即無効化できない。
→ 対策:短い有効期限(exp) を設定し、リフレッシュトークンを使う。
⚠ ペイロードは暗号化されていない
Base64URLエンコードされているだけで、誰でも読める。
機密情報(パスワード・カード番号など)を入れてはいけない。
◆ どんな場面で使われる?
-
Webログイン(SPA + API)
-
モバイルアプリの認証
-
API Gateway や Auth0 などのIDサービス
-
マイクロサービス間通信
必要であれば以下も解説できます:
-
JWTとセッションの違い
-
アクセストークンとリフレッシュトークン
-
Auth0でのJWT運用
-
JWTのサンプルコード(Node/Python/Go)
JWT と セッション(Cookie セッション)は、「ログイン状態をどう保持するか」 の違う仕組みです。
それぞれの特徴を、分かりやすく整理します。
✅ JWT と セッションの違い(結論を先に)
| 比較項目 | JWT | セッション(Cookie セッション) |
|---|---|---|
| 保持する場所 | クライアント側(トークン) | サーバー側(メモリ/DB) |
| 無効化 | しにくい | 即時無効化できる |
| スケール | スケールしやすい(ステートレス) | スケールしにくい(ステートフル) |
| セキュリティ | 署名で改ざん防止 | サーバー保管で安全 |
| 主な用途 | SPA・API・モバイルアプリ | 伝統的なWebアプリ(HTML) |
| データ量 | ペイロード内に情報を保持 | サーバーに保存し ID だけをCookieに |
最も大きな違いは
🔹 JWT=ステートレス(サーバーが状態を持たない)
🔹 セッション=ステートフル(サーバーが状態を持つ)
🔍 それぞれの仕組みを簡単に
◆ 1. セッション(Cookie セッション)
サーバーがユーザーのログイン状態を記録し、
ブラウザには 「そのID」だけを Cookie として渡す仕組み。
ブラウザ <—(session_id)—> サーバー
-
サーバー:session_id に紐づくユーザーデータを保持
-
ブラウザ:session_id のみ保持
-
無効化:サーバー側で session を消すだけなので 即時無効
✔ メリット
-
無効化が簡単で安全
-
サーバー側に情報があるので漏れにくい
-
従来のWebアプリでは最も使いやすい
✔ デメリット
- サーバーが状態を保持するため スケールしづらい
→ ロードバランサ+複数サーバーだとセッション共有が必要
◆ 2. JWT(JSON Web Token)
ログイン情報を トークンの中に入れたままクライアントに保持 する仕組み。
ブラウザ <— JWT —> サーバー
サーバーは「署名が正しいか」だけをチェックし、状態を持たない。
✔ メリット
-
サーバーが状態を持たないので スケールしやすい(ステートレス)
-
モバイル・SPA・API などと相性がよい
-
他サービスとの連携(マイクロサービス)に使いやすい
✔ デメリット
-
一度発行した JWT を途中で無効化しにくい
→ 不正ログイン時に即ログアウトさせにくい -
ペイロードは暗号化されていないので機密情報を入れられない
-
長すぎる有効期限は危険
🤔 結局どっちを使うのがいい?
◆ HTMLベースの従来型Webアプリ
→ セッションでOK(最も安全で管理しやすい)
◆ SPA(React/Vue/Next.js)+API構成
→ JWT が有利
-
サーバーが複数台でも楽
-
モバイルアプリとも共有しやすい
◆ マイクロサービスやAPI Gateway(Auth0やCognito)など
→ JWT が標準
🔰 よくある質問:JWTのログアウトが難しいのはなぜ?
JWTは「署名済みトークン」であり、
発行後は有効期限まで正しいトークンとして扱われるため。
無効化したい場合は:
-
有効期限を短くする(5〜10分)
-
リフレッシュトークン方式を使う
-
ブラックリストを別途管理する
という工夫が必要。
⭐ まとめ
■ セッション
→ サーバー側で管理(安全・無効化しやすい)
→ ただしスケールしない
■ JWT
→ クライアント側で管理(ステートレス・スケールしやすい)
→ 無効化が難しいので短い有効期限+リフレッシュ必須
必要であれば、以下も説明できます:
-
アクセストークン+リフレッシュトークンの実装パターン
-
Auth0の場合の違い
-
Cookie で JWT を安全に使う方法(HTTPOnly / Secure)
Auth0 を使うと、JWT を使ったログイン処理の“やるべき作業”が大幅に減る、というのが最大の違いです。
自前実装と Auth0 の違いを、分かりやすく整理します。
🔍 Auth0 を使った場合の JWT ログインフローの違い(ざっくり)
自前の JWT 認証 → すべて自分で作る
Auth0 → 認証部分は Auth0 に丸投げして、アプリは JWT を受け取るだけ
✅ 自前(カスタム実装) vs Auth0 の違い
| 項目 | カスタム JWT 実装 | Auth0 |
|---|---|---|
| ユーザー認証(メール/パスワード検証) | 自前で実装 | Auth0 が担当 |
| OAuth / Google / LINE ログイン | 自前実装は大変 | Auth0 の設定で即対応 |
| パスワードリセット・メール認証 | 自前で実装 | Auth0 が自動提供 |
| JWT 発行 | 自分で署名・生成 | Auth0 が自動生成 |
| JWT の署名鍵管理 | 自分で秘密鍵管理 | Auth0 側で安全に管理 |
| トークン検証 | サーバーで署名検証 | Auth0 の公開鍵で検証するだけ |
| ログアウト | 自分でトークン無効化設計 | Auth0 のセッションを削除 |
| UI(ログイン画面) | 自作 | Auth0 の完備された UI 使用可 |
🧩 Auth0 のログインフロー(図解で説明)
通常の JWT の流れはこうでした:
-
ユーザーが ID/Pass をアプリに送る
-
サーバーがチェック
-
JWT を発行
-
API へアクセス
⭐ Auth0 の場合の流れ
あなたのアプリは パスワードを一切受け取らない。
Auth0 JWT ログインフロー(簡易版)
-
アプリ → Auth0 にリダイレクト
→ ログインページは Auth0 が提供 -
Auth0 で認証(メール/パスワード、SNSログインなど)
-
Auth0 が JWT(ID Token / Access Token)を発行
-
アプリは Auth0 から Token を受け取る
-
API にアクセスするとき、その JWT をヘッダーにつける
Authorization: Bearer xxxx.yyyy.zzzz
🔐 Auth0 が発行する 2 種類のトークン
Auth0 では JWT が2種類出てくるのが特徴です:
| トークン | 用途 |
|---|---|
| ID Token(JWT) | フロントエンドがユーザー情報を取得するため |
| Access Token(JWT) | API へアクセスするため |
👉 API には Access Token が必要
👉 ID Token は API では使わない
(ここが初心者がよく間違えるポイント)
🛡 Auth0 が提供するセキュリティ機能(自前より圧倒的に強い)
Auth0 では自動で以下が付いてきます:
-
パスワードポリシー
-
多要素認証(MFA)
-
不正ログイン検知
-
攻撃防止(Brute-force protection)
-
メール認証
-
SSO(シングルサインオン)
-
ログの可視化
-
ユーザー管理画面
すべて自前実装すると超大変な部分。
📌 Auth0 での JWT 検証が少し違う点
Auth0 は秘密鍵を持っており、公開鍵を以下から取得します:
https://YOUR_DOMAIN/.well-known/jwks.json
あなたの API サーバーは、この公開鍵を使って
Auth0 が発行した JWT が正しいか検証します。
つまり:
-
秘密鍵は Auth0 が保持
-
アプリ側は公開鍵だけ使用
この構造がセキュアで便利。
🎯 まとめ:Auth0 を使うと何が変わる?
✔ ログイン処理を「自前で作らなくてよくなる」
✔ JWT の管理・発行は Auth0 に任せられる
✔ API は受け取った Access Token を検証するだけ
✔ 豊富なセキュリティ機能を自動で利用できる
✔ Google / Twitter / LINE ログインも簡単に追加
必要であれば、以下も用意します:
-
Auth0 + Next.js の構成図
-
Auth0 を使った API 認証コード例(Node / Python / Go)
-
ID Token と Access Token の図解
-
SPA 向け “Authorization Code Flow with PKCE” の解説