URLエンコーディングとは? パーセントエンコーディングの解説
URLエンコーディング(パーセントエンコーディング)は、URL内で安全でない文字を、パーセント記号とそのバイトの16進値に置き換えます。
URLは限られた文字の集合しか安全に含めることができないため、その集合の外にあるもの - スペース、スラッシュ、アンパサンド、非ASCII文字 - はエスケープされなければなりません。URLエンコーディングは、安全でない各バイトをパーセント記号と2桁の16進数に置き換えることでこれを行います。変数からURLを構築したり、トークンや認証情報をそこに埋め込んだりするときはいつでも、CIで重要になります。
URLエンコーディングとは
URLエンコーディング(パーセントエンコーディングとも呼ばれる)は、安全でない文字を、パーセント記号とそのバイトの2桁の16進値として表現します。スペースは%20になり、アンパサンドは%26になります。これにより、予約文字がURL自身の構文と衝突しなくなるため、URLは解析可能なままになります。
予約文字対非予約文字
一部の文字 - 文字、数字、いくつかの記号 - はそのまま使っても安全です。他は予約されており、URL上で意味を持ちます。パスのセグメントを区切るスラッシュや、クエリを開始する疑問符などです。それらのいずれかを構造ではなくデータとして使いたいときは、エンコードします。
クエリパラメータのエンコード
クエリ文字列の値は、そうでなければURLを壊す文字 - スペース、等号、あるいは別のアンパサンド - をしばしば含みます。各値をエンコードすることで、ある値がどこで終わり次がどこで始まるかを読み間違えるのではなく、サーバーがパラメータを正しく分割することを保証します。
CIにおけるURLエンコーディング
パイプラインでは、変数からURLを構築することが常にあります - 検索語でAPIを呼び出したり、gitのremote URLにトークンを埋め込んだり。スラッシュやアットマークのような特殊文字を含むトークンやパスワードは、URLエンコードしなければなりません。さもなければURLを破損させ、リクエストは失敗します。
# Encode a value before putting it in a URL in CI
steps:
- run: |
enc=$(jq -rn --arg v "$QUERY" '$v|@uri')
curl "https://api.example.com/search?q=$enc"パイプラインで問題になる理由
よくある失敗は、特殊文字を含むトークンのようなCIのsecretが、認証済みURLを静かに壊すことです。埋め込む前に認証情報をURLエンコードする - あるいは代わりにheaderを使う - ことで、混乱を招く401や不正なリクエストエラーを避けられます。
重要なポイント
- URLエンコーディングは安全でない文字を、パーセント記号とその2桁の16進バイト値に置き換えます。
- 予約文字はURL上の意味を持つため、それらが構造ではなくデータであるときにエンコードします。
- CIでは、特殊文字を含むトークンやクエリ値はURLエンコードしなければ、リクエストを破損させます。