開発者ツール · JWT デコーダー
JWT exp、iat、nbf: NumericDate はミリ秒ではなく秒です
· 仕組み
jwt タイムスタンプ デバッグ
JavaScript ではミリ秒が与えられますが、JWT では秒が必要となるため、タイムスタンプは 1,000 倍も誤差が生じます。この投稿では、NumericDate と 3 つの時刻の請求を正しく読み取る方法について説明します。
有効期限が切れないトークン、または到着前に期限切れになるトークン — 単位ミスの 2 つの症状
1000 分の 1 の間違いが劇的な症状を引き起こします。トークン作成者がエポック秒を想定しているところに JavaScript ミリ秒を指定すると、有効期限が何千年も先になる可能性があります。秒の値を再度割ると、1970 付近に配置され、新しく発行されたトークンが最初の正当なリクエストの前に期限切れになったように見える可能性があります。
デコーダは、ISO 読み取り値の横に数値クレームを表示することで、スケールを明らかにするのに役立ちます。この表示は診断専用です。攻撃者は、任意の `exp`、`iat`、または `nbf` 数値を署名のないペイロードまたは偽造されたペイロードに書き込むことができるため、変換されたクロック時間は、他の場所で署名とポリシーが検証された後にのみ権威を持ちます。
NumericDate 7519 — Unix エポックからの秒数 (JSON 数値として)。小数点は許可されますが、ほとんど使用されません。
JWT 時間クレームでは、NumericDate 表現、つまり Unix エポックからの秒数をカウントする JSON 数値が使用されます。実装では日付を作成する前に値に 1,000 を乗算するため、小数は 1 秒未満の位置を表すことができます。有効な有限数を最初に整数に丸めることはありません。
ToolAcre は、`exp`、`nbf`、`iat`、`auth_time`、および `updated_at` を表示用の時間型フィールドとして認識します。登録済みクレームの説明には最初の 3 つだけが含まれます。数値以外、無限、または無効な日付の結果は、意味のある時刻として表示されるのではなく省略され、「soon」などの文字列がタイムスタンプとして偽装されるのを防ぎます。
Date.now() はミリ秒です - 遠い将来の有効期限を生成する JavaScript の習慣
`Date.now()` はミリ秒を返しますが、NumericDate 値は秒単位で表されます。したがって、ブラウザのクロックからクレームを導出するプロデューサは、明示的なスケール変換を必要とし、通常は独自の丸めポリシーを適用する前に 1,000 で除算します。 ToolAcre 読み取りパスは、表示のみを目的として逆乗算を実行します。
コード レビューで単位変換を表示できるようにします。 `exp` の 13 桁の値は警告サインとして役立ちますが、桁数のカウントは検証ではなく、プロデューサーの契約に代わることはできません。デコーダは、JavaScript Date が表現できる有限の数値クレームをレンダリングしようとします。ミリ秒を秒として暗黙的に再解釈することはありません。
exp、nbf、iat — 期限切れ、以前ではない、発行日、および検証者がそれぞれをどのように適用するか
`exp` は、検証者がそのポリシーに基づいてトークンを受け入れなくなるまでの時間を指定します。 `nbf` は、それより前では受け入れられない境界を指定します。 `iat` は発行時刻を記録します。 ToolAcre はこれらの意味にラベルを付け、`exp` および `nbf` のみを提供された基準クロックと比較します。
返される状態は、デコードされた有効期限が現在より早い場合は `expired`、以前でない場合は現在よりも遅い場合は `future`、その他の表示された時間クレームの場合は `past` です。これらのラベルは、ペイロードの演算に関する観察です。これらは認証に関する決定ではなく、発行者、対象者、キー、または署名を評価しません。
クロックの違いと余裕は検証者に属します。このデコーダはどちらも定義しません
概要では、どの程度のクロック スキューが妥当であるかを尋ねていますが、JWT デコーダーの構成も実装も余裕を定義していません。この番号は検証者とその展開要件に属します。ここでデフォルトをでっち上げると、検査記事が文書化されていないセキュリティ ポリシーになってしまうため、このセクションでは意図的に何も提供しません。
サービスが境界付近でトークンを拒否した場合は、信頼されたログを使用して、サービス クロック、発行者のクロック、および構成された検証者ポリシーを比較します。 ToolAcre は、ブラウザの現在の日付に対するクレームを許容範囲なしで解決します。したがって、両方が同じ数値を解析した場合でも、意図的に余裕を適用したサーバーとは結果が異なる場合があります。
実用的な例 — サンプルの経験値を人間が判読できる時間に変換し、iat と照合する
合成ペイロードに `iat: 1717243200` と `exp: 1717246800` が含まれているとします。 1,000 を乗算すると、ISO インスタント `2024-06-01T12:00:00.000Z` および `2024-06-01T13:00:00.000Z` が得られます。生の秒値を減算すると、ブラウザーのミリ秒を計算に含めることなく、1 時間の間隔が得られます。
この算術はペイロードの内容を表します。発行者がこれらの値を選択したことや、1 時間がどのアプリケーションにも適していることを示すものではありません。 ToolAcre は数値をきれいに出力し、UTC 行を生成し、有効期限を今日から相対的に古いものと呼ぶ場合があります。検証者は独自に認証を行い、独自の受け入れルールを適用する必要があります。
これでカバーされないもの — 特定のサーバーがトークンを受け入れるかどうかは、サーバーのクロックと余裕に依存します。デコーダは判定ではなく値を表示します
デコーダーは、特定のサーバーがトークンを受け入れるかどうかを予測できません。サーバーは、別のクロック、設定された許容値、より厳格な請求スキーマ、または追加の発行者および対象者チェックを使用する場合があります。署名の失敗だけでも、表示される NumericDates がまったく普通に見えるトークンを拒否する可能性があります。
逆に、将来の有効期限が切れても、未検証のトークンは有効になりません。タイム テーブルは、ユニット エラーの可能性を特定し、デバッグ用の証拠を収集する方法として扱います。実際の判定は、サーバー ログまたは予期されるキーとポリシーを使用した制御された検証テストに含まれ、デコード パネルには決して含まれません。
要点: クレームを読み、算術演算を実行します。ToolAcre JWT デコーダーは exp、iat、および nbf を表示するため、単位を自分でチェックできます。
クレームを読み、意図的にスケール演算を実行します。NumericDate 秒は、Date 境界でのみ JavaScript ミリ秒になります。 ToolAcre は、その乗算をソース内で明示的に行い、作成者の意図を推測するのではなく、不正な形式の時間型を無視しながら、結果の ISO 値を表示します。
セキュリティの区別も同様に明確にしてください。 `exp` 表示は有効期限の強制ではなく、`nbf` 表示はアドミッション コントロールではなく、`iat` は発行証明ではありません。使い捨てトークンを検査した後、信頼できる検証ツールを使用してトークンを認証し、サービスの実際のクロックとクレーム ポリシーを適用します。