JWTデコーダ

JWTを分解してヘッダとペイロードを読みます。ログインが通らないとき、原因はたいてい exp を過ぎているか、iss や aud がサーバの期待と食い違っているかなので、クレームを見るだけで半分は片が付きます。

入れたものは端末から出ません。 ブラウザの中だけで処理し、どこにも送らず保存もしません。

ドットで区切られた三つの断片

JWT はドットで区切られた三つの断片です。ヘッダー、ペイロード、署名。前の二つは JSON を URL 安全な Base64 で書いたもので、三つ目は前の二つに鍵で署名した値です。ここでは前の二つだけを解いて表示し、三つ目は読みません。ヘッダーの alg がどの署名方式か、kid がどの鍵かを示し、ペイロードには sub・iss・aud・exp といったクレームが入ります。

エンコードであって暗号化ではありません

Base64 は鍵無しで戻せる表記法なので、トークンを持つ人は誰でも中を読めます。署名は内容が改変されていないことを保証するだけで、隠しはしません。ですからペイロードにパスワードや個人情報を入れてはいけません。本当に隠す必要があれば JWE という別の規格がありますが、それは断片が五つで二つ目が JSON ではないため、ここでは解けません。

時刻は秒単位です

exp・iat・nbf は1970年から数えた秒です。ミリ秒ではありません。発行するコードがミリ秒を入れると、期限が数万年先になって事実上永遠に有効なトークンになります。この画面はその三つをこの端末の時刻に直して表示し、exp が過ぎていれば印を付けます。発行サーバーと検証サーバーの時計が数秒ずれていて、発行したばかりのトークンが「まだ有効ではない」と拒否されることもあります。

期限切れではないのに拒否されるとき

iss が検証側の期待する発行者と違うか、aud にそのサービスが無ければ、署名が正しくても拒否されます。aud は文字列一つのことも配列のこともあります。ログインはできるのに別の API で 401 が返るなら、たいていこれです。その API 向けのトークンではないのです。

読めないとき、最初に見る場所

貼り付けた瞬間に読みます。断片を解けなかったと出たら、トークンそのものより周りを見てください。ヘッダーからコピーしたときに付いてきた Bearer 、クッキーの token=、囲んでいる引用符、途中に入った改行がよくある原因です。前後の空白は取り除きますが、それ以外は断片の一部として読んで失敗します。ドットが一つだけの二断片のものは署名なしとみなしてそのまま読みます。

期限切れの表示はこの端末の時計です

切れているかどうかは、サーバーではなくこのコンピュータの時刻と比べます。時計のずれた端末では、生きているトークンが切れたものに、切れたトークンが生きているものに見えることがあります。exp・iat・nbf は数値のときだけ時刻の行に出ます。引用符で囲んだ "1700000000" は中身には見えますが時刻には解かれず、規格を破った発行コードの痕跡です。

よくある質問

署名を検証しますか

しません。検証には秘密鍵か公開鍵が要り、署名鍵をウェブページに貼り付ける習慣は身につけないほうがよいものです。この画面はトークンの中身を読むだけです — 署名の検証はご自身のサーバで行ってください。

ここにトークンを貼り付けても大丈夫ですか

この画面はサーバへ何も送らないので、トークンがブラウザから出ることはありません。とはいえJWTそのものが資格情報なので、本番の生きたトークンはどこにも貼り付けないほうが賢明です。

本物かどうか分かりますか

分かりません — 復号するだけ です。検証には発行者の秘密鍵か公開鍵が要り、それをブラウザに置くのは良くない考えです。ここで見えるのはトークンの中身であり、本物かどうかはサーバが判断することです。

他人のトークンを貼り付けても安全ですか

ここではトークンがブラウザから出ることはありません。ただしJWTのペイロードは 符号化されているだけで暗号化されていません — トークンを持つ人は誰でも中身を読めます。画面を共有したり写したりするときはご注意ください。

切れていると出るのに、サーバーは受け付けます。

サーバーが期限を見ていないか、数分の猶予を置いているか、この端末の時計が進んでいる場合です。逆に、ここでは生きているのに拒否されるなら、サーバーの時計が進んでいるか nbf の時刻がまだ来ていないのです。どちらにせよ判断はサーバーがするもので、この画面はこの端末の時刻で読んだものを見せるだけです。

貼り付けたものはサーバへ送られますか

送られません。すべてブラウザの中で動き、送信も保存もしません。だからこそ、ふつうならウェブページに貼り付けない社内の設定ファイルや本番のクエリにも使えます。通信を切ったままでも動きます。