Base64

7 tools

エンコーディングとは?

エンコーディングはデータをある表現から別の表現に変換するプロセスです。Web開発では、限られた文字セット用に設計されたチャネルを通じてデータを安全に転送するために使用されます。

文字エンコーディングはテキスト文字がバイトにマッピングされる方法を定義します。Base64エンコーディングはバイナリデータをASCIIテキストに変換します。URLエンコーディングは任意のテキストをURLで安全に使用できるようにします。

文字エンコーディングの歴史

文字エンコーディングは文字とそのバイナリ表現のマッピングです:

ASCII1963
128 文字

7ビットのアメリカ標準コード。128文字:英語の文字、数字、句読点、制御コード。

Latin-11987
256 文字

西ヨーロッパ言語向けの拡張ASCII。128文字を追加。非ラテン文字には不適。

Unicode1991
149 186+ 文字

世界のすべての書記体系をカバーするユニバーサル文字セット。149,000以上の文字のコードポイントを定義。

UTF-81993
全Unicode 文字

文字あたり1〜4バイトを使用するUnicodeの可変幅エンコーディング。ASCII互換。Webで最も使用されるエンコーディング。

UTF-161996
全Unicode 文字

文字あたり2または4バイトを使用する可変幅エンコーディング。Windows、Java、JavaScriptの文字列で内部的に使用。

UTF-322000
全Unicode 文字

固定幅エンコーディング:常に文字あたり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 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

末尾の=パディング文字は最後の3バイトグループを完成させるために何バイト不足していたかを示します。標準のBase64は長さが4の倍数の出力を常に生成します。

URLエンコーディング

URLには限られた安全なASCII文字のセットのみを含めることができます。そのセット外の文字はURLに配置する前にパーセントエンコード(URLエンコード)する必要があります。

パーセントエンコーディングは各安全でないバイトを、そのバイトの値を表す2桁の16進数が続く%に置き換えます。

一般的にエンコードされる文字

文字エンコード済み備考
Space%20最も一般的:application/x-www-form-urlencodedのフォーム送信で+として使用
&%26クエリ文字列の区切り文字:リテラル値として使用する場合はエンコードが必要
=%3Dクエリ文字列のキーと値の区切り文字:データとして使用する場合はエンコード
+%2Bapplication/x-www-form-urlencodedでスペースとして解釈されます:リテラル+を保持するためエンコード
#%23フラグメント識別子:パスやクエリのリテラルデータとして使用する場合はエンコード
/%2Fパスセグメント区切り文字:パス区切り文字ではなくリテラルデータとして使用する場合はエンコード
:%3Aスキーム区切り文字:パスとクエリのコンテキストでエンコード
@%40mailto:とauthで使用:リテラルデータとして使用する場合はエンコード

encodeURI対encodeURIComponent

JavaScriptは異なるスコープを持つ2つのエンコーディング関数を提供します。encodeURIは完全なURLをエンコードし、URL構造文字はそのままにします。encodeURIComponentはURLコンポーネントをエンコードします——A-Z、a-z、0-9、-、_、.、~を除くすべての文字をエンコードします。

Web開発でエンコーディングが現れる場所

HTTP基本認証

Authorization: BasicヘッダーはBase64(ユーザー名:パスワード)として認証情報をエンコードします。これは転送の便宜のためのエンコーディングであり、セキュリティ対策ではありません。Basic AuthにはHTTPSを使用してください。

データURI

データURIはファイルコンテンツをHTMLやCSSに直接埋め込みます:data:image/png;base64,....。これによりHTTPリクエストを削減できますが、ドキュメントサイズが増加します。

MIMEメール添付

メールは7ビットASCII用に設計されました。バイナリ添付(画像、PDF)は送信前にMIMEによってBase64エンコードされます。

JWTトークン

JWTトークンは3つすべての部分にBase64urlエンコーディングを使用し、トークンをURLセーフにします。

クエリ文字列パラメーター

URLクエリ文字列のユーザー提供データはすべてパーセントエンコードする必要があります。

国際化ドメイン名

非ASCIIドメイン名(例:münchen.de)はDNSシステムとの互換性のためPunycode(xn--プレフィックス)でエンコードされます。

よくある質問

Base64は暗号化の一種ですか?

いいえ。Base64はエンコーディングであり暗号化ではありません。秘密鍵のない可逆変換です。セキュリティ対策としてBase64を使用しないでください。

Base64出力が==で終わることがあるのはなぜですか?

Base64は3バイトのグループで入力を処理します。入力が3の倍数でない場合、=パディングが追加されます。

Base64とBase64urlの違いは何ですか?

Base64urlは+を-に、/を_に置き換えるURLセーフなバリアントで、通常は=パディングを省略します。JWTはBase64urlを使用します。

encodeURIとencodeURIComponentはいつ使い分けますか?

個々の値にはencodeURIComponentを使用してください。URL構造文字を保持したい完全なURL文字列にはencodeURIを使用してください。

WebでUTF-8がUTF-16より優れている理由は?

UTF-8はASCII互換でラテン文字に対してスペース効率が良いです。HTTPとHTMLはデフォルトでUTF-8を使用します。

パーセントエンコーディングとは何ですか?

パーセントエンコーディングは文字を%とその2桁の16進数バイト値で表します。スペースは%20です。

エンコーディングはパフォーマンスに影響しますか?

Base64はデータサイズを約33%増加させCPUオーバーヘッドを追加します。URLエンコーディングのオーバーヘッドは最小限です。

Punycodeとは何ですか?

PunycodeはASCII互換のDNSシステムでUnicode文字を表すためのエンコーディングです。münchen.deのようなドメインはDNSクエリでxn--mnchen-3ya.deとしてエンコードされます。