当用户登录时,我给他们一个名为 auth 的 cookie,其值是一个 GUID,它会在 2 周后过期。我将散列的 GUID 与他们的用户 ID 的盐一起保存在数据库中,然后在它到期时显示日期。当用户访问该站点时,我会检查 cookie 并在其匹配且未在数据库中过期时将其登录。
在 2 周结束之前的某个时间点,我正在考虑更新行并增加过期日期。你多久这样做一次?每个页面请求似乎都太频繁了,因为我会不断地写入用户表。
此时我也在考虑更改 auth cookie 的值。这样做的缺点是您无法在多台计算机/浏览器上进行身份验证。
我可以通过会话 cookie 来完成此操作,因此这种重写在每个会话中只发生一次。当用户访问一个页面时,我会检查一个名为 authenticated 的会话 cookie。如果它不存在,我给他们一个新的身份验证 cookie 值和身份验证会话 cookie,并增加数据库和身份验证 cookie 中的到期时间。如果是,我只是验证 auth cookie。
在您注销并重新登录之前,StackOverflow 似乎永远不会更改他们的身份验证 cookie。这似乎使其更容易受到会话劫持 - 如果您获得身份验证 cookie,您可以访问用户帐户,直到他们再次登录。由于他们的身份验证 cookie 不会过期或更改,因此您登录后不会注销用户。
- 您是否允许用户从多个位置/浏览器登录?
- 如果没有,您多久更改一次他们的身份验证令牌?