• 運用保守・セキュリティ

セキュリティヘッダーとは?HSTS・CSPなどの役割と設定例|Apache・nginx・WordPress

セキュリティヘッダーとは?HSTS・CSPなどの役割と設定例|Apache・nginx・WordPress

「診断ツールで『セキュリティヘッダーがありません』と出たが、何をすればよいのかわからない」「HSTSやCSPという言葉は聞くが、自社サイトに必要なのか判断できない」。Webサイトの安全性を見直すと、こうした疑問にぶつかることがよくあります。

この記事では、Webサイトを管理する企業の担当者向けに、セキュリティヘッダーの意味、主な6種類の役割、Apache・nginx・WordPress・CDNでの設定場所と設定例、設定で失敗しやすい注意点を整理します。内容はMDN Web DocsとOWASP Secure Headers Projectの説明に基づいています(2026年10月23日時点)。

この記事の結論
  • セキュリティヘッダーは、ブラウザに「このページをどう扱うか」を指示する設定です。サイトの脆弱性そのものを直すものではなく、被害を減らす追加の守りです。
  • まず入れたいのは X-Content-Type-Options・X-Frame-Options(またはCSPのframe-ancestors)・Referrer-Policy です。HTTPSが全ページで使えているならHSTSも加えます。
  • HSTSのincludeSubDomains・preload、CSPの本番適用は慎重に。サブドメインが開けなくなる、画面が崩れるといった影響が出ることがあります。
  • 設定場所は Webサーバー(Apache・nginx)、WordPress、CDN のどこか1か所に決めると、重複や設定漏れを防げます。
目次
  1. セキュリティヘッダーとは
  2. 主なセキュリティヘッダー6種類の役割
  3. X-Frame-OptionsとCSPのframe-ancestorsの関係
  4. 現在は不要とされるヘッダー
  5. 設定する場所と設定例
  6. Apache(.htaccess)の例
  7. nginxの例
  8. WordPress(send_headersフック)の例
  9. CDNで設定する場合
  10. 設定するときの注意点
  11. 導入の進め方
  12. よくある質問
  13. まとめ

セキュリティヘッダーとは

セキュリティヘッダーとは、Webサーバーがページと一緒に返す「HTTPレスポンスヘッダー」のうち、ブラウザの動きを安全側に制限するための項目です。HTTPレスポンスヘッダーは、ページ本体とは別に送られる付加情報で、利用者の画面には表示されません。

たとえば「このページを他のサイトの枠(iframe)の中に表示させない」「必ずHTTPSで接続させる」といった指示をブラウザに伝えます。OWASP(Webアプリケーションのセキュリティに取り組む国際的な非営利団体)のSecure Headers Projectは、こうしたヘッダーの推奨値をまとめて公開しています。

ヘッダーだけでは安全になりませんセキュリティヘッダーは、ブラウザ側で攻撃の被害を減らすための仕組みです。SQLインジェクションのようなサーバー側の脆弱性や、古いPHP・CMSの脆弱性は防げません。ソフトウェアの更新や脆弱性への対策と組み合わせて使います。

主なセキュリティヘッダー6種類の役割

よく使われるのは次の6種類です。値の例は、MDNとOWASPの説明をもとにした一般的なものです。

主なセキュリティヘッダーと役割

