CORS の Access-Control-Allow-Origin について
必要最低限の覚書 (特にサーバ側)

2018-03-12

特に、Access-Control-Allow-Origin に「null」という文字列を設定する(してはいけない)ことについて。

CORS (Cross-Origin Resource Sharing) については以下にそこそこ長い一通りの解説がある。

オリジン間リソース共有 (CORS) - HTTP | MDN

CORS は W3C の Cross-Origin Resource Sharing に規定されているが、先ほどの MDN では、その仕様書を置き換える新しい定義 (Fetch StandardCORS protocol) があるともある。

Access-Control-Allow-Origin

これに関するブラウザの動作を、以下の例で説明する。

  1. とある web コンテンツ A が、ドメイン http://example.com 上にあるものとする。
  2. A は、XmlHttpRequest (AJAX) で、何かコンテンツ X を読み込もうとしているものとする。
    ここで X が、A と同じドメイン (http://example.com) 上にあるコンテンツなのであれば、特に問題はない。
  3. だがここで X は、A のドメインに属するものではなく、別ドメイン、例えば http://bar.other にあるコンテンツなのだとする。
  4. このときブラウザは、http://bar.other の web サーバから返される Access-Control-Allow-Origin: で適切に許可されていないと、http://bar.other へのアクセスを行わない。

Access-Control-Allow-Origin: に指定できるのは、 W3C の Access-Control-Allow-Origin の規定 にもあるように、「*」か、Origin (1個だけ) か、「null」という文字列の、どれか一つである。

それぞれの場合について、以下で述べていく。

・ * を指定

Access-Control-Allow-Origin: *

どのドメインからのアクセスでも許可する。

・ Origin (serialized-origin) を指定

Access-Control-Allow-Origin: http://example.com

上の例では http://example.com からのアクセスのみ許可する。

・ null という文字列を指定

Access-Control-Allow-Origin: null

この場合、file:/// からのアクセス(のみ?)を許可すると述べるページがある。

W3C の規定 に、文字列「null」が指定できるとはあるのだが、それが file:/// と解釈されると書いてある箇所あるいは公式な情報源は分からなかった。

ということまで来た所で、Access-Control-Allow-Origin に null を指定してはいけないと書いてあるページ、ならびに W3C の文書を見つけた。

「null」を指定すると、Access-Control-Allow-Origin による制限をくぐり抜けてアクセスされ得るのだという。
というわけでサーバ側は「null」を指定してはいけない。

以上


index