是否可以使用 Set-Cookie 标头设置现有 Cookie 的过期/最大期限?



我正在尝试使用 Set-Cookie 标头将站点上的现有 cookie 从"会话"更新到将来的某个日期。

我相信我的问题与浏览器如何解释 Set-Cookie 标头上的 Path 指令的限制有关,但我不确定也找不到像我这样的用例。

示例用例:

浏览器导航到:

GET / HTTP/2
Host: example.com

服务器回复:

HTTP/2 200
set-cookie: PHPSESSID=abcd; Path=/; SameSite=None; Secure

浏览器执行操作并导航到:

POST /some/path HTTP/2
Cookie: PHPSESSID=abcd;...

服务器回复:

HTTP/2 302
Set-Cookie: PHPSESSID=dcba; expires=Mon, 17-Aug-2020 19:08:24 GMT; Max-Age=7776000; path=/
Location: /somewhere-else

来自浏览器的所有以下请求都包含更新的 cookie 值:

Cookie: PHPSESSID=dcba;...

然而,在使用开发工具检查 cookie(或简单地关闭浏览器(时,我注意到 cookie 的过期/最大年龄仍然是"会话"(在 Chrome 和 Firefox 上尝试(。

能够通过 Set-Cookie 标头更新 cookie 的值而不是过期是否是已知/预期的行为?还是它的形成方式有问题?

对于遇到此问题/问题的任何内容:

我发现(?(收到每个 Set-Cookie 标头时:如果不存在,浏览器会将该 cookie 的到期/最大年龄更新为"会话",但如果它们不存在,则不会将其他指令值更新为其他任何值(例如Secure标志或SameSite的值(。

这表明潜在的问题是,在下一页中,Set-Cookie标头发生了一个请求,但对于expires/Max-Age指令没有任何值,因此将过期重置为"Session",从而确保每个Set-Cookie响应标头都具有expires和/或Max-Age指令的故意值(或不存在(。

用原始 http 解释,继续问题中的示例:

如果 ajax 请求的响应返回:

HTTP/2 200
Set-Cookie: PHPSESSID=efgh; Path=/; SameSite=None; Secure

然后浏览器将更新 cookie 的值,并将其到期时间从"17-Aug-2020 19:08:24 GMT"设置为"会话"。

如前所述,制定解决方案以确保响应包含expiresMax-Age指令的正确(或故意(值,因此在上面示例中意外将过期设置为"Session"的 ajax 调用的正确响应将如下所示:

HTTP/2 200
Set-Cookie: PHPSESSID=efgh; expires=Mon, 17-Aug-2020 19:08:24 GMT; Max-Age=7775900; Path=/

最新更新