概要
セキュリティを勉強するにあたり、HTTPレスポンスヘッダにはどんな種類があるのか、どう設定すればいいかをまとめてみた。
ヘッダ | 目的 | 推奨設定 | その他設定 |
---|---|---|---|
X-Content-Type-Options |
ブラウザに対するMIMEタイプ自動推測(MIMEスニッフィング)の無効化 | nosniff |
なし |
X-XSS-Protection |
一部の古いブラウザでは、受信したHTML内の危険なスクリプトを検知して自動的にブロックする機能がある。 このヘッダを設定することで、このフィルターの挙動を制御できる。 最新ブラウザでは効果がなく、CSPの使用が推奨されている。 |
1; mode=block (XSSフィルターを有効化し、検知時はページのレンダリングをブロック) |
0 (XSSフィルターを無効化)1 (XSSフィルターを有効化し、検知時はブラウザがサニタイズして表示) |
Content-Security-Policy (CSP)詳細はこちら |
スクリプト・スタイル・iframe制御 | 例: default-src 'self'; script-src 'self';
|
report-uri , report-to
|
X-Frame-Options |
iframe表示制御 主にクリックジャッキング防止目的で使用される。 ※近年は、 Content-Security-Policy: frame-ancestores のほうが推奨されている。 |
DENY / SAMEORIGIN
|
ALLOW-FROM {URL} (※非推奨。主要ブラウザでは非対応。) |
Content-Security-Policy: frame-ancestors |
iframe制御 |
'none' / 'self'
|
複数ドメイン指定可 |
Strict-Transport-Security (HSTS) |
HTTPS強制 ※初回アクセスはHTTPSの必要あり ※開発環境で有効にするとHTTPでテストできなくなる ※ preload を使用すると取り消しが難しい |
max-age=31536000; (1年間)includeSubDomains; (サブドメも含める)preload (ブラウザのHSTS Preload Listに登録可能にする) |
max-age=86400 (短期) |
Public-Key-Pins ※非推奨・廃止 |
TLS証明書固定 | 主要ブラウザは非推奨・廃止 | pin-sha256="..." |
Referrer-Policy 詳細はこちら |
リファラー情報制御 | strict-origin-when-cross-origin |
no-referrer , same-origin , origin-when-cross-origin
|
Permissions-Policy |
ブラウザ機能制御。カメラやマイク、位置情報などの無断利用を防ぐ目的で使用される。比較的新しいセキュリティ関連のヘッダ | 必要機能のみ許可 |
geolocation=() , microphone=()
|
Expect-CT |
証明書透明性チェック 現在は主要ブラウザでCTが強制されているため、本ヘッダは役割を終えて廃止方向。古い設定のヘッダが残っていると指摘ポイントになることもあり。 |
enforce; max-age=86400 |
enforce, report-only |
Cache-Control |
キャッシュ制御 |
no-store (一切キャッシュに保存させない),no-cache (キャッシュ補保存させるが利用前にサーバ側に必ず再検証),private (ブラウザ個人キャッシュはOK,CDNなど共有プロキシにはキャッシュさせない),must-revalidate (有効期限切れキャッシュは再検証必須) |
max-age=0 (キャッシュは保存できるが、使う前に必ずサーバに再検証必須),public (CDNなどの共有キャッシュでもキャッシュ可能) など |
Expires |
キャッシュ期限 |
0 キャッシュ無効で即時サーバ取得。 |
過去日時も可。キャッシュ無効で即時サーバ取得。 |
Pragma |
HTTP/1.0互換キャッシュ制御 | no-cache |
なし |
Access-Control-Allow-Origin |
クロスオリジン許可 | 必要なドメインのみ |
https://example.com (特定オリジンのみ許可), * (どのオリジンでも許可する設定。認証後ページで* の設定だと脆弱性につながる可能性あり)、設定なし(クロスオリジンのアクセスは全て拒否) |
Access-Control-Allow-Methods |
許可HTTPメソッド | 必要なメソッドのみ |
GET , POST , OPTIONS , PUT , DELETE など |
Access-Control-Allow-Headers |
許可ヘッダ | 必要なヘッダのみ |
Authorization , Content-Type , ワイルドカード * も可 |
Access-Control-Allow-Credentials | Cookie付き許可 | 必要な場合のみ | true |
Origin(※リクエストヘッダ) | リクエスト元を示す | 自サイトのみ | |
Access-Control-Request-Method(※リクエストヘッダ) | プリフライト用 | 必要なメソッドのみ | PUT, 複数可 |
Access-Control-Request-Headers(※リクエストヘッダ) | プリフライト用 | 必要なヘッダのみ | Authorization, Content-Type |
Server | サーバ情報非表示 | 空 / カスタム | |
X-Powered-By | 技術スタック非表示 | 削除 | |
Cross-Origin-Embedder-Policy (COEP) | クロスオリジン埋め込み制御 | require-corp | unsafe-none |
Cross-Origin-Opener-Policy (COOP) | ウィンドウ分離 | same-origin | same-origin-allow-popups |
Cross-Origin-Resource-Policy (CORP) | クロスオリジンリソース制御 | same-origin | same-origin, cross-origin |