`Vary: Origin` should not be set if the `Origin` request header is ignored
#332 opened on Oct 19, 2024
Description
The Vary HTTP response header is useful to ensure proper caching of CORS responses and prevent cache poisoning. However, it comes with a downside: (potentially significantly) increasing the cache size, since each client's origin will create a different cached value.
The standard mentions:
If
Access-Control-Allow-Originis set to * or a static origin for a particular resource, then configure the server to always sendAccess-Control-Allow-Originin responses for the resource — for non-CORS requests as well as CORS requests — and do not useVary.
In other words, if the CORS response is always the same regardless of the Origin request header, Vary: Origin should not be set. Currently, this module mostly gets it right except in two cases:
- If the
originoption is a function, regardless of the return value of that function (including'*'),Vary: Originshould be set, since that function might (and most likely did) use theOriginrequest header.
https://github.com/expressjs/cors/blob/53312a5bee605e2486fa734756abb3c0bc2f891d/lib/index.js#L41-L46
- If the
originoption is a string,Vary: Originshould not be set, sinceAccess-Control-Allow-Originis always the same value, and theOriginrequest header is ignored.
https://github.com/expressjs/cors/blob/53312a5bee605e2486fa734756abb3c0bc2f891d/lib/index.js#L47-L56