セキュリティヘッダー
HTTP レスポンスヘッダーでブラウザのセキュリティ機能を制御し、XSS やクリックジャッキングを防ぐ仕組み
セキュリティHTTP
セキュリティヘッダーとは
セキュリティヘッダーは、HTTP レスポンスに付与するヘッダーで、ブラウザのセキュリティ機能を有効化し、XSS、クリックジャッキング、MIME スニッフィングなどの攻撃を防ぐ。
主要なヘッダー
| ヘッダー | 防ぐ攻撃 | 推奨値 |
|---|---|---|
Content-Security-Policy |
XSS、データインジェクション | default-src 'self' |
Strict-Transport-Security |
ダウングレード攻撃 | max-age=31536000; includeSubDomains |
X-Content-Type-Options |
MIME スニッフィング | nosniff |
X-Frame-Options |
クリックジャッキング | DENY |
Referrer-Policy |
リファラー情報の漏洩 | strict-origin-when-cross-origin |
Permissions-Policy |
ブラウザ機能の制限 | camera=(), microphone=() |
Content-Security-Policy (CSP)
ページが読み込めるリソースの出所を制限する。XSS 攻撃で注入されたスクリプトの実行を防ぐ。
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;
| ディレクティブ | 制御対象 |
|---|---|
default-src |
全リソースのデフォルト |
script-src |
JavaScript |
style-src |
CSS |
img-src |
画像 |
connect-src |
fetch, XHR, WebSocket |
frame-ancestors |
iframe での埋め込み元 |
Strict-Transport-Security (HSTS)
ブラウザに「このサイトには常に HTTPS でアクセスせよ」と指示する。HTTP → HTTPS のリダイレクト前に攻撃される中間者攻撃を防ぐ。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
CloudFront での設定
CloudFront のレスポンスヘッダーポリシーでセキュリティヘッダーを一括設定できる。
確認方法
# ヘッダーの確認
curl -I https://example.com
# securityheaders.com で A+ を目指す
よくある失敗
- CSP が厳しすぎてインラインスクリプトが動かない →
nonceやhashで許可 - HSTS を設定後に HTTP に戻せない →
max-ageを短くしてテスト X-Frame-Options: DENYで自サイトの iframe 埋め込みも拒否 →frame-ancestors 'self'を使う
実践的な知識は関連書籍でも得られる。