ここでいうアプリとは、iOSアプリ、Androidアプリの話になります。
またWebAPIの認証方式はOAuth2を想定しています。
jsonでユニコード エスケープすると視認性が低下する
WebAPIでjsonが流行ってる理由として視認性が優れていることもあると思います
たとえばこんなの
{
"name":"たろう",
"title":"自己紹介",
"comment":"はじめまして"
}
人間に優しく、わかりやすいです
でもunicode escapeするとこんなレスポンスになります
{
"name":"\u305f\u308d\u3046",
"title":"\u81ea\u5df1\u7d39\u4ecb",
"comment":"\u306f\u3058\u3081\u307e\u3057\u3066"
}
人間では解読できなくなる
アプリ開発する上で、APIレスポンスのこのフィールドが、UI上のここに当てはまっているか?というのを実際にAPIのレスポンスと照らし合わせながら確認することも多いと思います。
そのときにunicode escapeされていると、作業が捗らなくなります。
jsonでユニコード エスケープするとレスポンス容量が増加する
識別子一文字一文字が1byteとってしまうので容量増加になってしまいます
ピンと来ない人はこちらを読むといいかと思います
文字コード考え方から理解するUnicodeとUTF-8の違い | ギークを目指して
http://equj65.net/tech/charcode/
なぜ ユニコード エスケープが必要なのか
json をunicode escapeする理由はセキュリティが理由で
- jsonを直接呼び出すことによるXSS
こちらは古いブラウザを使っていると、json中にjavascriptの任意のコードを仕込むと、それが実行されてしまうというブラウザのセキュリティホールです。以下が詳しいです
PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)~JSON等の想定外読み出しによる攻撃~ - ockeghem(徳丸浩)の日記
http://d.hatena.ne.jp/ockeghem/20110907/p1
上を読むとわかるのですが、 PHPのjson_encode()をOPTIONなしでそのまま使っていると、日本語はユニコードエスケープされるのですが、XSS対策としては足りてないです
アプリAPIではjson unicode escapeが必要なのか?
ユーザが投稿したコンテンツを返すAPIなどは、直接ブラウジングされた場合の注意が必要ですが、
PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)~JSON等の想定外読み出しによる攻撃~ - ockeghem(徳丸浩)の日記
http://d.hatena.ne.jp/ockeghem/20110907/p1
こちらにあるように
Content-Type:application/json; charset=UTF-8
X-Content-Type-Options: nosniff
をレスポンスヘッダに設定しておけば、メジャーブラウザではIE7以前以外は問題なさそうです。
結論
利用サービスにもよるだろうけど、json unicode escapeをやめるのは選択肢として考えるのもいいのではないでしょうか
アプリ用APIの話で書いたつもりが、API全般の話になってた。
自分の認識が間違ってなければ、IE7以下を無視するのであれば、APIならなんでもjson unicode escapeしなくてもよさそう。
おまけ
著名アプリで使われてるAPIはどうなのか実際に見てみた
- メルカリ
- unicode escapeされてる
- minne
- unicode escapeしてない
jsonハイジャック
OAuth2を使うようにしてcookieを直接受け取るようなAPIを作らなければ問題ないはずです
JSONをvbscriptとして読み込ませるJSONハイジャック(CVE-2013-1297)に注意 | 徳丸浩の日記
http://blog.tokumaru.org/2013/05/JSON-information-disclosure-vulnerability-CVE-2013-1297.html