我正在尝试使用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过期,这是已知的/预期的行为?还是它的形成方式有问题?
答案 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”设置为“会话”。
进行解决方案,如前所述,以确保响应包含expires
或Max-Age
伪指令的正确(或故意)值,因此对意外设置的ajax调用的正确响应在上面的示例中,“会话”过期将是这样的:
HTTP/2 200
Set-Cookie: PHPSESSID=efgh; Path=/; SameSite=None; Secure