JSON Web Tokenのしくみ

JWTは最近のログインやAPIのあらゆる場所で使われています。構造、読み方、安全な使い方を解説します。

ツールを開く: JWTデコーダー

3つの部分

JWTはxxxxx.yyyyy.zzzzzという形をしています。1つ目はヘッダーで、アルゴリズム(alg)と種類(typ)を含むJSONです。2つ目はクレームを含むペイロード、3つ目は最初の2つからシークレットまたは秘密鍵で計算した署名です。各部分はURLやHTTPヘッダーで安全に扱えるようBase64urlでエンコードされています。

登録済みクレーム

  • iss(発行者):トークンを作成・署名した者。
  • sub(主体):トークンの対象となるユーザーやサービス。
  • aud(受信者):受け入れるべきアプリケーション。
  • exp(有効期限):トークンが無効になる日時。
  • nbf(有効開始):トークンが有効になる日時。
  • iat(発行日時):トークンが作成された日時。
  • jti(JWT ID):再利用を防ぐための一意なID。

アクセストークンとIDトークン

OpenID Connectでは、IDトークンはクライアントアプリに誰がログインしたかを伝え、名前やメールなどのプロフィールクレームを含みます。アクセストークンはAPIに送られ、呼び出し元に何が許可されているかを示し、多くはscopeクレームを持ちます。アクセストークンは数分から1時間程度の短い有効期限にし、リフレッシュトークンで更新するのが一般的です。

避けるべきミス

  • 検証せずにデコードだけしてクレームを信頼する。
  • サーバーが想定するアルゴリズムではなく、トークンに書かれたアルゴリズムを受け入れる。
  • 短く推測しやすいHMACシークレットを使う。32バイト以上のランダム値を使いましょう。
  • ペイロードに機密データを入れる。
  • 期限のないトークンや、非常に長く有効なアクセストークンを発行する。