ログイン後にブラウザの開発者ツールを開いて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を実際に解析したり生成したりするには以下のツールをお使いください。