在浏览器中存储令牌

Posted

技术标签:

【中文标题】在浏览器中存储令牌【英文标题】:Storing Tokens in the browser 【发布时间】:2017-10-19 23:39:13 【问题描述】:

问题 =]

根据我的研究,为了防止 CSRF 攻击,似乎将 Web 令牌存储在本地存储中是比使用 cookie 更好的方法(我知道本地存储容易受到 XSS 攻击这些似乎比 CSRF 更容易预防)。话虽如此,我一直无法找到任何 relavant 指南来说明如何利用 本地存储... 我正在寻求一些帮助以了解以下内容的工作原理......
    首选方法/工作流程将服务器签名的令牌传递到浏览器的本地存储。 浏览器存储令牌后,我该如何使用存储的令牌。 是否需要停止默认通过 JS 提交表单等内容,然后在每个请求中发送带有 authorization: Bearer <token> 标头的 AJAX 请求? 当用户单击指向该用户拥有的资源的链接时,如何将该令牌发送到服务器以授予对受保护资源的访问权限?

工具

前端 html5(从 Handlebars 编译) JS CSS(从 SASS 编译) 后端 nodeJS(使用 Express)

注意:我希望将来用代码示例编辑这篇文章(一旦我掌握了它,哈哈),以帮助将来像我这样困惑的人

【问题讨论】:

【参考方案1】:

首选方法是从 /users/login 请求(无论您喜欢什么,标头或正文)返回带有成功响应的令牌。然后你把它放到本地存储中。

这里最重要的是,没有 HTTPS 就无法使用 JWT。否则,您最终将传递不受保护的凭据。

获取令牌后,您应该手动将其作为标头添加到每个请求中。使用一些 js ajax 包装器来简化这个任务。

据我所知,没有办法发送带有<a href=""> 元素的自定义标头。所以我最终传递了额外的令牌(一些哈希,不是 JWT)以及链接<a href="/some_protectded_page?token=...">。但这不是最优的。如果你在服务器端渲染页面,最好使用会话。

【讨论】:

我更喜欢无状态路由....同时保持无状态认证的优势?

以上是关于在浏览器中存储令牌的主要内容,如果未能解决你的问题,请参考以下文章

在基于浏览器的应用程序中,我在哪里存储 OAuth 刷新令牌

无法在浏览器的 cookie 中存储 json Web 令牌

如何使用AngularJS将身份验证承载令牌存储在浏览器cookie中

根据初始浏览器请求向服务器发送 JWT 令牌(使用本地存储)

浏览器如何存储/重新创建授权令牌?

SPA中令牌存储和刷新的选项