HTTP Header Analyser
runs in your browserPaste response headers and read them: security headers graded with what to change, caching explained in plain words, and every cookie flag checked.
Paste what curl -I or the network tab gives you. Nothing is fetched — a checker that makes the request itself sees a response with no session, which is not the one you are debugging.
Response headers
about this tool
Paste the response headers and get the three things the raw list does not give you: what the security headers actually do, what the caching headers add up to, and whether the cookies are safe.
Nothing is fetched
Most header checkers make the request themselves. That sounds more convenient and answers a different question: what a server returns to a datacentre, with no cookies, no session and no geography. The response you are debugging is the one you received.
So this reads what you paste. Which also means your session cookie stays out
of somebody else's logs — and a Set-Cookie line is exactly the sort of thing
people paste into a checker without thinking.
What gets graded, and what does not
Each check says what the header is for, what yours is set to, and what to change. No letter grade: a B tells you nothing without the rubric, and rubrics are where tools smuggle in opinions.
Content-Security-Policy is marked weak if it carries unsafe-inline,
unsafe-eval or a wildcard script source. Each of those lets injected script
run anyway, so the policy is doing far less than its presence suggests.
Strict-Transport-Security is graded on its max-age. Below six months is
weak — a browser that has forgotten the header is back to an interceptable
first request, and preload lists will not take it.
Frame protection accepts either frame-ancestors in a CSP or the older
X-Frame-Options, and says which you have.
X-XSS-Protection is deliberately absent. Every current browser ignores
it, and in the versions that honoured it the filter could be turned against
a page. Tools that still ask for it are repeating advice that expired years
ago.
Cookies
Secure and SameSite are wrong to leave off any cookie.
HttpOnly is not. A theme or locale cookie exists precisely so the page can
read it, and marking every such cookie as a fault would make the list mean
nothing. So a missing HttpOnly is a problem on a cookie whose name reads
like a session, and a note on one that does not.
SameSite=None without Secure is called out on its own, because browsers
reject that combination outright — the cookie is not set at all.
Caching, in words
no-store, no-cache and max-age=0 look similar and mean three different
things. The caching section says what the headers you have add up to, and
flags a long max-age without a versioned URL — the setting that works
beautifully until you need to ship a fix.
Version numbers
Server: nginx/1.24.0 and X-Powered-By are called out when they carry a
version. Neither does anything for a visitor, and both tell somebody scanning
for a known vulnerability exactly which one to try.
Nothing leaves the browser
The headers are parsed where you pasted them. That matters more here than on
most pages, because a response header block routinely contains a Set-Cookie
line with a live session in it — which is exactly the thing people paste into
a checker without thinking about where it goes.
For the request that produced these headers, cURL converter turns it into code, and the HAR viewer reads a whole session's worth at once.
questions
- How do I get the response headers?
- Run curl -I against the URL, or open the network tab, click the request and copy the response headers. Paste the block here — a status line on top is fine and is read too.
- Why does this not fetch the URL itself?
- Because a checker that makes its own request sees what a server returns to a datacentre with no cookies and no session, which is rarely the response you are debugging. Pasting what you actually received keeps the answer about your request — and keeps your session cookie out of somebody else’s logs.
- What is a good Strict-Transport-Security max-age?
- At least 15552000, which is six months and the minimum preload lists accept. Anything shorter is graded weak here: a browser that has forgotten the header is back to an interceptable first request.
- Why is my CSP marked weak when it is set?
- Because unsafe-inline or unsafe-eval lets injected script run anyway, and a wildcard script source permits code from anywhere. A policy with either of those is doing much less than it appears to.
- Why is a missing HttpOnly not always flagged?
- Because a theme or locale cookie exists so the page can read it. HttpOnly is a fault on a cookie whose name suggests a session, and a note on one that does not — a list where every row is flagged tells you nothing.