Google 検索結果上位で解決できない問題の解決方法

Base64 encode URLSafe … PHP と java エンジニアの相違による混乱の回避方法

Base64 encode URLSafe … PHP と java エンジニアの相違による混乱の回避方法

Base64 encode URLSafe を指定された場合、PHP と java のエンジニア間で変換ルールに相違があり…そこで生じる混乱/トラブルの原因/回避方法について具体的に考えてみたいと思います。

Base64 とは?

Base64 とは、各種データを 64種類の半角英数字(0-9, A-Z, a-z, +, /, =)のみで表現される文字列に変換(encode / エンコード)することです。

なぜこんなことをするかというと、メールで添付ファイルを送信する際、例えば 文字列が長いと改行コードが自動挿入されたり、TAB 文字がスペースに変換されたり…そういった事で送信の過程でデータが文字化けしてしまって 誤って届いてしまうことを防ぐために、絶対に文字化けしない文字コードだけで 添付ファイルを変換して表現しようとしたため … Base64 が定義され、主にメールの添付ファイル送信で使用されるようになったようです。

※「バイナリーデータを…」と書いているページを見かけますが、テキストデータを Base64 で変換することもあります

URLSafe(URL セーフ)とは?

URLSafe(URL セーフ)とは「URL として正常に機能する文字列」のことです。

Base64 URLSafe とは?

なぜ「Base64」の話しに「URLSafe」の話しが登場するか?と言うと、Base64 として表現される文字列に(上記の通り)「+」「/」という文字列が出現するからです。

システム間のデータ連動をする際には、各種パラメータを Base64 で変換して、その文字列を URL として表現する…という手法をとるシステムがあります。ところが、普通に任意の文字列を Base64 にして、例えば「/********」(******** は Base64 文字列)とURL の追加文字列としてくっつけた場合、その文字列に「+」や「/」が入ってしまう可能性があるので、WEB サーバーが「なにかパラメータか?!」または「ディレクトリなのか?!」と誤認識してしまう可能性があって、、それを回避するために「URLSafe でエンコードしてね!」って言ってるシステムがあるのです。

Base64「+」「/」「=」は事前に変換しちゃって!?

Base64 で変換した文字列を URL としてくっつけるために、誤動作の恐れがある「+」「/」「=」は事前に変換してね!って意味で「URLSafe」とだけ記載している仕様書があったりするのですが、、それを見たエンジニアは…「と言っても、どの文字をなんの文字に変換するの??」と疑問に思ってしまいます、、

本来はシステム提供側が、その文字間の変換ルールを仕様書に書いておいて頂かなければ エンジニア側は「URLSafe とだけ言われても、デコードする側の変換ルールがわからないと、エンコードもやりようがないですよ!?」と混乱してしまいます、、

そこで Google 検索してみると…

java の場合

java の場合には、サンプルコードとしてこんな記載のあるページを見つけました。。

「+」→「」、「/」→「_

PHP の場合

一方で PHP の場合には、サンプルコードとしてこんな記載のあるページを見つけました。。

「+」→「_」、「=」→「」、「/」→「.

そうです!使用する言語によって(エンジニアによって)「一般的にはこう変換するだろ!?」の変換ルールが異なるのです、、

まとめ

従って…サービス提供側は 必ず! 「Base64 URL Safe」を指定する際には、変換ルールも仕様書に記載すべきなのです!

COMMENT

メールアドレスが公開されることはありません。