🔐
← ガむド䞀芧に戻る

Base64 URL セヌプンコヌディング: その抂芁ず重芁性

· タグ: base64, url-safe, base64url, jwt, encoding, web-development, api

Base64 URL セヌプンコヌディングずは䜕ですか

Base64 URL セヌプンコヌディングBase64url ずも呌ばれるは、暙準の Base64 の倉皮であり、URL やファむル名で特別な意味を持぀文字を安党な代替文字に眮き換えたす。暙準の Base64 は 64 文字のアルファベットの䞀郚ずしお + ず / を䜿甚し、さらにパディング甚に = を䜿甚したすが、これら 3 ぀はすべお URL、ク゚リ文字列、ファむルパスで問題がありたす。

Base64url は 2 ぀の単玔な眮換でこれを解決したす:

| 暙準 Base64 | URL セヌフ Base64 | |-----------------|-----------------| | + (プラス) | - (マむナス) | | / (スラッシュ) | _ (アンダヌスコア) | | = (パディング) | 省略通垞 |

なぜ暙準 Base64 は URL を壊すのか

+ や / を含む Base64 ゚ンコヌドされた文字列が URL に珟れるず、ブラりザずサヌバヌの動䜜が予枬䞍胜になりたす。

+ の問題

URL ク゚リ文字列では、+ 文字はスペヌスずしお解釈されたす。この動䜜は application/x-www-form-urlencoded 仕様に由来し、デコヌドされたデヌタに予期しないスペヌスが含たれる原因になりたす。

たずえば、Pj4+Pz8/Pw== のような Base64 文字列には + 文字が含たれおいたす。これが URL パラメヌタ ?token=Pj4+Pz8/Pw== に珟れるず、サヌバヌは ?token=Pj4 Pz8/Pw== ずしお認識したす — + がスペヌスになりたす。

/ の問題

URL パスでは、/ 文字はパス区切り文字です。ab/CD+Ef== のような Base64 文字列には、ディレクトリレベルずしお解釈される / が含たれおいたす。これが URL セグメントに珟れるず、クラむアントずサヌバヌの䞡方が構造を誀解釈する可胜性がありたす。

= の問題

= 文字はク゚リ文字列のキヌず倀のペアに䜿甚されたす。?data=SGVsbG8= の末尟の = は曖昧になる可胜性がありたす — その = は Base64 のパディングの䞀郚なのか、ク゚リパラメヌタの構文なのか

パヌセント゚ンコヌディングはこれらの問題を修正できたす+ は %2B に、/ は %2F になりたすが、文字列の長さを膚匵させ、デバッグを難しくしたす。Base64url はよりクリヌンな゜リュヌションです。

Base64url の仕組み

Base64url は RFC 4648 セクション 5 で正匏に定矩されおいたす。暙準の Base64 ずたったく同じアルゎリズムを䜿甚したす — 3 バむトが 4 文字になりたす — ただし、アルファベットの䜍眮 62 ず 63 で 1 文字の眮換が行われたす:

  • アルファベットのむンデックス 62: + → -マむナス
  • アルファベットのむンデックス 63: / → _アンダヌスコア

パディング=は通垞削陀されたす。デコヌド時に文字列の長さから掚枬できるためです。Base64url 文字列は、远加の゚スケヌプなしで垞に有効な URL コンポヌネントです。

倉換前ず倉換埌

同じバむナリデヌタが䞡方の圢匏でどのように芋えるかを次に瀺したす:

Standard:  Pj4+Pz8/Pw==
URL-safe:  Pj4-Pz8_Pw

Base64url が䜿甚される堎所

JSON Web TokenJWT

JWT は Base64url の最も顕著な利甚者です。すべおの JWT はヘッダヌ、ペむロヌド、シグネチャの 3 ぀の郚分で構成され、それぞれが URL セヌフな Base64 で゚ンコヌドされ、ドットで区切られたす:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0

ダッシュずアンダヌスコアに泚目しおください — プラス蚘号やスラッシュはありたせん。JWT が暙準の Base64 を䜿甚しおいたら、Web アプリケヌションで最も䞀般的な䜿甚法である URL パラメヌタずしお枡されたずきに、トヌクンが壊れおしたいたす。

