JWTのexp(有効期限)クレーム
JWT expクレームの仕組み、トークンの再利用防止方法、NumericDate形式、トークンの有効期限設定のベストプラクティスについて解説します。
詳細な説明
exp(有効期限)クレームは、JSON Web Tokenにおいて最も重要な登録済みクレームの一つです。このクレームは、トークンの処理が受け入れられなくなる正確な時刻を定義します。値はNumericDate形式で、Unixエポック(1970-01-01T00:00:00Z)からの秒数(ミリ秒ではありません)で表されます。
expの実際の動作:
サーバーがJWTを受信すると、現在時刻とexpの値を比較します。現在時刻がexp以上の場合、トークンは拒否されます。ほとんどのJWTライブラリはこの処理を自動的に行いますが、サーバー間の時刻差を考慮して、通常30〜60秒程度のクロックスキュー許容値を設けています。
{
"sub": "user123",
"iat": 1700000000,
"exp": 1700003600
}
この例では、トークンは発行からちょうど1時間(3600秒)後に期限切れとなります。
適切な有効期間の選択:
短期間のトークン(5〜15分)は、盗まれたトークンの悪用可能期間が限られるため、より安全です。長期間のトークン(数時間〜数日)は、再認証の頻度を減らすことでユーザー体験を向上させます。ベストプラクティスは、短期間のアクセストークンと長期間のリフレッシュトークンを組み合わせることです。APIアクセストークンには15分が一般的です。Webアプリのセッショントークンには、セキュリティ要件に応じて1〜24時間が標準的です。
セキュリティ上の影響:
expクレームがないトークンは無期限に有効であり、トークンが漏洩・窃取された場合に危険です。発行するすべてのJWTには必ずexpを含めてください。ただし、expだけでは失効機能は提供されません。発行後のトークンは有効期限まで有効なままです。即座に失効させるには、トークンブラックリスト、短い有効期間、またはデータベースベースのセッションチェックが必要です。
よくある落とし穴:
JavaScriptはタイムスタンプにミリ秒を使用しますが、JWTは秒を使用するため、Date.now()を1000で割る必要があります。これを怠ると、トークンが数十億秒後に期限切れとなるバグの原因になります。
ユースケース
APIアクセストークンに15分間の有効期限を設定すると、トークンが傍受された場合でも、攻撃者が悪用できる時間的猶予は非常に限られます。