ヘッダー役割値の例導入のしやすさ
Strict-Transport-Security(HSTS)一度アクセスしたブラウザに、以後は必ずHTTPSで接続させる。通信の盗み見や、HTTPへのすり替えを防ぐmax-age=31536000全ページがHTTPSなら導入しやすい。includeSubDomains・preloadは慎重に
X-Content-Type-Optionsブラウザがファイルの種類を中身から推測(スニッフィング)するのを止め、申告された種類どおりに扱わせるnosniffほとんどのサイトでそのまま入れられる
X-Frame-Options他のサイトがページをiframeで埋め込むのを禁止・制限する。見えない枠を重ねてクリックさせる「クリックジャッキング」対策SAMEORIGIN または DENY入れやすいが、正当な埋め込みがあると表示されなくなる
Content-Security-Policy(CSP)読み込んでよいスクリプトや画像の取得元を指定する。XSS(不正なスクリプトの埋め込み)の被害を減らす。frame-ancestorsで埋め込み元も指定できるframe-ancestors ‘self’ など(サイトごとに設計)難しい。レポートのみモードで試してから
Referrer-Policyリンク先に送る「どのページから来たか(リファラー)」の情報量を決める。URLに含まれる情報の漏えいを防ぐstrict-origin-when-cross-origin入れやすい。アクセス解析への影響は小さい
Permissions-Policyカメラ、マイク、位置情報などのブラウザ機能を、ページや埋め込んだ枠で使えないようにするcamera=(), geolocation=()使わない機能を止めるだけなら入れやすい
出典:MDN Web Docs の各ヘッダーの解説、OWASP Secure Headers Project。Permissions-Policyは、MDNでは一部の主要ブラウザが未対応の実験的な機能とされています。

X-Frame-OptionsとCSPのframe-ancestorsの関係

埋め込みの制限は、X-Frame-OptionsとCSPのframe-ancestorsのどちらでも指定できます。OWASPは、frame-ancestorsがX-Frame-Optionsに代わるものであり、両方ある場合はframe-ancestorsが優先されると説明しています。おおまかに「X-Frame-Options: DENY」は「frame-ancestors ‘none’」、「SAMEORIGIN」は「frame-ancestors ‘self’」に相当します。

特定の取引先サイトだけに埋め込みを許可したい場合は、frame-ancestorsで許可するサイトを並べます。X-Frame-Optionsの「ALLOW-FROM」は現在のブラウザでは無視されるため使いません。古いブラウザへの配慮として、両方を同じ内容で出しておく方法もあります。

現在は不要とされるヘッダー

X-XSS-Protectionは、OWASPでは非推奨とされています。かえって問題を起こすことがあるため、出す場合も「0」にし、XSS対策はCSPで行います。また、OWASPは、Server(Webサーバーのソフトとバージョン)やX-Powered-By(PHPのバージョンなど)のように、内部の情報を明かすヘッダーは削除するよう勧めています。攻撃者に古いバージョンを知られる手がかりになるためです。

設定する場所と設定例

セキュリティヘッダーは、Webサーバー、アプリケーション(WordPressなど)、CDNのいずれかで付けられます。複数の場所で付けると、同じヘッダーが2つ出たり、どこで変えればよいかわからなくなったりします。管理しやすい場所を1か所に決めるのが基本です。

設定場所ごとの特徴

設定場所向いているケース注意点
Apache(.htaccess)レンタルサーバーなど、サーバー本体の設定を触れない環境mod_headersが使えることが前提。サーバー本体の設定ファイルを触れるなら、そちらに書くほうが処理が速い
nginxVPS・クラウドで自社または委託先がサーバーを管理している階層ごとの設定の引き継ぎに独特のルールがある
WordPress(send_headersフック)サーバーの設定を触れず、WordPressだけ管理できるWordPressが作るページにしか付かない。画像などのファイルには付かない
CDNサイトの前段にCDNを使っているCDNの管理画面で設定する。サーバー側の設定と重ならないよう整理する

Apache(.htaccess)の例

<IfModule mod_headers.c>
  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 Strict-Transport-Security "max-age=31536000" "expr=%{HTTPS} == 'on'"
</IfModule>

IfModuleで囲むと、mod_headersがない環境でもエラーになりません。HSTSはHTTPS接続のときだけ付くようにしています。記述を誤るとサイト全体が表示できなくなることがあるため、編集前に元のファイルを保存しておきましょう。

nginxの例

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 Strict-Transport-Security "max-age=31536000" always;

HTTPSのserverブロックに書きます。「always」を付けると、エラーページなどにも付きます。注意したいのは、nginxでは下の階層(locationなど)に1つでもadd_headerがあると、上の階層のadd_headerは引き継がれないことです。特定のlocationにだけ別のヘッダーを足したら、セキュリティヘッダーがすべて消えていた、という失敗がよくあります。設定後は実際のレスポンスで確認しましょう。

