在基于Web的应用程序中正确安全地存储JWT令牌的位置?

时间:2018-02-09 19:35:17

标签: javascript browser jwt frontend

我听说过浏览器存储和Cookie,但无法确定存储令牌的最佳安全方式。也不知道是否存在其他方法,或者是否有任何第三方库可以正常工作。

我想列出一份详尽的可用方法清单,每种方法都有优点/不便之处,最重要的是,如果有的话。

2 个答案:

答案 0 :(得分:5)

JWT的存放位置

使用基于令牌的身份验证,您可以选择存储JWT的位置。我们强烈建议您将令牌存储在本地存储/会话存储或cookie中。

Web存储(本地存储/会话存储)

通常,JWT被放置在浏览器本地存储中,这适用于大多数用例。

使用用户名和密码登录用户时,响应正文包含access_token JWT。然后,您需要在客户端代码中处理此响应。然后,此令牌可以存储在localStorage或sessionStorage中。

Click here for an example using sessionStorage

localStoragesessionStorage都延伸Storage。它们之间的唯一区别是数据的持久性:

localStorage - 数据会一直存在,直到明确删除为止。所做的更改将保存并可用于该网站的所有当前和未来访问。

sessionStorage - 所做的更改会保存并可用于当前页面,以及将来在同一窗口中访问该网站。窗口关闭后,存储将被删除。

网络存储缺点

  • 与Cookie不同,本地存储通过沙箱映射到特定域,其他任何域(包括子域)都无法访问其数据。
  • 可以通过同一域上的JavaScript访问Web存储,因此您站点上运行的任何JavaScript都可以访问Web存储,因此可能容易受到跨站点脚本(XSS)攻击。
  • 开发人员必须确保始终通过HTTPS发送JWT,而不是HTTP。

使用Cookie

您还可以使用Cookie来存储JWT。设置cookie的确切方法取决于您使用的客户端语言。

有多种方法可以控制cookie的生命周期:

  • 浏览器关闭后会破坏Cookie(会话Cookie)。
  • 实施服务器端检查(通常由正在使用的Web框架为您完成),您可以实现到期或滑动窗口到期。
  • Cookie可以是持久性的(在浏览器关闭后不会被销毁)到期。
  • 如果设置了httpOnly标志,则可以通过JavaScript和服务器端代码读取Cookie,也可以只读取服务器端。

Cookie缺点

  • Cookie的最大大小仅为4kb,因此如果您在令牌上附加了许多声明,则可能会出现问题。
  • Cookie可能是易受攻击的跨站点请求伪造(CSRF或XSRF)攻击。当恶意网站导致用户的Web浏览器在用户当前进行身份验证的受信任站点上执行不需要的操作时,就会发生此类攻击。这是对浏览器处理cookie的方式的一种利用。使用Web应用程序框架的CSRF保护使cookie成为存储JWT的安全选择。通过检查HTTP RefererOrigin标题,可以部分阻止CSRF。
  • 如果应用程序需要跨域访问,则可能难以实现。 Cookie具有其他属性(域/路径),可以对其进行修改以允许您指定允许cookie发送的位置。

原创文章:https://auth0.com/docs/security/store-tokens#how-to-implement

答案 1 :(得分:3)

  1. JWT永远不应存储在您的localStorage中
  2. 实际上,它们甚至都不应该存储在您的Cookie中除非您能够实施非常严格的CSRF保护

Checkout this for motivation

  • JWT作为id_token就像您的用户凭据
  • JWT作为access_token就像您的会话令牌

最安全的选项是在内存中。 Checkout this for a deep dive