Shikata Ga Nai

Private? There is no such things.

JWT(JSON Web Token)とは何か?

Hello there, ('ω')ノ

🔐 JWTの概要

JWT(JSON Web Token)は、JSON形式のデータを安全に送受信するためのトークン形式で、特に次のような場面で使われます:

  • ユーザー認証(ログイン済みの確認)
  • セッション管理(ログイン状態の維持)
  • アクセス制御(権限に基づく処理)

JWTの利点は、セッション情報がクライアント(ブラウザ)側に保管されること。これにより、サーバー側のリソースを節約でき、大規模な分散システムで特に効果を発揮します。


🧱 JWTの構造

JWTは次の3つの部分に分かれ、.(ドット)で区切られています:

  1. Header(ヘッダー):署名アルゴリズムなどのメタデータ
  2. Payload(ペイロード):ユーザーに関する「クレーム(claims)」
  3. Signature(署名):トークンの改ざん防止に使われる暗号署名

例えば:

[Header].[Payload].[Signature]

Payloadをデコードすると、次のような情報が含まれています:

{
  "iss": "portswigger",
  "name": "Carlos Montoya",
  "role": "blog_author",
  "email": "carlos@carlos-montoya.net"
}

※HeaderとPayloadはbase64urlエンコードされているだけなので、誰でも中身を確認できます。


🔒 セキュリティの要:Signature(署名)

Payloadの内容は簡単に読めるため、JWTのセキュリティはこの署名部分に依存しています。

  • 署名は、Header + Payload を秘密鍵でハッシュ化して作られる
  • 改ざんされたトークンは、サーバ側で署名検証に失敗し、無効と判断される

この仕組みにより、改ざん防止が実現されているわけです。


⚠️ 注意点

  • トークン自体は暗号化されていない(JWEでない限り)
  • 誰でも中身を「見る」ことは可能
  • 秘密鍵が漏洩したり、署名の検証がされていなければ簡単に改ざんが可能

🔄 JWTとJWS/JWEの違い

用語 内容
JWT 単なるフォーマット(枠組み)
JWS 署名付きJWT(一般的に使われる)
JWE 暗号化されたJWT(中身も秘匿される)

一般的に「JWT」と言った場合は、JWS(署名付きJWT)を指すことがほとんどです。


🛠️ 補足ツール

  • https://jwt.io/JWT Debugger を使えば、トークンの分解や再構築を視覚的に学べます。

Best regards, (^^ゞ