WordPress(send_headersフック)の例

add_action( 'send_headers', function () {
    header( 'X-Content-Type-Options: nosniff' );
    header( 'X-Frame-Options: SAMEORIGIN' );
    header( 'Referrer-Policy: strict-origin-when-cross-origin' );
} );

send_headersは、WordPressがページのヘッダーを送るときに呼ばれる仕組み(フック)です。子テーマのfunctions.phpや自作の小さなプラグインに書きます。親テーマに直接書くと、テーマの更新で消えてしまいます。

CDNで設定する場合

CDN(コンテンツ配信ネットワーク)を使っている場合は、管理画面でレスポンスヘッダーを追加できることが多く、画像などを含むすべての応答にそろえて付けやすいのが利点です。サーバー側と重複しないよう、どちらで管理するかを決めます。

metaタグでは効かないものがありますMDNによると、X-Frame-OptionsやCSPのframe-ancestorsは、HTMLの<meta>タグに書いても無視されます。必ずHTTPレスポンスヘッダーとして送ってください。

設定するときの注意点

強く設定するほど安全になる一方で、サイトの表示や機能を壊すおそれもあります。特に次の点に注意してください。

  • HSTSは短い期間から始める:HSTSを受け取ったブラウザは、max-ageの期間中はHTTPで接続しなくなります。設定を間違えても、すぐには取り消せません。まず短い期間で問題がないことを確認してから、1年(31536000秒)などに延ばすと安全です
  • includeSubDomainsはすべてのサブドメインを確認してから:すべてのサブドメインにHTTPSを強制します。HTTPSに対応していない社内向けのサブドメインや古いシステムがあると、ブラウザから開けなくなります
  • preloadは原則として使わない:preloadは、ブラウザに最初から組み込まれる一覧(プリロードリスト)に登録するための指定です。OWASPは、一覧からの削除に時間がかかるため、標準ではpreloadを付けないよう勧めています。登録するなら、includeSubDomainsの影響を確認したうえで判断します
  • CSPは「レポートのみモード」から:CSPをいきなり本番で有効にすると、外部のスクリプトやインラインのスクリプトが止まり、アクセス解析、フォーム、地図、チャットなどが動かなくなることがあります。MDNは、まずContent-Security-Policy-Report-Onlyで違反だけを記録し、問題がなくなってから本番に切り替える方法を勧めています
  • X-Frame-Optionsで正当な埋め込みが壊れないか確認する:自社のページを取引先のサイトやグループ会社のポータルにiframeで載せている場合、DENYやSAMEORIGINで表示されなくなります。必要な埋め込みがあるなら、CSPのframe-ancestorsで許可するサイトを指定します
  • 設定後は実際のヘッダーを確認する:ブラウザの開発者ツール(ネットワーク)で、トップページ、下層ページ、エラーページに想定どおり付いているかを確かめます

CSPのレポートのみモードは、次のように指定します。報告の受け取り先(report-uriなど)は、別途用意が必要です。

Content-Security-Policy-Report-Only: default-src 'self'; frame-ancestors 'self'

導入の進め方

担当者が少ない企業でも進めやすい順番は、次のとおりです。

  1. 現状を確認する今どのヘッダーが返っているか、ServerやX-Powered-Byでバージョンが表示されていないかを確認する
  2. 設定場所を決めるサーバー、WordPress、CDNのどこで管理するかを決め、誰が変更できるかを整理する
  3. 影響の少ないものから入れるX-Content-Type-Options、Referrer-Policy、X-Frame-Optionsを入れ、埋め込みや表示に問題がないか確認する
  4. HSTSを短い期間で入れる全ページがHTTPSで表示でき、HTTPからHTTPSへ転送されることを確かめてから、期間を少しずつ延ばす
  5. CSPをレポートのみモードで試す違反の記録を見ながら許可する取得元を決め、問題がなくなってから本番に切り替える