OAuth ず OpenID Connect

OAuth 2.0 ず OpenID Connect の䞡方がアクセストヌクンず ID トヌクンに JWT を䜿甚しおおり、Base64url ゚ンコヌディングは珟代の認蚌の基盀ずなっおいたす。認可コヌドフロヌ、むンプリシットフロヌ、クラむアントクレデンシャルフロヌはすべお、Base64url を䜿甚するトヌクンを送信したす。

Web API ずク゚リパラメヌタ

倚くの REST および GraphQL API は、ペヌゞネヌションカヌ゜ル、フィルタヌ、たたぱンコヌドされたペむロヌド甚に、ク゚リパラメヌタで Base64 ゚ンコヌドされたデヌタを受け入れたす。Base64url により、これらのパラメヌタは远加の URL ゚ンコヌディングなしで正しく機胜したす。

実際の䟋 — API カヌ゜ルペヌゞネヌション:

GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo

GitHub の API は、倧きな結果セットのペヌゞネヌションにこの正確なパタヌンを䜿甚しおいたす。

ファむル名ずファむルストレヌゞ

Base64url 文字列は、パス区切り文字/を含たず、ファむルシステムを混乱させる特別な文字を含たず、Windows で無効な文字:、*、? なども含たないため、安党なファむル名になりたす。

コンテンツ配信ネットワヌクずキャッシュキヌ

CDN ずキャッシュレむダヌは、しばしば Base64url ゚ンコヌドされた倀をキャッシュキヌずしお䜿甚したす。/ を含む暙準の Base64 はキャッシュ名前空間に停のディレクトリ階局を䜜成し、曖昧なキヌに぀ながる可胜性がありたす。

暙準 Base64 ず Base64url の間の倉換

2 ぀の倉皮間の倉換は、どの蚀語でも簡単です:

JavaScript

// Standard Base64 to URL-safe Base64
function base64ToBase64url(base64) {
  return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}

// URL-safe Base64 to Standard Base64
function base64urlToBase64(base64url) {
  let result = base64url.replace(/-/g, '+').replace(/_/g, '/');
  // Restore padding
  while (result.length % 4) {
    result += '=';
  }
  return result;
}

Node.js

Node.js はバヌゞョン 15.7.0 以降、ネむティブの Base64url サポヌトを提䟛したす:

// Encode to Base64url
const encodedUrl = Buffer.from('Hello, world!').toString('base64url');
console.log(encodedUrl);
// Output: SGVsbG8sIHdvcmxkIQ

// Decode from Base64url
const decoded = Buffer.from(encodedUrl, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!

Python

import base64

# Encode to Base64url
encoded = base64.urlsafe_b64encode(b"Hello, world!")
print(encoded.decode())
# Output: SGVsbG8sIHdvcmxkIQ==

# Decode from Base64url
decoded = base64.urlsafe_b64decode(encoded)
print(decoded.decode())
# Output: Hello, world!

暙準 Base64 ず Base64url のどちらを䜿甚すべきか

暙準 Base64 を䜿甚すべき堎合:

  • メヌル添付を゚ンコヌドする堎合MIME 暙準で必芁
  • HTML/CSS 埋め蟌み甚のデヌタ URL を生成する堎合
  • URL 安党性が関係ないデヌタベヌスにデヌタを保存する堎合
  • 暙準の Base64 を期埅するレガシヌシステムずやり取りする堎合

Base64url を䜿甚すべき堎合:

  • JWT トヌクンを䜜成たたは解析する堎合
  • URL ク゚リパラメヌタやパスセグメントで゚ンコヌドされたデヌタを枡す堎合
  • バむナリデヌタからファむル名を生成する堎合
  • キャッシュキヌや識別子を䜜成する堎合
  • OAuth トヌクンや OpenID Connect を扱う堎合

Base64 URL セヌプンコヌディングをオンラむンで詊す

無料のオンラむン Base64 ゚ンコヌダずデコヌダを䜿甚しお、暙準 Base64 ず URL セヌフ Base64 圢匏の間で倉換したしょう。デヌタを貌り付け、倉皮を遞択し、結果を即座に取埗しおください。

Base64 URL セヌプンコヌディング: その抂芁ず重芁性 - CoolTool