ログイン後にブラウザの開発者ツールを開いてLocalStorageやCookieを確認すると、こんな文字列が保存されているのを見たことはありませんか?
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsIm5hbWUiOiLnkIzmtYnlpKoiLCJpYXQiOjE3MDAwMDAwMDB9.xxxx
これがJWT(JSON Web Token)です。ランダムな文字列に見えますが、実はちゃんとした構造を持っており、中にユーザー情報が入っています。この記事では、JWTの仕組みと安全な使い方をわかりやすく解説します。
JWTとは?
JWT(ジェイダブリューティー、またはジョット)は JSON Web Token の略で、認証情報をコンパクトに表現するためのトークン形式です。RFC 7519として標準化されています。
JWTは ドット(.)で区切られた3つの部分で構成されています。
- ヘッダー(Header):使用するアルゴリズムとトークンの種類
- ペイロード(Payload):ユーザーIDや有効期限などの実際のデータ
- 署名(Signature):改ざんされていないことを保証する検証用データ
先ほどの例で言うと、eyJhbGci... がヘッダー、eyJzdWIi... がペイロード、xxxx が署名にあたります。
JWTの仕組みを詳しく見てみる
各パートをデコードしてみる
3つのパートはそれぞれ Base64URL でエンコードされています。これは暗号化ではなく単なる変換なので、デコードすれば誰でも中身を読めます。
ヘッダーのデコード例:
// Base64URLデコード後
{
"alg": "HS256", // 署名アルゴリズム(HMAC SHA-256)
"typ": "JWT" // トークン種別
}
ペイロードのデコード例:
// Base64URLデコード後
{
"sub": "user_123", // subject(ユーザーID)
"name": "田中太郎",
"iat": 1700000000 // issued at(発行日時)
}
署名の役割
署名は「ヘッダー + ペイロード + サーバーの秘密鍵」を組み合わせて生成されます。サーバーはリクエストを受け取ったとき、同じ計算をして署名が一致するかを確認します。もし誰かがペイロードを書き換えたとしても、署名が合わなくなるため改ざんを即座に検知できます。
JWTを使った認証フロー
ログインから認証まで
- ① ログイン:ユーザーがID・パスワードをサーバーに送る
- ② JWT発行:サーバーが認証に成功したらJWTを生成して返す
- ③ 保存:クライアントがJWTをLocalStorageやCookieに保存する
- ④ リクエスト:以後のAPIリクエストにJWTをヘッダーに付けて送る
- ⑤ 検証:サーバーがJWTの署名と有効期限を検証して認可する
// APIリクエスト時のヘッダー例
fetch('/api/profile', {
headers: {
'Authorization': 'Bearer eyJhbGci...'
}
});
よくある質問(FAQ)
- JWTはセキュアですか?
- 署名により改ざん検知はできますが、ペイロードは誰でも読めます。パスワードや個人情報をペイロードに入れてはいけません。また、必ずHTTPS通信で使用し、有効期限(exp)を短く設定することが重要です。秘密鍵の管理が最も重要なセキュリティポイントです。
- 有効期限はどう設定しますか?
- ペイロードに
"exp"(expiration)クレームを含めることで設定できます。値はUnixタイムスタンプで指定します。アクセストークンは15〜60分程度、リフレッシュトークンは数日〜数週間に設定するのが一般的です。有効期限切れのJWTはサーバー側で自動的に拒否されます。 - セッションとJWTの違いは何ですか?
- セッション方式では認証情報をサーバー側のストレージに保存し、クライアントにはセッションIDだけ渡します。JWTはすべての情報がトークンに含まれるため、サーバー側でストレージを持つ必要がありません。マイクロサービスや複数サーバー構成ではJWTが扱いやすい反面、ログアウト後の即時無効化はセッション方式の方が簡単です。
まとめ
- JWTはヘッダー・ペイロード・署名の3部構成で、ドットで区切られたトークン
- 各パートはBase64URLエンコードされているだけで、暗号化ではない
- 署名によって改ざん検知はできるが、ペイロードは誰でも読める
- 有効期限(exp)を設定し、HTTPSで使用することが基本
JWTを実際に解析したり生成したりするには以下のツールをお使いください。
- JWTデコーダー:JWTの中身(ヘッダー・ペイロード)を即座に確認
- JWT生成ツール:テスト用JWTをブラウザ上で生成
- Base64デコーダー:Base64URLエンコードされたデータを手動デコード