document.referrerでiframeからクロスドメインの親ページのURLを取得できる理由について
気になったので調べた内容をまとめた。
iframeからクロスドメインの親ページのURLを取得する
document.referrer
でできる(ほとんどのブラウザで動作するっぽい。Chrome, Firefox, Safari, Edge, IE11の最新版はどれも動いた)- 同一ドメインの場合は
document.location.href
でもいける - この違いは何なのか気になったので調べた
そもそもdocument.referrerは何を取得しているのか
HTTPリファラとは何か
HTTPリファラ(英: HTTP referer)あるいは単にリファラは、HTTPヘッダの1つで、インターネット上の1つのウェブページまたはリソースから見て、それにリンクしているウェブページやリソースのアドレスを指す。
なぜdocument.referrer
でiframeの親ページのURLを取得できるのか
- 親ページからiframeの内容を取得するために発行されるHTTPリクエストのヘッダーにHTTPリファラが含まれている場合が多いから(もしHTTPリファラが含まれていない場合は取得できない)
- 例えばiframeのタグは下記のようになるが、src属性にURLが指定されているのでページ描画時にリソース読み込みの対象になる
<iframe src="https://..."></iframe>
document.referrer
にクロスドメイン制約がないのはなぜか
document.referrer
は値を書き換えてもHTTPリクエストは発行しない(既に発行済のHTTPリクエストのヘッダー情報を参照しているだけなので)- そもそもJavaScriptからは書き換えられない
document.location.href
にクロスドメイン制約があるのはなぜか
document.location.href
で取得されるURLと実行時のURLのドメインが異なるとクロスドメイン制約に当たる- そもそもクロスドメイン制約は、悪意あるJavaScriptが異なるドメインに対してリクエストを発行することを防ぐためにある
document.location.href
の値を書き換えると任意のURLに対してHTTPリクエスト(GET)を発行出来てしまうのでクロスドメインの場合は参照不可の仕様と思われる
HTTPリファラを制限できないか
所感
まだまだHTTPリクエストのヘッダーは分からない属性が多いので1つずつ理解していきたい