是否可以使用Set-Cookie标头设置现有Cookie的Expires / Max-Age?

时间:2020-05-19 19:59:26

标签: cookies http-headers

我正在尝试使用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的Expires / Max-Age仍然是“会话”(在Chrome和Firefox上尝试过)。

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

1 个答案:

答案 0 :(得分:2)

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

我发现(?)收到每个Set-Cookie标头:如果不存在,浏览器会将cookie的Expiration / Max-Age更新为“ Session”,但如果其他伪指令值没有更新,则不会将其更新为其他任何值缺席(例如 build-GetSubscriptionsFunction: @echo "Buliding artifacts with sls. Destination dir " $(ARTIFACTS_DIR) sls package --env aws mkdir -p $(ARTIFACTS_DIR) unzip .serverless/subscriptions.zip -d $(ARTIFACTS_DIR) cp requirements.txt $(ARTIFACTS_DIR) python -m pip install -r requirements.txt -t $(ARTIFACTS_DIR) rm -rf $(ARTIFACTS_DIR)/bin 标志或sam build -t sam_template.yaml的值)。

这表明根本的问题是,在下一页中,.serverless标头发生了一个请求,但是Secure指令没有任何值,因此将到期时间重置为“会话”,从而使解决方案能够确保每个SameSite响应标头都具有针对Set-Cookie和/或expires/Max-Age指令的故意值(或不存在)

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

如果说ajax请求的响应返回:

Set-Cookie

然后浏览器将更新cookie的值,并将其过期时间从“格林尼治标准时间2020年8月17日19:08:24”设置为“会话”。

进行解决方案,如前所述,以确保响应包含expiresMax-Age伪指令的正确(或故意)值,因此对意外设置的ajax调用的正确响应在上面的示例中,“会话”过期将是这样的:

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