HTTP security headers, the complete list explained
What HTTP security headers are, the full list with status and what each protects against, and where each one is documented.
Last update:
Security headers are HTTP response headers that tell the browser how to protect the page and the people using it. Your server sends them with each response, and the browser does the enforcing: blocking injected scripts, refusing plain HTTP, keeping the session cookie away from other sites.
Most of them take one line of server configuration. This page is the full list, with each header's status, what it protects against, and the action to take, linking to the page that covers it in depth. The natural first step is to run your own site through the security headers scanner and see which of these you already send.
The security headers at a glance
| Header | Status | Protects against | Action |
|---|---|---|---|
Content-Security-Policy | ✅ Good | XSS, injection, exfiltration | Deploy via report-only first |
Strict-Transport-Security | ✅ Good | SSL stripping, cleartext hops | max-age=63072000; includeSubDomains |
Set-Cookie attributes | ✅ Good | Session theft, CSRF | __Host- + Secure + HttpOnly + SameSite |
X-Content-Type-Options | ✅ Good | MIME-sniffing XSS | nosniff on every response |
Referrer-Policy | ✅ Good | URL leaks to third parties | strict-origin-when-cross-origin |
Cache-Control | ✅ Good | Cached sensitive pages | no-store on personal data |
Cross-Origin-Resource-Policy | ✅ Good | Spectre-class leaks, hotlinking | same-site |
Cross-Origin-Opener-Policy | ✅ Good | Window takeover, XS-Leaks | same-origin |
Cross-Origin-Embedder-Policy | ✅ Good | Cross-origin data in your process | require-corp for isolation |
Permissions-Policy | 🧪 Experimental | Unwanted camera, mic, geolocation use | Deny unused features |
X-Frame-Options | ✅ Good | Clickjacking in old browsers | DENY alongside frame-ancestors |
Server, X-Powered-By and friends | ❌ Risky | They leak your stack | Remove them |
X-XSS-Protection | ⚠️ Deprecated | Nothing (its filter caused XSS) | Remove; use CSP |
Feature-Policy | ⚠️ Deprecated | Replaced by Permissions-Policy | Migrate |
Public-Key-Pins / Expect-CT | ⚠️ Deprecated | Dead TLS experiments | Remove |
How to read the table
- Good means fine to ship in production; the Action column is the value to send.
- Risky means the header itself is the problem; sending it weakens your position, so the action is to remove it.
- Experimental means not fully standardized or limited to some browsers; the Permissions-Policy header is Chromium-only, though other browsers ignore it harmlessly.
- Deprecated means browsers removed or replaced it; the row names what to do instead.
Each header has exactly one page, and the row links there wherever it lives. Content Security Policy and the other report-emitting policies are documented in the Policies section, the delivery of their reports in the Reporting API section, and the rest in this section.
Where to start
For a site that sends none of these, this order pays off fastest:
- Scan the site with the security headers scanner to see what you send today.
- Ship the one-liners: Strict-Transport-Security, X-Content-Type-Options, and Referrer-Policy.
- Harden the session cookie with the
Set-Cookie attributes,
starting from
__Host-plusSecure,HttpOnly, andSameSite. - Deploy a Content Security Policy in report-only mode and tighten it from the reports before enforcing.
- Add the cross-origin pair, Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy.
- Remove what the table marks Risky or Deprecated: the disclosure banners and the dead TLS headers.
See also
- Browser security policies overview, the report-emitting policies the table links out to
- Reporting API overview, how the policies deliver their violation reports
- Security headers scanner to check what your site sends
- How to improve your security headers grade, the fix list for a low scan grade