JWTのデコードは署名検証ではない

トークンの内容を読めることと、認証情報を信頼できることを分けて考えます。

内容を読めても発行元は証明できない

署名付きJWTは通常、ピリオドで区切られた3つの部分から成ります。ヘッダーと内容は一般にBase64urlで表され、秘密鍵や共有秘密なしで読めます。架空のトークンに管理者権限を書くことも可能です。受け取るサービスは署名と必要なクレームを検証してから信頼する必要があります。

時刻の単位を確認する

exp、nbf、iatはUnixエポックからの秒数を使います。JavaScriptのDateはミリ秒を受け取るため、通常は1000倍して表示します。表示中のタイムゾーンも確認してください。表示地域を変えても期限切れトークンは有効になりません。時計のずれをどこまで許すかはサーバーの設定です。

信頼できる設定で検証する

許可するアルゴリズムと鍵を限定し、発行者と対象サービスも確認します。未検証のヘッダーだけでアルゴリズムを選んではいけません。リンク先のデコーダーは端末内で解析し、署名を検証していないことを明示します。問い合わせにはサンプルトークンを使い、実際の認証情報を貼らないでください。5部分の暗号化トークンは別の処理が必要です。

関連ツール

参考資料