如何实施安全的“记住我”
Posted
技术标签:
【中文标题】如何实施安全的“记住我”【英文标题】:How to implement secure "Remember me" 【发布时间】:2018-07-25 08:45:20 【问题描述】:我正试图弄清楚如何在我正在开发的应用程序中实现“记住我”。目前我的实现是这样的。
-
用户登录并请求被记住
服务器使用电子邮件/密码验证用户
如果验证成功,我会使用用户的电子邮件和存储在服务器上的密钥生成 JSON Web 令牌。
然后令牌作为 cookie 发送回客户端。但同时使用 bcrypt 对令牌进行哈希处理,并将用户信息存储在数据库中。
现在,当用户稍后访问该页面时,该 cookie 会在页面加载并根据数据库中存储的哈希进行验证时发送到服务器。
对我来说,这“似乎”是安全的,因为令牌本质上是用户的密码,并在服务器端进行了相应的处理。但是,我不确定这是否真的安全,或者我是否缺少某些东西。
【问题讨论】:
我看到的一个问题是有人可以将 cookie 值复制到另一台计算机并以该用户身份登录。为了解决这个问题,你可以在加密算法中使用一些关于用户的秘密——也许是他们的密码? 【参考方案1】:您可以使用 html5 Web Storage API 代替 cookie。它更安全,所有现代浏览器(IE8+)都支持。
LocalStorage 是一个很好的 Web Storage API 接口。它是一种客户端持久存储形式,没有任何过期时间(直到用户清除它)或开发人员通过 javascript 执行它。
您可以进一步研究这个答案difference between Cookie and LocalStorage。
【讨论】:
这两个选项都不安全。一个 HttpOnly cookie 将是这样做的一种方式。没有 JS 可以访问它(恶意软件和浏览器扩展),但是笔记本电脑的管理员和用户可以访问它。 @JuanCarreyHttpOnly Cookie
也是一个完全有效的解决方案,但它有几个问题,首先是 CORS,另一个是 CSRF
。除非你设置了HttpProxy
,否则你不能跨域,为了避免 CSRF,你需要制定一个anti-CSRF
策略。
@JuanCarrey 所以我提到的解决方案是可能的解决方案之一,尽管您仍然需要考虑XSS
。但是网络存储非常安全OOB
。对于HTTPOnly cookie
,您还需要拥有支持它的后端。以上是关于如何实施安全的“记住我”的主要内容,如果未能解决你的问题,请参考以下文章