Skip to content

Cookie Header Explainer

Explain cookie scope and cache reuse rules. Understand supported inputs, evidence, limits, deliberate failure cases and independent verification.

Open Markdown

The tool page is Cookie Header Explainer. This guide describes every check the page runs, the specification section behind it and how to confirm a result outside the page. The page opens on the live response headers of www.wikipedia.org, fetched by our server when the page loads.

Where processing happens: a website address is sent to our server, which requests that one page and returns its response headers with cookie values replaced by their length. Pasted headers are parsed in the current browser tab and never uploaded. Addresses inside pasted text are not fetched, and input is not stored or put in the address bar.

Cookies rejected or personalized responses cached? The page answers three questions about one HTTP response. Will a browser accept each cookie, and with what scope and lifetime? Are its attributes safe: Secure, HttpOnly, SameSite, prefixes, size? May a shared cache store and reuse the response even though it sets cookies? A pasted Cookie: request line is also read, to list what a browser sent and flag names sent twice. Findings and evidence are separate, so you can see which field produced each finding.

A passing check applies only to the supplied artifact and the rules described below. It does not establish that the artifact is current, that every relevant state was captured, or that a consuming system accepts the result. Keep the input version and the intended test scenario with any report. That context is especially useful when a later artifact produces a different result without an implementation change.

The main field accepts response headers. Give a public page address and choose Fetch headers to have our server request that page once and place its response headers in the field; cookie values are redacted to their length before they reach the browser, and the opening line names the address, status and time of the fetch. Or paste headers copied from DevTools or a curl -I run. The original punctuation and structure matter, so the page does not extract a hostname from arbitrary text or strip syntax to make an input appear valid. A leading byte-order mark is removed by the shared reader. Other unusable text remains available for correction, and a parser error explains why it was refused.

Field Behavior
Website address Optional. One GET request from our server to a public HTTPS page; only the address is sent. Redirects are followed and the final address is shown
Fetch headers, Cancel Starts or abandons that request. The field keeps whatever it held when a fetch is cancelled or fails

Typing or changing an option invalidates the old output immediately. Analysis runs after a short 180-millisecond debounce. Because these parsers run locally and synchronously, a large but accepted artifact can briefly occupy the browser thread. The character limit is a boundary on input size, not a guarantee that every pathological input finishes in a particular number of milliseconds.

Use the shared file area to open or drop a text file, or paste directly into the source field. Files are read by the browser. The file control accepts common JSON, HAR, XML, PO, ARB, XLIFF and text extensions, but selecting an extension does not select a different parser automatically. Choose the appropriate format option where the page provides one. A renamed file does not change its grammar.

Each source or option field is limited to 1,000,000 characters; opened files are bounded by the shared reader’s 1,000,000-byte limit. Additional parser-specific limits appear in Method. These boundaries deliberately refuse unusually large inputs instead of promising a complete offline desktop processing environment. Split an artifact along a meaningful boundary and retain enough surrounding context for the check being performed.

Clear removes the current source and clears the result. It does not secretly reload an example. Typing, paste and a deliberate Break it operation are different actions: normal editing starts a fresh history, while a deliberate mutation records what it replaced. No field is restored merely because the page was visited earlier. Reloading fetches the live default again, unless an explicit cross-tool transfer is being consumed; if that fetch fails, the synthetic Example in the field stays and is labelled as such.

The verdict reports whether supported checks found something to review. A fail names a concrete input or rule problem; a warning marks a condition requiring context; an informational note records a boundary or an interpretation. These categories are not interchangeable. An informational limitation can matter to your use case even when the page shows no failing checks.

Findings are followed by the complete tool-specific evidence. Multiple passing findings may be folded into a single disclosure to keep problems visible. Expand that disclosure when checking coverage. Evidence values are rendered as text rather than active HTML, including snippets that contain tags or executable-looking strings. The page does not run a copied command or generated test automatically.

The output panel contains the generated artifact or a structured report. Its preview is limited to 50,000 characters. Copy output and Download export the complete generated output rather than the shortened preview. Use the code or data export when feeding another tool. When explaining a finding to a reviewer, include the relevant evidence, the chosen settings and the result’s limitations alongside that exported artifact.

