那么,如何撤销 Http-only cookie?
或者,我是否遗漏了服务器上的会话配置中的某些内容?
有一个解决方法:
每当用户单击注销按钮时,都会为网站的域设置一个新的、单独命名的 cookie,该 cookie 向 Web 服务器指示用户的仅 HTTP cookie 应在下一次成功的 HTTP 请求时立即过期(例如
expire-my-session-cookie
) 。最后,在服务器中,添加一个中间件、请求拦截器或 HTTP 模块(我不知道你正在使用什么服务器端平台)来检查这个 expire-my-session-cookie
),如果存在,则重定向或重写请求到真正的注销处理程序以完成使任何仅 HTTP cookie 过期的任务。
我认为这里不存在任何安全风险,就好像您的网站确实存在脚本注入漏洞一样,恶意脚本可以通过设置
window.location = 'http://your/logoff/page'
来单方面注销您的用户。
渲染的 HTML 中类似这样的内容:
<a href="/logoff" onclick="document.cookie = 'expire-my-session-cookie=true'; return true;">logoff</a>
像这样的 HTTP 中间件(即在每个请求上执行,静态文件和资产除外):
(伪代码)
function( next ) {
if( request.cookies["expire-my-session-cookie"] == "true" ) {
// Set all of the user's cookies to expire immediately:
for( int i = 0; i < request.cookies.length; i++ ) {
response.cookies.setCookie( request.cookies[i].name, "", expires: 1970-01-01 );
}
return response.redirect( 'logoff-handler' );
}
else {
// Otherwise continue as normal:
return next();
}
我现在有完全相同的情况,但是“注销”不需要在前面进行更改,服务器将会话标记为已完成,您无法使用此cookie去任何地方。一般来说,除了每个请求中放置“credentials: 'include'”之外,前面没有什么需要更改的,所有逻辑都完全存储在服务器上。