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」を指定する際には、変換ルールも仕様書に記載すべきなのです!
SNS開発18年で2つのSNSを開発・運用中の当社が、あなたのアイデアを形にするお手伝いをします。