HTTP Security Headers

Essential Security Headers

HeaderProtects AgainstPriority
Content-Security-PolicyXSS, data injectionHigh
Strict-Transport-SecurityHTTP downgrade, MITMHigh
X-Frame-OptionsClickjackingHigh
X-Content-Type-OptionsMIME sniffingHigh
Referrer-PolicyReferrer leakageMedium
Permissions-PolicyBrowser feature abuseMedium
Cross-Origin-Opener-PolicySpectre, XS-LeaksMedium

Nginx Configuration Example

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(self)" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;

# Content Security Policy (customize for your site)
add_header Content-Security-Policy "
  default-src 'self';
  script-src 'self' 'nonce-RANDOM' https://cdn.trusted.com;
  style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
  font-src 'self' https://fonts.gstatic.com;
  img-src 'self' data: https:;
  connect-src 'self' https://api.example.com;
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self';
" always;

CSP Directive Reference

DirectiveControlsCommon Value
default-srcFallback for all'self'
script-srcJavaScript'self' 'nonce-xxx'
style-srcCSS'self' 'unsafe-inline'
img-srcImages'self' data: https:
connect-srcfetch/XHR/WebSocket'self' https://api.com
frame-ancestorsWho can embed'none' or 'self'