Base64URL をデコードする手順
- 文字列を 入力 · Base64 に貼り付けます。ページを開くと URL セーフのサンプルが入っています。
- 結果を 出力 · テキスト で確認します。ステータス行にはバリアント(Base64URL または Standard)、デコード後のバイト数、検出された種類が表示されます。パディングが欠けていた場合は「不足していたパディングを自動で補いました。」と表示されます。
- トークンの中身として一般的な JSON は、JSON を整形 でインデントされます。
- ハッシュやランダムな ID などバイナリの内容の場合、ツールはバイナリデータであることを示し、適したデコーダーへのリンクを表示します。
- 結果は 出力をコピー または ダウンロード で取り出せます。
エンコードには Base64URL エンコーダー を使います。デコードせずに Base64URL 文字列を標準の Base64 に変換するには、Base64URL から Base64 へ を使ってください。
例
| Base64URL | デコード結果 | 補足 |
|---|---|---|
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | {"alg":"HS256","typ":"JWT"} | 典型的な JWT ヘッダー |
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSIsImFkbWluIjp0cnVlfQ | {"sub":"1234567890","name":"Ada","admin":true} | JWT のペイロード。パディングを補完 |
c3ViamVjdHM_X2Q | subjects?_d | _ は URL セーフ版の / |
8J-Riw | 👋 | - は URL セーフ版の + |
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM | 32 バイトのバイナリ | SHA-256 ハッシュ。RFC 7636 の PKCE の例 |
最後の行のハッシュは、テキストとして出力しても意味がありません。Base64 から 16進数へ で開けば、13 d3 1e 96 ... のようにバイト列を確認できます。
パディングと、それを復元できる理由
Base64URL は通常 = なしで書かれます。それで失われる情報はありません。有効な文字列の長さは 4n、4n + 2、4n + 3 文字のいずれかで、その余りから、最後のグループに 1 バイトと 2 バイトのどちらが入っているかをデコーダーが判断できるからです。ツールはデコードの前に不足している = を補い、ステータス行でその旨を知らせます。
長さが 4n + 1 になることはありえません。「長さが不正です。1 文字多いか少ないようです。」というエラーが出たら、値をコピーしたときに、たとえばメールやログの改行位置で文字が欠けたか増えています。計算の詳細は パディングの解説 をご覧ください。
標準的なデコーダーの多くは、ここまで寛容ではありません。ブラウザの atob() は - と _ を InvalidCharacterError で拒否し、Python の base64.urlsafe_b64decode は = がないと Incorrect padding を送出します。
トークン、Cookie、URL パラメーター
- JWT。 トークンは
xxxxx.yyyyy.zzzzzのような形をしています。最初の 2 つの部分は Base64URL の JSON で、3 つ目は署名でバイナリです。ここで 1 つずつデコードするか、トークン全体を JWT デコーダー に貼り付けてください。JWT デコーダーは有効期限も表示し、署名も検証します。形式の説明は JWT の Base64 にあります。 - Cookie とセッション ID。 フレームワークのセッション Cookie の中には、たとえば Flask のように、Base64URL のデータと署名をドットでつないだものがあります。デコードするのはデータ部分だけにしてください。
- URL パラメーター。 OAuth の
state、リダイレクト先、共有リンクには、Base64URL の JSON が入っていることがあります。値に%2Fや%2Bが含まれている場合はさらにパーセントエンコードされているので、先に URL デコードが必要です。
文字列に - や _ と + や / が混在していると、デコーダーは「標準(+ /)と URLセーフ(- _)の文字が混在しています」と表示して止まります。たいていは 2 つの値がつながったか、一方だけが途中まで変換されたことを意味します。
コードで Base64URL をデコードする
// Node.js
Buffer.from("c3ViamVjdHM_X2Q", "base64url").toString("utf8"); // "subjects?_d"
// Browsers with Uint8Array.fromBase64
new TextDecoder().decode(Uint8Array.fromBase64("c3ViamVjdHM_X2Q", { alphabet: "base64url" }));
import base64
def b64url_decode(s: str) -> bytes:
return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
b64url_decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") # b'{"alg":"HS256","typ":"JWT"}'
パディングを補う行は、Base64 として有効な長さの入力ならどれにも使えます。詳しくは Node.js での Base64、JavaScript、Python をご覧ください。
よくある質問
Base64URL をデコードするには?
上の入力欄に貼り付けるだけで、設定は不要です。コードでは - を + に、_ を / に置き換え、長さが 4 の倍数になるまで = を足して通常の Base64 としてデコードするか、Node の Buffer.from(s, "base64url") のような URL セーフ対応のデコーダーを使います。
文字「.」についてのエラーが出るのはなぜですか?
JWT をまるごと貼り付けています。JWT の 3 つの部分はドットで区切られており、それぞれ個別にデコードする必要があります。1 つの部分だけを貼り付けるか、トークン全体なら JWT デコーダー を使ってください。
Base64URL 文字列なのにステータス行に Standard と表示されるのはなぜですか?
その文字列には -、_、+、/ のどれも含まれていないため、どちらのアルファベットでも有効で、どちらでデコードしても結果は同じです。JWT のヘッダーの多くはこれに当てはまります。
値がまだパーセントエンコードされている場合は?
エンコードされた =(%3D)は処理できます。%2F など、それ以外のエスケープがある場合は値が URL エンコードを経ているので、先に URL デコーダー に通してください。