Downloads are created locally from an in-memory Blob. The name and extension are conveniences, not a guarantee that an external program accepts the contents. Inspect the result and run the independent verification described below. Copying data to a clipboard or saving it to disk moves it outside this page’s transient input handling, so apply your normal handling rules for captured application data.

Break it modifies the current input using the named case. Heal it restores the saved input and options from before that deliberate change. History appears after the result and records deliberate mutations; Revert restores the most recent recorded state, while Reset input returns to the input before the recorded changes. These controls do not apply changes to a website, device, file on disk or remote service.

Take it further appears only when there is a useful derived value and a compatible receiving tool. A missing link is preferable to transferring unrelated data. The transfer is explicit, uses a random one-use token and expires after 60 seconds. The input itself is not placed in the address bar. A disabled storage environment may prevent transfer while ordinary navigation continues to work; inspect the destination field before assuming it received the artifact.

Paste one response field per line, optionally preceded by an HTTP status line. Field names are normalized to lowercase, and repeated fields remain available as separate values. Folded continuation lines are refused. Set-Cookie is handled separately rather than comma-joining all cookies, because an Expires date itself contains a comma. Comma-separated cache directives are split with quoted-value awareness, and an unterminated quote there causes refusal. Set-Cookie is split differently: following the parsing algorithm in 6265bis section 5.6, the name-value pair ends at the first semicolon even inside double quotes, so a="x;y" yields the value "x and an ignored attribute y", exactly as a browser reads it. A Cookie: request line is also accepted and split into name=value pairs on semicolons.

The parser is an explainer, not a complete HTTP message validator. It does not read a request URL, method, response status context, cookie jar or cache implementation. Unknown fields may be present but are not interpreted. At least one Set-Cookie, Cache-Control, Vary or ETag field is required. Addresses and dates in the text are never followed or sent to a server.

Each Set-Cookie line starts with a name-value pair. When the pair has no equals sign, or nothing before it, 6265bis section 5.6 stores the text as a value with an empty name; the tool reports this as a warning, and an empty name with an empty value as a failure, because browsers ignore it. A non-empty cookie name is checked against HTTP-token syntax. Cookie values are never displayed: the evidence shows a placeholder with the value’s length in bytes, so you can see size without exposing a session token. Attributes remain visible because they explain scope and policy. Attribute names are case-insensitive; repeated attributes produce a warning and the last value is shown. Names outside the nine known attributes (Expires, Max-Age, Domain, Path, Secure, HttpOnly, SameSite, Partitioned, Priority) are reported as ignored. A comma followed by another name=value pair, outside an Expires date, produces a possible-combination warning rather than an attempt to split an ambiguous cookie list.

Size limits follow the same section: when the name and value together exceed 4096 bytes the browser ignores the whole cookie, and an attribute value over 1024 bytes is ignored on its own. The tool counts UTF-8 bytes, not characters. Two Set-Cookie fields with the same name, Domain and Path are flagged, because the later one replaces the earlier in the cookie store.

Secure absence is a warning about transport scope. HttpOnly absence is informational because some client-readable cookies are intentional. SameSite accepts Strict, Lax and None, and an unknown value is flagged. Missing SameSite is described as browser-dependent default behavior. SameSite=None without Secure is a failure in the modern browser compatibility checks. Partitioned without Secure also fails, while browser support remains outside the static result.

The original cookie storage model is described in RFC 6265 section 5. The current 6265bis working draft describes SameSite and prefixes; it is a draft, not a published replacement RFC. SameSite, prefixes and partitioning are later browser behaviors and are not all defined by that original document. The page therefore separates parsing evidence from browser acceptance and never presents the RFC alone as a specification for every modern attribute.

A __Secure- cookie must carry Secure. A __Host- cookie must carry Secure, specify Path=/ and omit Domain (6265bis section 4.1.3). Prefixes are matched case-insensitively, as section 5.4 requires of browsers, so __host-id is held to the same rules; a prefix in unusual case also receives an informational note because older browsers matched it case-sensitively. Setting either prefix from an insecure origin can still fail, but the origin is not supplied here and is not checked. A header satisfying the visible attribute requirements is therefore not proof of acceptance.

