【問題】
anicatch.netというドメインで動いているウェブアプリでHTML+JavaScriptを生成してブラウザに返す。帰って来たJavaScriptの中において、XMLHttpRequestを用い、別ドメイン(今回は api.anicatch.netというドメイン)上で動いているAPIサーバのapiを叩きたい。
で、Access-Control-Allow-Originで許されてないよっ!的なブラウザのエラーを喰らいつづける。
JavaScript文書からapi.anicatch.netを叩いていいのはanicatch.netで生成されたものだけに制限したい。
【調査1】
Access-Control-Allow-Origin試してみた。
jquery - Cross-Domain AJAX REST service HTTP Headers
http - Access-Control-Allow-Origin Multiple Origin Domains?
ajax - Error in chrome : Content-Type is not allowed by Access-Control-Allow-Headers
AjaxでAccess-Control-Allow-Originのエラーを回避する方法
なるほど分からん
【解決】
APIサーバのOSがDebianなので、apacheのhttpd.confが/etc/apache2/httpd.confにあって、ここに以下のような二行を挿入
<Virtualhost *:80> (いろいろ略) ServerName api.anicatch.net <Directory> # 1.「送り側からContent-Typeを指定しちゃらめぇぇ」 # ていうエラーが出続けたので、これも許しちゃう Header set Access-Control-Allow-Headers "Content-Type" # 2. 本命はこっち Header set Access-Control-Allow-Origin "http://anicatch.net" </Directory> </Virtualhost>
これをAPIサーバのアパッチの設定に追加することで、クロスドメインだけどanicatch.netからのhttpリクエストは許すようになっためでたしめでたし。あ、アパッチリスタートすんの忘れがち。
【調査2】
クロスドメイン制約とは、なんぞ
XMLHttpRequest のクロスドメインの制約についてまとめたφ(..)メモメモ
というと、図にするとこんな感じ?
で、
同一生成元ポリシーって何ぞ
同一生成元ポリシー (Same Origin Policy) と JSONP とは?
Mozilla Foundation セキュリティアドバイザリ
HTTPとセッション管理、同一生成元ポリシーがセキュリティの基礎
なるほどなるほど。
あるドメインAで生成された処理系(この場合JavaScript)は、別ドメインとは隔絶して動くべきだろう、と。気持ちは分かる。
で、生成元情報ってのは文書の中でどういう形で存在してんの?
RFC6454 The Web Origin Concept — ウェブ生成元の概念
【雑感】
ん、結局ワカンネ
DRYな備忘録として