JSON Web Tokenのしくみ
JWTは最近のログインやAPIのあらゆる場所で使われています。構造、読み方、安全な使い方を解説します。
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バイト以上のランダム値を使いましょう。
- ペイロードに機密データを入れる。
- 期限のないトークンや、非常に長く有効なアクセストークンを発行する。