Domain absence is described as host-only scope. Domain presence is described as a domain cookie whose acceptance has not been checked. A leading dot in Domain is ignored by browsers and is reported as legacy syntax. A Path that does not start with a slash is ignored, so the browser falls back to the default path of the request URL; this is a warning. Public-suffix rules, domain matching, IP behavior, path matching and host context require a real browser or a more complete cookie engine. The analyzer does not guess them from the cookie name.

Max-Age accepts an integer string. Zero or a negative value requests deletion, while a positive value describes a lifetime in seconds. A valid Max-Age takes precedence over Expires in the displayed lifetime. The displayed lifetime adds an approximate day count for Max-Age and an absolute UTC time for Expires, and an Expires date already in the past is reported as a deletion. 6265bis section 5.5 caps both attributes at 400 days, applied in sections 5.6.1 and 5.6.2; Chrome has enforced the cap since version 104, so a longer lifetime gets an informational note. Expires receives a basic date-parsing check, not the complete permissive cookie-date algorithm. Session-cookie labeling means no effective persistent lifetime was identified; browser session restoration can complicate actual lifetime.

Cache-Control directives are split with quoted-value awareness. Repeated names are flagged and the final value is displayed. max-age, s-maxage, stale-while-revalidate and stale-if-error require nonnegative integer seconds for the parser’s duration check. Unknown directives remain in evidence without an invented interpretation.

The storage explanation gives no-store priority: a cache following that directive must not store the response. Unqualified private blocks shared-cache storage while allowing a private browser cache. Field-name-qualified private has narrower semantics and is labeled separately. Public and private together produce a conflict warning. The response directive definitions in RFC 9111 section 5.2.2 are the basis for these explanations.

No-cache does not mean no storage. It introduces validation requirements before reuse, with qualified forms applying to selected fields. The page surfaces this distinction as an informational finding. The displayed browser freshness comes from max-age and shared freshness prefers s-maxage. These are configured lifetimes, not a calculation of remaining freshness: Age, Date, request directives, heuristic caching and the full response eligibility rules are not evaluated.

Vary lists request fields that participate in selecting a stored representation. Vary: * receives a specific note because an ordinary later request cannot be matched for reuse. The Vary matching rules in RFC 9111 section 4.1 explain that distinction. Other Vary names are displayed without simulating a cache key or comparing actual request headers.

ETag is a validator, not a freshness lifetime. The tool explains that a conditional request may use it, but does not compare tags, apply If-None-Match or decide whether a 304 response is valid. Weak and strong validators may matter to the operation; the supplied field remains evidence for a separate HTTP check.

A response carrying Set-Cookie and an apparent shared-cache directive receives a personalization warning unless no-store or private changes the storage policy. Set-Cookie alone does not universally prohibit caching. This warning asks whether the response body is user-specific; it cannot determine that from headers. Review the full request and response with the application owner before changing cache policy.

The opening example combines a __Host-session cookie missing Secure with SameSite=None, then adds public max-age and s-maxage policy, Vary and an ETag. It is synthetic. The findings explain the cookie rejection risks and the shared-cache concern, while the evidence separates attributes, storage policy, configured durations and validators.

For an independent check, capture headers with curl -sS -D - -o /dev/null https://your-test-host.example/path in a controlled environment, then compare with the browser Network and Application panels. Curl does not implement every browser cookie policy and a response header does not prove that a browser stored the cookie. Repeat requests through the actual CDN or cache and inspect Age and cache-status evidence when diagnosing reuse.

Specifications and how the tool follows them

Section titled “Specifications and how the tool follows them”
Specification Sections used How the tool applies them Where it stops
RFC 6265bis, draft 22 §4.1.3 prefixes, §5.4 case-insensitive prefixes, §5.5 lifetime cap, §5.6 parsing, size limits and attributes Splits each Set-Cookie field as a browser does, applies prefix, size, lifetime, SameSite, Domain and Path rules No origin, no cookie store, no public suffix list, no full cookie-date parser
RFC 6265 §5.2 Set-Cookie parsing, §5.4 Cookie header Request Cookie: lines are split into name=value pairs Does not reproduce the order a browser would send
RFC 9111 §5.2.2 response directives, §4.1 Vary Explains storage, configured freshness and reuse for Cache-Control, Vary and ETag No Age, Date or heuristic freshness; no request directives
RFC 9110 §5.5 field values, §8.8.3 ETag Reads one field per line; refuses folded lines Not a full message validator

