Open2

JWT(Json Web Token) について📝

まさぴょん🐱まさぴょん🐱

JWT(Json Web Token) について📝

https://ki-ta.blog/011-jwt-introduction/

JWTは、JSON形式のデータを用いたトークンで、認証や情報交換のために使われるオープンスタンダード(RFC 7519)です。主にWebアプリケーションで、ユーザー認証や権限管理を安全かつ効率的に行うために利用されます。

JWTは以下のような特徴を持っています:

  • コンパクト: 軽量で、HTTPヘッダーやURLに簡単に埋め込める。
  • 自己完結的: トークン自体に必要な情報が含まれており、サーバー側でデータベースを参照せずに検証可能。

JWTの構造

JWTは「ヘッダー(Header)」「ペイロード(Payload)」「署名(Signature)」の3つの部分で構成され、それぞれをドット(.)で区切った形式で表されます。たとえば:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. ヘッダー(Header)

  • トークンのタイプ(通常は"JWT")と署名に使用するアルゴリズム(例: HMAC SHA256RSA)を指定。
  • JSON形式で記述され、Base64Urlでエンコードされる。
    {
      "alg": "HS256",
      "typ": "JWT"
    }
    

2. ペイロード(Payload)

  • トークンに含まれる実際のデータ(クレーム、Claimsと呼ばれる)。
  • 主に3種類のクレームがある:
    • 登録済みクレーム: iss(発行者)、sub(対象)、exp(有効期限)、iat(発行時刻)など。
    • 公開クレーム: 任意の公開情報(例: ユーザーIDやロール)。
    • プライベートクレーム: アプリケーション固有のデータ。
  • 例:
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • これもBase64Urlでエンコードされる。

3. 署名(Signature)

  • ヘッダーとペイロードを結合し、秘密鍵(または公開鍵/秘密鍵ペア)を使って署名したもの。
  • 署名アルゴリズム(例: HS256)に基づいて生成され、トークンの改ざん防止に役立つ。
  • 計算式(HS256の場合):
    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
    

JWTの仕組み

  1. 発行: ユーザーがログインすると、サーバーはJWTを生成し、ユーザーに返す。
  2. 送信: クライアント(ブラウザやアプリ)は、リクエストのたびにJWTをHTTPヘッダー(通常はAuthorization: Bearer <token>)に含めてサーバーに送信。
  3. 検証: サーバーは署名を検証し、トークンが有効かつ改ざんされていないことを確認後、ペイロードの情報(例: ユーザーID)を利用して処理を行う。

主な用途

  • 認証(Authentication): ユーザーがログインした後、セッション管理の代わりにJWTを使って認証状態を維持。
  • 認可(Authorization): ロールや権限情報をペイロードに含めてアクセス制御に利用。
  • 情報交換: サーバー間やクライアント-サーバー間で安全にデータを共有。

利点

  1. ステートレス: サーバーがセッション情報を保持する必要がないため、スケーラビリティが高い。
  2. 分散システム対応: トークン自体に情報が含まれるため、複数のサーバーで共有可能。
  3. クロスプラットフォーム: JSONベースなので、さまざまな言語や環境で簡単に扱える。

注意点と課題

  1. トークンの取り消しが難しい: 有効期限(exp)が切れるまでトークンは有効。取り消しにはブラックリスト管理が必要。
  2. ペイロードは暗号化されない: Base64Urlエンコードは単なるエンコードであり、暗号化ではない。機密情報は含めないように注意。
  3. サイズ: 情報量が増えるとトークンが長くなり、HTTPヘッダーのサイズ制限に影響する可能性がある。
  4. セキュリティ: 秘密鍵が漏洩すると署名が偽造されるリスクがある。また、XSS(クロスサイトスクリプティング)でトークンが盗まれる可能性も考慮が必要。

実際の使用例

  • シングルサインオン(SSO): 一度のログインで複数のサービスにアクセス可能。
  • API認証: REST APIなどでクライアントがサーバーにアクセスする際のトークンとして利用。

補足

JWTは、用途に応じて適切に設計することが重要です。
例えば、機密性の高いデータは暗号化(JWE: JSON Web Encryption)と組み合わせて使うこともあります。