【发布时间】:2022-06-12 04:22:31
【问题描述】:
设置会话cookie的代码如下:
res.cookie(newCookieName, sessionCookie, {
domain: getCookiesDomain(),
maxAge: ms('30 days'),
secure: true,
httpOnly: true,
sameSite: 'lax'
});
在注销时我们这样做:
function clearOneSessionCookie(res:Response, cookieName, sameSite?: 'lax'|'strict'|'none'):void {
if (sameSite) {
res.clearCookie(cookieName, {
domain: getCookiesDomain(),
maxAge: -1000,
httpOnly: true,
secure: true,
sameSite: sameSite
});
} else {
res.clearCookie(cookieName, {
domain: getCookiesDomain(),
maxAge: -1000,
httpOnly: true,
secure: true
});
}
}
clearOneSessionCookie(res, newCookieName);
clearOneSessionCookie(res, newCookieName, 'lax');
clearOneSessionCookie(res, newCookieName,'strict');
clearOneSessionCookie(res, legacyCookieName);
clearOneSessionCookie(res, legacyCookieName, 'lax');
clearOneSessionCookie(res, legacyCookieName,'strict');
我们应用了clearOneSessionCookie 的所有可能选项,因为在我们项目的不同阶段转移到不同的cookie 名称和选项时,我们使用了不同的sameSite 选项。
我什至更新到最新的express、cookie-parser 包,希望能解决这个问题,但到目前为止还没有效果。
注销请求后,谷歌浏览器的 Cookies 选项卡上显示以下信息:
请求 Cookie:
- old_cookie_name: domain = www.example.com, path = /, expires = Future_Date_1, HttpOnly = yes, Secure = yes, SameSite=[未设置!]
- new_cookie_name: domain = www.example.com, path = /, expires = Future_Date_2, HttpOnly = yes, Secure = yes, SameSite=Lax
响应 Cookie:
-
old_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Lax
-
old_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Strict
-
new_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Lax
-
new_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Strict
注意现在有行像
- old_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: [未设置]
所以,看来是调用
clearOneSessionCookie(res, legacyCookieName);
不起作用或浏览器无法理解/识别。
这个特定的set-cookie 已被忽略:
set-cookie: old_cookie_name=; Max-Age=-1; Domain=www.example.com; Path=/; Expires=Sat, 04 Jun 2022 15:27:10 GMT; HttpOnly; Secure
清除具有旧名称且未应用显式 Same-Site 值的 cookie 的最佳方法是什么?
感谢您的回答和时间。
更新:
问题症状的澄清:
legacyCookieName cookie 未设置(SameSite 属性没有值)作为结果,在迁移到新 cookie 设置之前登录的现有用户无法退出网站。
【问题讨论】:
-
cookies 选项卡仅与单个请求/响应有关,重要的是应用程序选项卡上的“存储 > Cookies”。如果 cookie 在那里消失了,你就准备好了。此外,在清除 cookie 时,
sameSite无关紧要。并且当多次设置一个 cookie 时(使用不同的sameSite值),只有一个存在。 -
我知道网络选项卡上 cookie 信息的按请求性质。可能是我不够清楚,但是其中一个 cookie(具有未设置 SameSite 属性的旧 cookie 名称仍然存在,并在注销 API POST 后以 JSON 响应请求发送,作为重定向到网站主页的一部分。
标签: node.js express google-chrome http cookies