6265bis is an Internet-Draft, not yet an RFC. The tool follows its user-agent rules because current browsers do, and labels Chrome-specific behavior, such as the 400-day cap, as browser behavior.

Acceptance by this page is not certification against the specifications above. A header that passes every check may still be rejected in a browser for reasons the page cannot see: an insecure origin for a prefixed cookie, a public-suffix Domain, third-party cookie blocking or a full cookie jar. When you report a discrepancy, say whether it concerns parsing, a documented rule, or the browser’s own behavior, and attach the smallest header block that reproduces it.

Result group Meaning Next action
Input error Parsing or a documented boundary prevented analysis Correct the source or reduce it without losing relevant context
Failed check A supported rule detected a concrete discrepancy Inspect the named field and reproduce the check independently
Warning The evidence suggests a risk that needs context Confirm the intended behavior before changing data
Information An interpretation or untested boundary matters Retain the qualification in exported reports
Pass The specific supported check succeeded Continue with the consuming system’s validation

The detailed rule wording and thresholds appear under Method. Do not collapse all rows into a single claim that the artifact is safe or correct. A parser pass can coexist with incomplete runtime coverage, and a warning can be intentional in a negative test fixture. Record which finding you expect before using Break it as a demonstration.

Finding id Status Condition Typical fix
cookie-pair Fail Name and value are both empty Remove the field or give it a name=value pair
cookie-nameless Check No equals sign, or nothing before it Add a name; servers rarely read a nameless cookie
cookie-name Fail Name is not an HTTP token Remove spaces, separators and control characters
cookie-combined Check Comma followed by another pair, outside Expires Send one Set-Cookie field per cookie
cookie-size Fail Name plus value over 4096 bytes Store less in the cookie; keep state on the server
attribute-size Check Attribute value over 1024 bytes Shorten the attribute; the browser drops it
unknown-attribute Info Attribute outside the nine known names Remove it or check the spelling
duplicate-attribute Check Attribute repeated in one field Keep one; the last value wins
Finding id Status Condition Typical fix
secure Check Secure absent Add Secure for anything served over HTTPS
httponly Info HttpOnly absent Add HttpOnly unless scripts must read the cookie
samesite Fail SameSite=None without Secure Add Secure, or choose Lax
samesite-value Check SameSite not Strict, Lax or None Use one of the three values
samesite-default Info SameSite absent State Lax or Strict explicitly
partitioned Fail Partitioned without Secure Add Secure
secure-prefix Fail __Secure- without Secure Add Secure
host-prefix Fail __Host- without Secure, Path=/ or with Domain Add Secure and Path=/, remove Domain
prefix-case Info Prefix in non-canonical case Spell it __Secure- or __Host-
domain-dot Info Domain starts with a dot Drop the dot; behavior is unchanged
path-default Check Path does not start with a slash Start the path with /
max-age Check Max-Age is not an integer Use whole seconds
expires Check Expires is not a readable date Use an IMF-fixdate such as Wed, 21 Oct 2026 07:28:00 GMT
lifetime-cap Info Lifetime over 400 days Expect 400 days at most; refresh the cookie instead
expires-past Info Expires already passed Intended as deletion? Otherwise fix the date
duplicate-cookie Check Same name, Domain and Path set twice Send one field; only the later is kept
request-attribute Check Cookie request line holds an attribute name Paste it as Set-Cookie, or remove the attribute
request-duplicate Info Same name sent twice in Cookie Read the first value on the server, or remove the shadowing cookie
Finding id Status Condition Typical fix
duplicate-directive Check Cache directive repeated Keep one
cache-seconds Check Duration is not non-negative integer seconds Use whole seconds
revalidation Info no-cache present Use no-store if the response must not be stored
conflict Check public and private together Keep the one you mean
vary-star Info Vary: * Name the request fields instead, if reuse is wanted
shared-cookie Check Set-Cookie with public or s-maxage Use private or no-store for personalized responses
etag Info ETag present Pair it with a freshness lifetime if reuse is wanted

