セキュリティヘッダーとは
セキュリティヘッダーは、WebサーバーがHTTPの応答に付けて、ブラウザに備わった防御機能を有効にさせるHTTPヘッダーの総称です。サーバーの設定を足すだけで、アプリケーションのコードを変えずに、守りを1層増やせます。
セキュリティヘッダーが必要な理由
XSS、クリックジャッキング、通信のダウングレード、ファイル種別の誤認といった攻撃は、ブラウザ側の機能で防げるものがあります。ただし、機能は、サーバーが指示を出して初めて働きます。
セキュリティヘッダーは、脆弱性そのものを直すものではなく、被害を抑える補助です。診断ツールが最初に確認する項目でもあり、未設定の指摘が出やすい部分です。
セキュリティヘッダーの仕組み
| ヘッダー | 役割 | 値の例 |
|---|---|---|
| Strict-Transport-Security | HTTPSでの接続を強制する | max-age=31536000 |
| Content-Security-Policy | 読み込み元を制限し、XSSの被害を抑える | default-src 'self' |
| X-Frame-Options | iframeへの埋め込みを制限する | SAMEORIGIN |
| X-Content-Type-Options | ファイル種別の推測を止める | nosniff |
| Referrer-Policy | 参照元URLの送信範囲を決める | strict-origin-when-cross-origin |
| Permissions-Policy | ブラウザ機能の利用を制限する | camera=(), microphone=() |
すでに役目を終えたものもあります。X-XSS-Protection は、OWASPが付けないよう勧めています。Expect-CT と Public-Key-Pins も、使いません。逆に、Server や X-Powered-By にバージョン番号が出ている場合は、消すか、簡素にします。
セキュリティヘッダーの確認方法
開発者ツールの「ネットワーク」タブで、HTML文書の「レスポンスヘッダー」を開きます。コマンドでは、応答ヘッダーをすべて表示できます。
curl -s -D - -o /dev/null https://example.com/
WindowsのPowerShellでは curl.exe -s -D - -o NUL https://example.com/ です。表の6つのうち、どれが返っていないかを見ます。
セキュリティヘッダーの設定例
CSPは、段階的な導入が必要なため、ここには含めていません。CSPの解説の手順で、別に進めます。
Apache(.htaccess)の例です。
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000" env=HTTPS
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>
nginxの例です。
add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
WordPress(子テーマのfunctions.php)の例です。
add_action('send_headers', function () {
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: SAMEORIGIN');
header('Referrer-Policy: strict-origin-when-cross-origin');
header('Permissions-Policy: camera=(), microphone=(), geolocation=()');
if (is_ssl()) {
header('Strict-Transport-Security: max-age=31536000');
}
});
よくある間違いと注意点
- nginxでは、
locationブロックの中に別のadd_headerが1つでもあると、上の階層のadd_headerは引き継がれません。設定後に、代表的なURLで実際の応答を確かめます。 alwaysを付けないと、404や500などのエラー応答には、ヘッダーが付きません。- WordPressのキャッシュプラグインが、静的なHTMLをPHPを通さずに返している場合、PHPで付けたヘッダーは出ません。サーバー設定で付けます。
- ヘッダーを付けても、脆弱性は消えません。更新や入力値の処理の修正と、組み合わせて行います。
Webサイト セキュリティチェッカーで確認する
Webサイト セキュリティチェッカーは、上の6つのヘッダーの有無と、値の弱さ、バージョン番号を表に出しているヘッダー、CORSの設定の緩さを診断します。URLを入れるだけで、コマンドなしで一覧できます。
関連用語
関連する用語
サイトの設定を無料で確認する
サイトのURLを入力するだけで、セキュリティヘッダー などの設定状況を診断できます。Webサイト セキュリティチェッカー「Security Checker X」は、登録なしで使えます。









