
CONTENT
HTTP通信はブラウザからのリクエストとwebサーバからのレスポンスで成り立っています。
リクエストやレスポンスには通信内容の本体と共に、様々な情報を伝えるヘッダが付加されます。
リクエストならメソッド、リファラ、ユーザーエージェント、クッキーなどで、 レスポンスなら通信ステータス、コンテンツタイプ、クッキーの設置など、その使用法は多岐にわたります。
今回その中で、セキュリティの向上に用いられているレスポンスヘッダをいくつか紹介します。
Content-Security-Policy
このヘッダに適切な値が設定されている場合、Javascript・CSS・フレーム・メディア(画像・音声・動画)・フォント・マニフェスト・オブジェクト等の、各種リソースの生成元を安全な状態に管理することができます。
Content-Security-Policy: <ディレクティブ> <ソース>;<ディレクティブ> <ソース> <ソース>;
といった形式で、複数のポリシーを定義できます。ディレクティブはリソース毎に設定できます。
ソースは複数設定することも可能です。
ブラウザはこのヘッダの値を参考に、2次的にアクセスするコンテンツのソースを制限します。
Content-Security-Policy: default-src 'self'
これが最も厳しい状態です。
これを受け取ったブラウザは各種リソースのソースを自サイト内に制限し、他サイトからの読み込みを行わなくなります。
また、HTMLタグのstyle属性やonclick属性、scriptタグの内部に記述されたスクリプト記述も無視するようになります。
このことはXSS脆弱性からサイトを守るのに大変有効に働きます。
不正なHTMLによって指示された画像の読み込みやスクリプトの実行を防いでくれるからです。
Content-Security-Policy: default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' js.my-cdn.com
このように記述することで、上述の厳しい状態から style属性によるCSSの設定と、特定のホストからのJSの読み込みだけを許可することができます。
ホストの指定は以下のように
https://js.my-cdn.com # httpsプロトコルに限定することも
*.my-cdn.com # ワイルドカードを使用することも
js.my-cdn.com/script.js # 対象ファイルを絞り込むことも
可能です。
なお、各ディレクティブの設定はデフォルト設定を引き継ぎません。先の例ですと、style-src や script-src から 'self' を省略すると自サイトからの読み込みは制限されます。 使用可能なディレクティブの種類やその他詳細については参考サイトをご確認ください(英語版はこちら)。
Strict-Transport-Security
このヘッダが設定されたHTTPレスポンスを受け取ったブラウザは、指定された期間中はHTTP通信が指定された場合でも必ずそのサイトに「HTTPS」通信でアクセスするようになります。
このことは平文の送信による情報の傍受を防ぐ役割があります。
Strict-Transport-Security: max-age=864000
max-age の値は秒数です。例では約10日の間、https通信を強制することができます。 この値をゼロにすれば、ブラウザの記憶を無効化することもできます。
Strict-Transport-Security: max-age=864000; includeSubDomains
このように記述することでサブドメインにも同様の効果を持たせることができます。
より具体的な事例が参考サイトに載っていますので、参考にしてください。
X-Frame-Options
フレーム要素(iframeなど)のソースに指定された場合、ブラウザはどう対応すべきかという指針を提示することができます。
もし、あなたの作成したコンテンツが悪意あるページにフレーム要素として組み込まれた場合、フレームを不可視化した上で、クリックしたくなるようなボタンやバナー等の上にかぶせるように配置したりされると、ユーザーはあなたのコンテンツに対して意図しない操作をさせられてしまう恐れがあります (これをクリックジャッキングと呼びます)。
この攻撃からサイトを守るために、次のように挙動を指定することができます。
X-Frame-Options: DENY
フレーム要素として呼ばれても何も表示しません。
X-Frame-Options: SAMEORIGIN
呼び出し元のページが異なるオリジン(プロトコル、ドメイン、ポートの1つ以上が異なる)である場合は何も表示しません。
参考サイト: MDN | X-Frame-Options ヘッダー
X-Content-Type-Options
一部のブラウザではHTTPヘッダで宣言されたコンテンツタイプではなく、レスポンス本文の内容からコンテンツタイプを決定します。 その場合、画像ファイルに偽装されたJavascriptファイルが、imgタグ読み込みから実行される可能性があります。 HTTPヘッダ X-Content-Type-Options の値を "nosniff" とすることで宣言通りのコンテンツ解釈がなされ、これを防ぐことができます。
X-Content-Type-Options: nosniff
Referrer-Policy
ブラウザがあるウェブサイトのリンクから別のウェブサイトへ遷移する際、通常はリクエストヘッダにリファラ情報を付加します。 Referrer-Policy を利用してこのリファラ情報を制御することで、機密性の高いURL情報が意図せず外部のサイトへ漏洩するのを防ぐことができます。
Referrer-Policy: strict-origin-when-cross-origin
プロトコルが同じ場合は完全なURLを送信し、プロトコルがHTTPSからHTTPになる場合はオリジンのみを送信します。
Referrer-Policy: no-referrer
いかなる場合でもリファラを一切送信しません。
Referrer-Policy: same-origin
同一オリジンの場合は完全なURLを送信し、オリジンが異なる場合はリファラを一切送信しません。
その他の設定と効果については参考サイトをご参照ください。