応用情報技術者試験 科目A 無料問題 4 / 10 ・ 分野3: 技術要素
https://shop.example.jp/ のページで動くスクリプトが、fetch で次の (A)・(B) の URL へ要求を送る。Cookie などの資格情報は送らない。 (A) https://api.example.jp/items へ送る。応答には Access-Control-Allow-Origin: https://shop.example.jp が付いている (B) https://shop.example.jp:8443/api/items へ送る。応答には CORS のヘッダーが付いていない ブラウザが、スクリプトに応答の中身を読ませるものはどれか。
- (A) は読ませず、(B) も読ませない
- (A) は読ませ、(B) は読ませない
- (A) は読ませず、(B) は読ませる
- (A) は読ませ、(B) も読ませる
正解と解説を見る
正解: B
正解の理由
ブラウザの同一オリジンポリシーでは、スキーム・ホスト名・ポート番号の3つがすべて同じときだけ同じオリジンとみなし、別のオリジンへの要求の応答は、スクリプトに読ませない。ただし、応答を返すサーバが Access-Control-Allow-Origin ヘッダーで要求元のオリジンを許可していれば、読ませる(CORS)。(A) はホスト名が違う別のオリジンだが、応答が要求元の https://shop.example.jp を許可しているので読める。(B) はホスト名が同じでもポート番号(8443 と既定の 443)が違う別のオリジンで、CORS のヘッダーが無いので読めない。
違う選択肢
「(A) は読ませ、(B) も読ませる」… (A) は合っているが、オリジンにはポート番号も含まれる。https://shop.example.jp/ のポート番号は既定の 443 なので、8443 番ポートは別のオリジンになる。同じサーバの別のポートで、別の管理者のアプリケーションが動いていることもあるため、ポート番号も区別する。
「(A) は読ませず、(B) は読ませる」… (B) を同じオリジンとみなし、(A) を読めないとしていて、2つを取り違えている。(B) はポート番号が違うので別のオリジンで、許可のヘッダーが無いので読めない。(A) は別のホストだが、応答のヘッダーで要求元のオリジンが許可されているので読める。
「(A) は読ませず、(B) も読ませない」… (B) は合っているが、CORS は、別のオリジンの応答を読ませてよいことを、応答を返すサーバの側がヘッダーで示す仕組みである。(A) のサーバは要求元のオリジンを許可しているので、ホスト名が違っても読める。
誰が何を守っているか
同一オリジンポリシーは、利用者が開いた別のサイトのスクリプトが、利用者のブラウザを使って、ログイン中の別のサイトの情報を読み取るのを防ぐ。CORS で読ませるかを決めるのは、応答を返すサーバの側である。Cookie などの資格情報を付けた要求の応答を読ませるには、Access-Control-Allow-Credentials ヘッダーも要り、Access-Control-Allow-Origin に「」(すべてのオリジン)を使えない。