開発会社や保守会社にサイトを任せている場合は、どのヘッダーをどこで設定しているかを、保守の資料に残してもらいましょう。担当者が替わっても設定の意図がわかり、サーバー移行のときに設定が抜け落ちるのを防げます。

無料の簡易セキュリティ診断
サイトのURLを入力すると、公開されている情報から、HTTPS、HTTPからHTTPSへの転送、HSTS、X-Content-Type-Options(nosniff)、X-Frame-Options・frame-ancestors、CSPの有無、PHPやWebサーバーのバージョン表示を確認できる簡易セキュリティ診断を用意しています。登録は不要です。
オーバーエックスのサポートオーバーエックスでは、Webシステム・業務システムの開発と保守、他社が開発したシステムの保守の引き継ぎ、PHPのバージョンアップに対応しています。「ヘッダーをどこで設定しているかわからない」「設定を変えたら画面が崩れないか不安」といった場合は、現状の確認から進め方をご案内します。詳しくは業務システム開発のページ、またはお問い合わせからご相談ください。

よくある質問

セキュリティヘッダーを入れれば、脆弱性診断は不要ですか?
不要にはなりません。セキュリティヘッダーはブラウザ側で被害を減らす仕組みで、サーバーやプログラムの脆弱性は直せません。脆弱性の有無は、診断や更新状況の確認で別に調べる必要があります。
X-Frame-OptionsとCSPのframe-ancestorsは両方必要ですか?
現在のブラウザでは、両方ある場合はframe-ancestorsが優先されます。古いブラウザへの配慮として、同じ内容で両方を出しておく方法が一般的です。内容が食い違わないように注意してください。
HSTSを設定したあと、HTTPSをやめることになったらどうなりますか?
max-ageの期間中、そのブラウザはHTTPで接続しなくなります。解除するには、HTTPSでmax-age=0を返し、ブラウザに受け取ってもらう必要があります。HTTPでは解除できないため、HTTPSを続けられる見通しが立ってから設定しましょう。
CSPを入れたらアクセス解析が止まりました。
アクセス解析などの外部スクリプトの取得元が、CSPで許可されていない可能性があります。本番の設定をいったん戻し、レポートのみモードで違反の内容を確認してから、必要な取得元を追加してください。

まとめ

セキュリティヘッダーは、ブラウザに安全な扱い方を指示することで、クリックジャッキングやXSS、通信のすり替えなどの被害を減らす設定です。X-Content-Type-Options、X-Frame-Options、Referrer-Policyのように入れやすいものから始め、HSTSは短い期間から、CSPはレポートのみモードから段階的に進めましょう。設定場所を1か所に決め、設定後は実際のヘッダーを確認することが大切です。ヘッダーだけでは脆弱性は直らないため、ソフトウェアの更新やWAFなど、ほかの対策と組み合わせて考えてください。

参考:MDN Web Docs「Strict-Transport-Security」「X-Content-Type-Options」「X-Frame-Options」「CSP: frame-ancestors」「Content Security Policy (CSP) implementation」「Referrer-Policy」「Permissions-Policy」「Apache Configuration: .htaccess」、OWASP Secure Headers Project「Response Headers」「Best Practices」、nginx「Module ngx_http_headers_module」、WordPress Developer Resources「send_headers」(いずれも2026年10月23日確認)。

OX

TechBase 編集部(株式会社オーバーエックス)

東京・秋葉原のシステム開発会社。業務システム・Webシステム・基幹システムの受託開発、システムリプレイス、自社パッケージ開発、要件定義の支援を手がけています。オーバーエックスの特徴を見る

この記事に関連するサービス システム保守・運用 業務システムやWebシステムの監視、障害対応、セキュリティ更新、小さな修正を月額の定額制で行います。他社が開発したシステムも、引き継ぎ調査から対応します。 サービスの詳細を見る

Contact

今すぐ無料相談

全国対応

Page Top