24988


**XMLHttpRequestで他オリジンへGET送信したら、コンソールログに下記エラーが表示されました**  
※GET送信内容自体は、(送信先で)受信できました

> XMLHttpRequest cannot load
> [http://foo.送信先.com/](http://foo.%E9%80%81%E4%BF%A1%E5%85%88.com/). No  
>  'Access-Control-Allow-Origin' header is present on the requested  
>  resource. Origin
> '[http://bar.送信元.co.jp](http://bar.%E9%80%81%E4%BF%A1%E5%85%83.co.jp)' is
> therefore not allowed  
>  access.

* * *

**質問**  
・どう評価したら良いでしょうか？  
・「同一生成元ポリシー」には、データ送信は含まれないのでしょうか？  
・それとも、違反ではあるけれどもデータが送信されているのでしょうか？ つまり非推奨？  

* * *

**最終的に知りたいこと**  
・XMLHttpRequestで他オリジンへGET送信してもよいか  
※送信元での結果取得は不要です

* * *

**追記**

・GETリクエスト送信だけを XMLHttpRequest
を使用して行う場合、「Webサーバー側でクロスオリジンを認めない」限りコンソールログにエラーメッセージは出力される、ということでしょうか？


CC BY-SA 3.0
2016-05-18T14:54:00.490
24978
2016-05-20T10:29:58.530
2016-05-20T10:29:58.530
7886
7886
question
javascript ajax
XMLHttpRequestで他オリジンへGET送信したら、送信内容自体は(送信先で)受信できたのにエラー表示


クロスオリジン、つまり別ドメインからのリクエストを受け付けるかどうかを決定するのはWebサーバーです。  
コンソールログに出力されたエラーメッセージは「 **Webサーバー** はクロスオリジンを認めるのであれば、その旨を明示すべき」と言っています。

説明が重複しますが、次のステップですのでブラウザーとしてはリクエストは送信されますし、エラーで正しいです。

  1. ブラウザーはドメインA Webサーバーへリクエストを出す
  2. ドメインA Webサーバーは「ドメインBへのリクエスト」を含むコンテンツを返す
  3. ブラウザーはコンテンツに従いドメインB Webサーバーへリクエストを出す
  4. ドメインB Webサーバーは単純にレスポンスを返す
  5. ブラウザーはレスポンスヘッダーにクロスオリジンを認める旨が含まれていないことを検出し、エラーとする


CC BY-SA 3.0
2016-05-18T21:27:12.507
24981
2016-05-18T21:27:12.507
4236
24978
answer


クロスオリジンでのGETリクエスト送信自体は XMLHttpRequest を使わずとも `<script>` タグや `<img>`
タグでできていたことですから、特に制限はありません。例えば画像のURLに情報を埋め込むのはアクセス解析でよく使われる手法です。他にも `<form>`
の送信先には別オリジンのURLを指定することができ、Javascriptから送信操作が行えます。

問題になるのはこれらの手段では不可能だったこと、つまり

  * レスポンスをJavascriptで自由に読み取ること
  * GETやフォーム送信以外のリクエストを送信すること

であり、同一オリジンポリシーはこれらを制限するようになっています。

送信自体が制限される後者の場合はプリフライトリクエストで事前に確認が行われますが、前者の場合は単にレスポンスを読み取れないだけ、という挙動になります。

## 参考

  * [同一オリジンポリシー - Web セキュリティ | MDN](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy#Cross-origin_network_access)
  * [HTTP アクセス制御 (CORS) | MDN](https://developer.mozilla.org/ja/docs/HTTP_access_control)

* * *

読み取れないだけと書きましたが、規格上はレスポンスを受け取ったらすぐにチェックが行われます。またチェックに失敗した場合は
**ネットワークエラーという扱い** で、Javascriptからはリクエストが成功したのかどうかもわかりません。

<https://www.w3.org/TR/cors/#simple-cross-origin-request-0>

それをコンソールに表示するのはブラウザの機能ですから、[404などで表示される場合と同様](https://ja.stackoverflow.com/a/11293/8000)、ブラウザの設定で非表示にできるぐらいで、Javascript側で制御することはできないかと思います。


CC BY-SA 3.0
2016-05-19T06:40:01.407
24988
2016-05-19T13:49:56.027
2017-04-13T12:52:39.113
-1
8000
24978
answer