An old photograph and an old opening-hours notice are both old information. Only one may send somebody across town to a locked door. A web cache cannot infer that difference from the number of bytes in the response. Somebody has to express what reuse is allowed to mean.

Caching is often described as a performance trick. It is also a publication policy. A server permits a stored response to stand in for another conversation, subject to rules about freshness, validation, and which requests the response can satisfy. The policy is successful when those rules match the reader's expectations about the page.

Current has more than one meaning

Imagine a hypothetical community noticeboard with a historical photograph, a directory of meeting rooms, and a notice about a changed event time. All three arrive through HTTP. They have different relationships with time. The photograph's bytes may never need to change. The room directory may tolerate a short delay. The changed event time may need an immediate check before reuse.

RFC 9111's HTTP caching model distinguishes freshness from validation and defines the response directives that govern reuse. An unqualified no-cache requires successful validation before the stored response satisfies another request. no-store has a different purpose: it tells caches not to store the exchange for later use. Neither word should be interpreted merely from its everyday English appearance.

That distinction is useful because a stored copy can still save work even when it needs checking. If the representation remains unchanged, validation can avoid transferring the full body. “Must ask again” and “must download everything again” are different policies. A diagram that gives both behaviors the same crossed-out cache icon hides an important design option.

Reuse can be conditional

MDN's conditional-request guide describes validators such as entity tags and the request conditions that use them. A client can ask whether a representation it holds is still applicable; appropriate responses can let it reuse that body. The mechanism works because the condition refers to a version or modification state, rather than trusting a filename to describe freshness.

For the fictional room directory, imagine an entity tag changing whenever the served representation changes. A returning reader's validation request carries the previous tag. If nothing relevant changed, the server can confirm that the old representation remains usable. If a room moved, the server can send a new body. The reader's experience is governed by the policy and validator together.

Conditional requests also have uses in writes, but they do not make every multi-step workflow automatically safe. The scope of the resource and the correctness of the server's comparison still matter. The useful idea is narrower: a request can state a condition about the version it expects instead of silently assuming that the world has stood still.

Deliberately serving yesterday's answer

Some pages are better served promptly with slightly older information than slowly with a mandatory round trip. RFC 5861's stale controls describe extensions including stale-while-revalidate, which permits a stale response within a specified window while revalidation is attempted without blocking the reader. The permission is bounded; it is not a promise to make old content acceptable forever.

The fictional room directory may be a reasonable candidate for such a trade, depending on how it is used. The event-time notice may be a poor candidate if a reader relies on it immediately before leaving home. These judgments do not emerge from a generic preference for low latency. They come from understanding what harm or inconvenience an outdated response could cause in this particular interface.

A useful design question is what the page tells the reader about its own time. A directory could display when its information was last checked, provided that timestamp has an honest meaning. A misleading “updated now” label generated on every render would make the page seem current while saying nothing about the facts inside it. The interface can either clarify or disguise the cache policy's consequences.

Immutable is a promise about an address

A versioned asset has a different shape. Suppose the noticeboard publishes a photograph under a URL derived from that exact file's content. A revised photograph gets another URL. The old address can continue referring to its old bytes without frustrating a reader who asks for the new version through a newly updated page.

RFC 8246's immutable extension expresses that a response will not change during its freshness lifetime, allowing unnecessary revalidation to be avoided. It fits a versioned-URL pattern because a changed representation moves to a different address. The promise remains bounded by the response's freshness; immutable is not a general declaration that an origin can never change anything.

The hard part of the imagined noticeboard is then the reference between objects. The photograph can be stable while the page choosing which photograph to show changes. Optimizing one layer does not automatically set the right policy for the other. A long-lived asset and a frequently checked index can coexist quite comfortably when the distinction is deliberate.

Make the promise observable

If a team wants to evaluate this design, it can rehearse ordinary publication changes: replace an event time, revise a directory entry, and publish a new photograph version. Inspect what a returning reader receives and which conditions were checked. This is a proposed validation exercise, not a claim about the measured behavior of any particular CDN or browser.

A low response time is only one result. Another is whether readers saw the right event time when the policy said they should. Another is whether an unchanged photograph avoided an unnecessary transfer. Treating these as separate observations makes performance work more honest and more useful.

The most interesting cache setting is therefore rarely the longest duration a service will accept. It is the duration and validation behavior that fit the information being published. A stored response borrows authority from an earlier exchange. Good cache policy says how long that borrowed authority may last, and when the web needs to ask again.

About the author

Writer

I write about computing systems, from the meaning of a saved record to the work that turns a letter into pixels.

A thought worth keeping?