Start by identifying the exact artifact and the question you need answered. Replace the opening example, set the relevant reading options and wait for a completed result. Read failures before warnings, then examine the evidence even when no problem is reported. Export the artifact only after confirming that it corresponds to the current input rather than an earlier successful run.

Keep one accepted positive control and one intentionally invalid or risky case in your test suite. Run both through the consuming system as well as this page. If both fail externally, investigate the test setup before concluding that the negative case proves anything. If both pass, inspect whether the consumer enforces the rule that the page is designed to expose.

Control Observable effect Verification
Grow a cookie to 4097 bytes The first cookie’s name and value total 4097 bytes, one over the limit Inspect the over-4096-bytes failure, then Heal it
Add Partitioned without Secure A cookie is Partitioned but not Secure; browsers reject it. Inspect the new finding, then Heal it
Set an unreadable Expires date A cookie carries Expires=tomorrow, which no browser can parse. Inspect the new finding, then Heal it
Mark the response public and private Cache-Control carries both public and private. Inspect the new finding, then Heal it
Repeat max-age as 0 Cache-Control states max-age twice, the second time as 0; freshness is ambiguous. Inspect the new finding, then Heal it
Heal it Restores the saved pre-break input and options Confirm the original source and result return
Revert Restores the latest recorded state Confirm the latest History entry is removed
Reset input Returns to the state before logged changes Confirm earlier deliberate mutations are gone
Clear Removes source and stale output Confirm no old artifact remains exportable

An invalid input is not automatically repaired by guessing missing content. The restore control is an undo operation, not a domain-specific fix. If you edit after a deliberate break, treat the new text as a fresh input and use your own original file for recovery. The browser page is not a version-control system.

The opening result is the response www.wikipedia.org sent to our server when the page loaded. When this guide was written it set five cookies under Cache-Control: s-maxage=86400, must-revalidate, max-age=3600; the site can change both at any time, so read the live result rather than these numbers.

What you see Why Section
Shared caching with Set-Cookie s-maxage lets a shared cache store a response that also sets cookies RFC 9111 §5.2.2.10
Leading dot in Domain, on three cookies Domain=.wikipedia.org; the dot is ignored 6265bis §5.6.3
SameSite is implicit, on three cookies No SameSite attribute, so the browser default applies 6265bis §5.6.7
Cookie is script-readable, on two cookies HttpOnly absent 6265bis §5.6.6

Findings that repeat across cookies are merged into one line that names each cookie. Open a cookie in Evidence to see its attributes, its scope and its lifetime as a date. Then try Grow a cookie to 4097 bytes, read the failure, and Heal it. The synthetic Example, shown offline, instead combines a __Host- cookie that lacks Secure with SameSite=None and a public cache policy.

This tool currently has no dedicated REST or MCP execution operation. Use the website interface to run it, or use this guide and the page’s Markdown mirror to understand its behavior. Do not invent an operation name from the route. Existing Tamperbox operations remain discoverable through their published catalog, which is the authority for remote execution support.

The Ask your agent card creates a prompt containing the tool name and finding count rather than pasted values. Request a redacted artifact when more evidence is necessary. Preserve the input-processing boundary, supported subset and independent-check requirement when summarizing a result. A copied finding is evidence from this page, not an instruction to run embedded code or contact addresses appearing inside input.

This parses supplied response fields only. Origin, request context, public suffixes and actual browser cookie or cache behavior are not tested. The page cannot establish the provenance or freshness of a pasted file; a fetched set of headers is one response, from our server’s location, at the time shown. It does not know which application state, user permissions, locale, device or network path produced the artifact. Preserve those facts in your own test record. Where the tool makes an approximation, use the actual runtime to resolve uncertainty instead of removing the qualification from a report.

Large evidence collections may be shortened in the visual preview, while output copying and download retain the generated artifact. Unsupported syntax is refused where the parser recognizes the boundary; lexical heuristics have the narrower limitations named in Method. Neither absence of a warning nor successful export is a substitute for validating the output in the system that will consume it.