Research ยท August 2026
HTTP Security Headers Across the Top 10,000 Domains (August 2026)
We requested the homepage of 10,000 of the web's most-linked domains over HTTPS and read the security headers that came back. 8,506 answered. Even the oldest and cheapest headers are far from universal, and completeness is rare: only 6.8% of these sites set all six, while 20.3% send none at all.
- send HSTS
- 56.7%
- send a CSP
- 37.6%
- set all six headers
- 6.8%
- set none at all
- 20.3%
Percentages are of the 8,506 domains that answered over HTTPS, unless stated otherwise.
The old headers are winning
- Strict-Transport-Security (HSTS)56.7% (4,820)
- Clickjacking protection (X-Frame-Options or frame-ancestors)60.9% (5,183)
- X-Content-Type-Options: nosniff51.1% (4,349)
These three have been recommended for over a decade and cost one line of server config each, yet none of them reaches two thirds of this sample. HSTS leads, helped by managed platforms and CDNs that send it by default โ a large share of these domains have it without anyone deciding to. That also means the figure measures platform defaults as much as deliberate choices.
Of the 4,820 domains sending HSTS, 55.6% extend it to subdomains with includeSubDomains and 35% ask for preload. 78.1% set a max-age of at least six months, the floor the browser preload lists require โ a short max-age narrows the window an attacker has to work with but does not close it.
CSP: present, but pulling its punches
- Sends an enforced Content-Security-Policy37.6% (3,200)
- โฆof which allow 'unsafe-inline' in script-src32.8% (1,048)
- Report-only CSP (monitors, never blocks)4.3% (364)
The unsafe-inline share is of the 3,200 enforced policies, not of all domains.
CSP is the one header on this list that can genuinely stop cross-site scripting, and it is also the least adopted of the older three โ 37.6% of these domains send an enforced policy. That gap is a fair reflection of cost: the other headers are a line of config, while a useful CSP has to be reconciled with every script the site loads.
Adoption alone also overstates the protection. 32.8% of those policies allow 'unsafe-inline' in script-src, which permits exactly the inline script injection CSP exists to prevent โ so roughly one in three of the policies that exist are substantially weakened by their own contents. A further 4.3% of all domains send only a report-only policy, which blocks nothing by design.
It is the same shape as the DMARC finding in our email authentication study, where 29.4% of published records sit at p=none: the mechanism gets deployed, then parked in a state that observes rather than enforces. Retrofitting a strict CSP means removing every inline handler and <script> block or moving to nonces, which is real work โ so the policy ships permissive and stays that way.
The newer headers nobody sets
- Referrer-Policy32.6% (2,774)
- Permissions-Policy17% (1,442)
- Cross-Origin-Opener-Policy11.8% (1,004)
Adoption drops sharply for anything standardised in the last several years. These headers control what leaks in the Referer string, which browser capabilities a page may use, and whether a page shares a browsing context group with its opener. None of them are hard to set; they simply have not had the decade of scanner nagging and compliance-checklist pressure the older three have.
How many headers does a typical site set?
- 0 headers20.3% (1,724)
- 1 header17.1% (1,454)
- 2 headers12.7% (1,084)
- 3 headers14.8% (1,257)
- 4 headers13.3% (1,135)
- 5 headers15% (1,277)
- 6 headers6.8% (575)
Counting HSTS, CSP, clickjacking protection, nosniff, Referrer-Policy and Permissions-Policy.
Only 6.8% of domains set all six, while 20.3% send none at all. The bulk of the web sits in the middle: a couple of headers inherited from a platform default, and nothing chosen deliberately. That middle is where the cheapest security wins on the entire internet are โ each missing header is a one-line config change.
Plain HTTP still answers
Of the 7,949 domains that responded on port 80 at all, 92.9% redirect to HTTPS. The remainder answer the request over an unencrypted connection โ which means a first visit, before any HSTS policy is cached, is open to interception. HSTS only protects a browser that has already seen the header once, which is exactly why the preload list exists and why only 35% using it matters.
What is serving all this
- Cloudflare33% (2,807)
- Not disclosed19.7% (1,678)
- nginx15.4% (1,314)
- Other12.1% (1,031)
- Apache8.8% (751)
- AWS2.9% (250)
- Google2.5% (212)
- OpenResty1.5% (127)
Read as a rough signal rather than a census: the Server header is trivial to change or suppress, and a CDN in front of an origin reports itself rather than the thing behind it. Suppressing it is mild security-through-obscurity โ it slows down automated scanning without stopping anyone determined.
Check your own site
Every header in this study is available as a free check. Run them on any URL:
Methodology
On 2026-08-08 we took the top 10,000 domains from the Majestic Million list โ ranked by the number of distinct referring subnets, so it reflects how widely a domain is linked rather than raw traffic โ and issued a single GET to https://<domain>/, following redirects, then read the response headers. 8,506 domains answered; the rest failed to resolve, refused the connection or timed out, and are excluded from the sample rather than counted as missing headers.
A domain counts as having CSP only if it sends an enforced Content-Security-Policy; Content-Security-Policy-Report-Only is reported separately because it blocks nothing. Clickjacking protection counts either X-Frame-Options or a CSP frame-ancestors directive, since the latter supersedes the former. The unsafe-inline figure looks at the script-src directive, falling back to the whole policy where no script-src is present.
The HTTP-to-HTTPS figure is measured only against domains that answered on port 80, since a domain that refuses the connection outright is not the same as one that serves cleartext. We requested with a descriptive user agent identifying this research, and made one request per domain.
Two caveats worth stating. Headers are read from the homepage only โ a site may set stricter policies on authenticated routes. And the presence of a header says nothing about whether its value is well constructed, which is precisely why the unsafe-inline and max-age breakdowns are reported alongside the raw adoption rates.
These figures are free to cite or reproduce with attribution and a link to this page. Data collected ; we re-run the scan periodically and update the numbers in place.