"Remember Me On This Computer" - How Should It Work? “记住我的登录信息” - 如何工作?
"Remember Me On This Computer" - How Should It Work?
在网站上,我们经常看到一个选项是"记住我",它的作用是在下次登录时自动填写用户名和密码,省去了重新输入的步骤。但是,有时候我们希望在某些设备上记住登录状态,而在其他设备上不要记住。那么,如何实现这个功能呢?
首先,我们需要考虑的是如何唯一标识设备。常见的做法是使用cookie来标识设备。cookie是一种存储在用户计算机上的小文件,用于跟踪用户在网站上的活动。因此,"记住我"的cookie应该与设备相关联。这样,在不同的设备上就可以选择是否记住登录状态了。
其次,我们需要设置cookie的过期时间。一般来说,过期时间设置为一个合理的时期,比如两周,或者在用户明确注销登录时。这样可以保证在设备上长时间保持登录状态,同时也可以保护用户的安全。
然而,如何唯一标识设备呢?我们不能直接获取设备的MAC地址,因为浏览器并不提供这个信息。用户代理也不是唯一的,同一个浏览器可能有不同的用户代理。IP地址也是不稳定的,可能会发生改变。
虽然不能直接唯一标识设备,但我们可以使用标准的近似技术来组合IP地址和用户代理。如果它们发生改变,我们可以安全地假定这是一台不同的设备。当然,这并不是绝对可靠的方法,但是在实际应用中已经被广泛使用。
有时候,我们可能会想是否有一个神奇的浏览器密钥来标识设备。但是如果真的有这样一个密钥,黑客的网站也会知道。因此,我们不能依赖这个方法来唯一标识设备。
实现"记住我"功能需要考虑如何唯一标识设备,以及设置合理的过期时间。虽然无法完全准确地唯一标识设备,但可以使用组合IP地址和用户代理的方法来近似实现。这样可以在一定程度上保护用户的安全和便利。
"Remember Me On This Computer" - How Should It Work?
在另一台机器上登录时,不应使与另一台机器上的cookie关联的登录失效。但是,如果用户登出或者点击"not you? login here",这将清除用户正在使用的cookie。
顺便说一下,通过坚持使用https并禁用脚本化,可以增加窃取cookie的难度。
通过在cookie的输出中添加"; HttpOnly",可以使cookie对JavaScript不可用,例如:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
Set-Cookie: ASP.NET_SessionId=ig2fac55; path=/; HttpOnly
X-AspNet-Version: 2.0.50727
Set-Cookie: user=t=bfabf0b1c1133a822; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Tue, 26 Aug 2008 10:51:08 GMT
Content-Length: 2838
您可以阅读更多相关内容:
谢谢您提供的信息,David。您能否给我一些关于"not for scripting" cookie的链接或其他相关内容?
对格式不准确的抱歉,代码块好像决定着有趣的颜色。
“Remember Me On This Computer” - How Should It Work?
在许多情况下,我们会同时使用2到3台计算机,而且在所有计算机上都启用了“记住我”的功能。如果其中一台计算机断开了连接,那将非常令人恼火,因此我不建议这样做。
传统上,此功能使用超时设置,即在一定时间后(或用户注销登录时)cookie会过期。
这完全取决于您的安全模型。如果您正在编写一个只期望一个用户在一台计算机上使用的内部公司应用程序,那么您可能希望比Gmail有更严格的限制。
此外,还要考虑到拒绝服务的可能性-如果一台计算机上的操作可以强制另一台计算机无法使用,那么在某些情况下,这可能会阻止合法用户重新获得控制权。
+1 我正要写同样的答案,我在4-5台计算机和手机上经常使用相同的网站。
谢谢回答。所以在注销时,我可以终止所有持久会话?这样不会令人烦恼吗?我觉得这样很好。
:在注销时终止所有持久会话似乎是合理的事情。否则,您将需要按计算机和用户保持会话持久性。这样做也可以作为有意识用户的安全措施,用户可以确保他将任何连接到他帐户的人踢下线。
:我认为您需要对注销有一个心理模型。如果它的意思是“这台计算机现在对任何人都是安全的,我不用担心”,那么它不应该注销所有会话。例如,当我离开网吧时,我可能希望保持手机登录状态。但是,如果注销的意思是“强制任何尝试连接的人重新进行身份验证”,那么所有用户都应该被踢下线。我更喜欢前者,但也可以为后者提出理由。
谢谢您的评论,尼克。从安全角度来看,我的担心是零,因为这个“记住我”的功能是相当冒险的。我只是关心注销的手势,如果您愿意的话。用户有没有理由认为“注销”意味着“登出所有记住我的会话”?无论如何,现在我的好奇心被激发了,我将不得不在几个浏览器中尝试一下,看看Google和他们的可用性团队想出了什么办法。