同一生成元ポリシー
同一生成元ポリシー
同一生成元ポリシー(same origin policy)とは、Webページ上で動作するJava Scriptなどのプログラムが読み出そうとするデータが、プログラムとは同じ生成元になかった場合に、読み出しを制限するものです。ここで、生成元(origin)とはリソースのURLの内(プロトコル、ポート番号、ホスト名)の3つの識別情報を意味します。つまり、Web上の2つのリソースが同じ生成元にあるとは、次の3つの条件の全てを満たすことをいいます。
- プロトコルが同じである。
- ポート番号が同じである。
- ホスト名が同じである。
例えば、リソースAのURLが"http://www.example.com/dir/A.html"とすると、
- http://www.examle.com/dir2/B.html
はAと同じ生成元にありますが、
- https://www.examle.com/dir/C.html (プロトコルhttpsが異なる)
- http://www.example.com:81/dir/D.html (ポート番号81が異なる)
- http://example.com/dir/E.html (ホスト名example.comが異なる)
はAと異なる生成元にあることになります。特に、異なるドメイン(ホスト名)にあるリソースは、異なる生成元にあります。基本的に異なる生成元にあるデータは読み込むことができません。
同一生成元ポリシーは、クライアントが意識せずに悪意のあるプログラムが実行されるのを防ぐことを目的に設けられています。これは、クライアントサイドのプログラミング言語にとってセキュリティーを守る上で重要な概念となっています。
異なる生成元との通信をクロスドメイン通信といいます。URLからデータを読み出すAPIであるXMLHttpRequestは、異なる生成元のデータは読み出せませんでしたが、新しいXMLHttpRequest Level2ではそれが可能となっており、同一生成元ポリシーの目的を守りながら条件付きでクロスドメイン通信を行うことができます。Webブラウザが、「現在閲覧しているWebページ」の生成元から、「異なる生成元にあるリソース」にアクセスした際に、「異なる生成元」であるWebサーバ側で、そのアクセスを許可するかどうかを設定することができます。これを、CORS(Cross-Origin Resource Sharing)といいます。CORSはW3Cより仕様が勧告されています。Webサーバ側でアクセスを許可するには、HTTPレスポンスヘッダの"Access-Control-Allow-Origin:"の値に許可したい生成元を指定します。例えば、全ての生成元からのアクセスを許可するには、
- Access-Control-Allow-Origin: *
とします。各Webサーバでの設定法については、例えばhttp://www.w3.org/wiki/CORS_Enabledをご覧下さい。
FireFox等でも、フォントが置かれているWebサーバでCORSが設定されていてアクセスが許可されていれば、@font-faceにより異なる生成元のフォントデータを読み込むことができます。