このツールの動作
トークンが入り、そのヘッダーとペイロードが JSON として出ます。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpM
{
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "1234567890"
}
}
二つの区切りは Base64URL です。これは符号化であって暗号ではありません。トークンを持つ者は誰でも、ここでも、三行のコードでも読めます。署名はどこにも表示しません。読むものがそこには無いからです。署名は証明であり、証明には鍵が要ります。
復号は検証ではない
上のペイロードは、主体が 1234567890 だと言っています。そう言っていること自体は何の証明にもなりません。文字を書き換えて符号化し直せば、同じようにきれいに復号でき、検証には落ちるトークンができます。このページにその違いは分かりません。どの復号器にも分かりません。署名があるのは、まさにそのためです。
つまり、復号器はトークンが何を主張しているかを見るための道具であり、信じてよいかを決めるのはあなたのサーバーと鍵です。両者が食い違ったなら、正しいのは署名のほうです。
区切りは三つ、三つだけ
Not a JWT: expected header.payload.signature, found 2 segments
簡潔形式の JWT の区切りはちょうど三つです。二つでも四つでも復号されていたので、貼り付けで切れたトークンが、どこも悪くなさそうな顔で返っていました。このページを書く過程で見つけ、直した欠陥です。五つある場合は別の形式、JWE です。ペイロードは符号化ではなく暗号化されており、復号に失敗する代わりに、そのことを知らせます。
ペイロードを読む
- 長い数値の識別子は保たれます。 二十桁の
subも桁のまま通ります。JavaScript の数値で隣の値に丸められることはありません。 exp、iat、nbfは Unix 時刻です。 仕様どおり、ミリ秒ではなく秒です。この場所のタイムスタンプの道具が日付に変えてくれます。- クレームは発行者が入れたものです。
alg、typ、sub、iss、audは標準で、そのほかはあなたの両端どうしの取り決めです。
プライバシー
すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。