主要なHTTPヘッダ
Host
Httpヘッダ唯一の必須ヘッダです。
ブラウザからサーバに対して、サーバのホスト名とポート番号を指定します。
サーバが名前ベースの仮想ホストをサポートしている場合、同じサーバーアドレスでもHostヘッダで別々のホスト名を指定することで、仮想的に2つのサーバとして振舞うことができます。
仮想ホストとは、一台のサーバで複数のドメイン名によるサービスを提供すること。
ポート番号が指定されなかった場合は、要求されたサービスの既定のポートが設定されます(HTTPSは443、 HTTP は80)
Content-type
実際にどんな形式のデータを送信したかを表すヘッダです。
レスポンスにおいては、ヘッダーはクライアントに返されたコンテンツの種類を伝えます。
リクエストでは、クライアントがサーバーに送られたデータの種類を伝えます。
レスポンスとリクエストの意味合いは一緒で、どちらも送ったデータの種類が何であるかを指定しておくものです。
User-agent
クライアントのユーザーエージェントのバージョン等を識別できるようにするものです。
ブラウザが使用しているパソコンのブラウザの情報などを取得することができ、ユーザーエージェント情報を使い「スマートフォン」と「パソコン」の判定をして、表示するページの切り替えなどが可能です。
しかし、使用しているブラウザによっては、メニューから簡単にユーザエージェントを変更できてしまいます。
ユーザーエージェントは偽装も可能なため必ず正しい情報とは限りません。
Accept
クライアント側が受信可能であるレスポンスデータのメディアタイプを指定します。
メディアタイプを省略した場合は,すべてのメディアタイプが受信可能であることを表す「*」が自動的に指定されます。
Referer
現在表示しているページへのリンク先を持った、直前のウェブページのアドレスが含まれています。
Referer ヘッダーにより、サーバーは人々がどこから訪問しに来たかを識別することができます。
次のような場合は、ブラウザーはRefererヘッダーを送信しません。
- 参照していたリソースがローカルの "file" または "data" の URI の場合
- 安全ではない HTTP リクエストが使用されており、それを参照しているページが安全なプロトコル (HTTPS) で受信された場合
Refererの問題点・脆弱性
aタグにtarget="_blank"を設定をした場合、ちゃんとrel=noreferrerを設定する必要があります。しかし、なぜnoreferrerを設定する必要があるのでしょうか?
それは、URL 経由で他の場所に機密データを渡してしまう可能性があるということです。
noopenerを付けなければ、JavaScriptでwindow.openerというオブジェクトが操作できるようになり、 新しいタブで開いたページから元タブのページの操作が可能となります。
target="_blank"で開かれたページは、元のページを window.opener オブジェクトとして持つのでリンク先のページから window.openerを使うことで、元ページを操作することが出来てしまう。そのため、window.openerを使って「元ウィンドウを操作してフィッシングサイトに遷移されたり」悪用される可能性が考えられます。
また、refererを残したまま新しいタブで開いたリンク先で、いろんなscriptが動いてた場合、元ページのパフォーマンスにも影響があるとも言われています。
対処法としては、target="_blank"をつけたaタグに**rel="noopener noreferrer"**を設定することで解決できます。
rel="noopener"
**「別タブの遷移先から、window.openerを参照できなくなる」**ものです。
noreferrer
**「遷移元のリソースからリファラーを送らないようにブラウザに指示を出す」**効果があり、noopener と同様の効果も持ちます。
referer対策には、aタグにnoopener noreferrerの二つを設定されていることがありますが、noopener は古いブラウザではサポートされていません。 noreferrer の方がサポートしているブラウザは広いため、noopener を使えない場合として併用されています。
Chrome 88からtarget=_blankが付与されたリンクには、noopenerが自動的に付与されるようになるらしいです。
参照:https://forest.watch.impress.co.jp/docs/serial/yajiuma/1291549.html
Accept-Encoding
クライアントがサポートしている圧縮方式をサーバーに教えるヘッダです。
サーバーは送られてきた Accept-Encoding ヘッダの値を確認し、クライアントに合う圧縮アルゴリズムでコンテンツを圧縮して返却します。
例)
Accept-Encoding: gzip, deflate, br
Authorization
クライアントからサーバーへ認証の種類やユーザ名・パスワード情報を知らせるものです。
認証の種類としては、例としてBasic認証などが使われます。
Basic認証は「ユーザー名:パスワード」の形式にコロンを挟んで連結してBase64形式へと変換したものとなります。
Location
リダイレクト先のURLを示すHttpヘッダです。