Base64
7 tools
エンコーディングとは?
エンコーディングはデータをある表現から別の表現に変換するプロセスです。Web開発では、限られた文字セット用に設計されたチャネルを通じてデータを安全に転送するために使用されます。
文字エンコーディングはテキスト文字がバイトにマッピングされる方法を定義します。Base64エンコーディングはバイナリデータをASCIIテキストに変換します。URLエンコーディングは任意のテキストをURLで安全に使用できるようにします。
文字エンコーディングの歴史
文字エンコーディングは文字とそのバイナリ表現のマッピングです:
7ビットのアメリカ標準コード。128文字:英語の文字、数字、句読点、制御コード。
西ヨーロッパ言語向けの拡張ASCII。128文字を追加。非ラテン文字には不適。
世界のすべての書記体系をカバーするユニバーサル文字セット。149,000以上の文字のコードポイントを定義。
文字あたり1〜4バイトを使用するUnicodeの可変幅エンコーディング。ASCII互換。Webで最も使用されるエンコーディング。
文字あたり2または4バイトを使用する可変幅エンコーディング。Windows、Java、JavaScriptの文字列で内部的に使用。
固定幅エンコーディング:常に文字あたり4バイト。Webではほとんど見られません。
UTF-8が勝った理由
UTF-8はASCIIとの下位互換性があり、自己同期的で、ラテン文字に対してスペース効率が良いため主流になりました。すべてのASCIIドキュメントは有効なUTF-8ドキュメントです。
Base64エンコーディング
Base64はバイナリデータを64の印刷可能なASCII文字のみを使用してテキスト表現に変換します。バイナリデータがテキストのみのチャネルを通過する必要がある場合に必要です。
仕組み
Base64は入力バイトを3バイト(24ビット)のチャンクにグループ化し、各チャンクを4つのBase64文字(それぞれ6ビット)としてエンコードします。入力が3バイトの倍数でない場合、=パディング文字が追加されます:
| 入力 | 16進数バイト | Base64 |
|---|---|---|
| "Man" | 77 61 6E | TWFu |
| "Ma" | 4D 61 | TWE= |
| "M" | 4D | TQ== |
末尾の=パディング文字は最後の3バイトグループを完成させるために何バイト不足していたかを示します。標準のBase64は長さが4の倍数の出力を常に生成します。
URLエンコーディング
URLには限られた安全なASCII文字のセットのみを含めることができます。そのセット外の文字はURLに配置する前にパーセントエンコード(URLエンコード)する必要があります。
パーセントエンコーディングは各安全でないバイトを、そのバイトの値を表す2桁の16進数が続く%に置き換えます。
一般的にエンコードされる文字
| 文字 | エンコード済み | 備考 |
|---|---|---|
| Space | %20 | 最も一般的:application/x-www-form-urlencodedのフォーム送信で+として使用 |
| & | %26 | クエリ文字列の区切り文字:リテラル値として使用する場合はエンコードが必要 |
| = | %3D | クエリ文字列のキーと値の区切り文字:データとして使用する場合はエンコード |
| + | %2B | application/x-www-form-urlencodedでスペースとして解釈されます:リテラル+を保持するためエンコード |
| # | %23 | フラグメント識別子:パスやクエリのリテラルデータとして使用する場合はエンコード |
| / | %2F | パスセグメント区切り文字:パス区切り文字ではなくリテラルデータとして使用する場合はエンコード |
| : | %3A | スキーム区切り文字:パスとクエリのコンテキストでエンコード |
| @ | %40 | mailto:とauthで使用:リテラルデータとして使用する場合はエンコード |
encodeURI対encodeURIComponent
JavaScriptは異なるスコープを持つ2つのエンコーディング関数を提供します。encodeURIは完全なURLをエンコードし、URL構造文字はそのままにします。encodeURIComponentはURLコンポーネントをエンコードします——A-Z、a-z、0-9、-、_、.、~を除くすべての文字をエンコードします。
Web開発でエンコーディングが現れる場所
Authorization: BasicヘッダーはBase64(ユーザー名:パスワード)として認証情報をエンコードします。これは転送の便宜のためのエンコーディングであり、セキュリティ対策ではありません。Basic AuthにはHTTPSを使用してください。
データURIはファイルコンテンツをHTMLやCSSに直接埋め込みます:data:image/png;base64,....。これによりHTTPリクエストを削減できますが、ドキュメントサイズが増加します。
メールは7ビットASCII用に設計されました。バイナリ添付(画像、PDF)は送信前にMIMEによってBase64エンコードされます。
JWTトークンは3つすべての部分にBase64urlエンコーディングを使用し、トークンをURLセーフにします。
URLクエリ文字列のユーザー提供データはすべてパーセントエンコードする必要があります。
非ASCIIドメイン名(例:münchen.de)はDNSシステムとの互換性のためPunycode(xn--プレフィックス)でエンコードされます。
よくある質問
いいえ。Base64はエンコーディングであり暗号化ではありません。秘密鍵のない可逆変換です。セキュリティ対策としてBase64を使用しないでください。
Base64は3バイトのグループで入力を処理します。入力が3の倍数でない場合、=パディングが追加されます。
Base64urlは+を-に、/を_に置き換えるURLセーフなバリアントで、通常は=パディングを省略します。JWTはBase64urlを使用します。
個々の値にはencodeURIComponentを使用してください。URL構造文字を保持したい完全なURL文字列にはencodeURIを使用してください。
UTF-8はASCII互換でラテン文字に対してスペース効率が良いです。HTTPとHTMLはデフォルトでUTF-8を使用します。
パーセントエンコーディングは文字を%とその2桁の16進数バイト値で表します。スペースは%20です。
Base64はデータサイズを約33%増加させCPUオーバーヘッドを追加します。URLエンコーディングのオーバーヘッドは最小限です。
PunycodeはASCII互換のDNSシステムでUnicode文字を表すためのエンコーディングです。münchen.deのようなドメインはDNSクエリでxn--mnchen-3ya.deとしてエンコードされます。