2016-11-13 79 views
0

我正在使用基于JWT的身份验证构建SPA应用程序并进行服务器端呈现。存储在Cookie中的JWT - 安全问题

当前实现:

  • JWT令牌发放和成功的用户名和密码验证
  • 令牌之后转移到客户端,然后存储在cookie的(不HttpOnly) - 的这样做的目的是为了避免需要完全刷新或关闭页面
  • 记录与令牌
  • Authorization头将已删除的cookie后再次登录连接到每个API请求,如果令牌存在
  • 完整的SSL流量

我不能在令牌的localStorage存储,因为服务器端渲染,也没有HttpOnly因为我需要为了构建Authorization头访问的cookie。

在这样的架构中窃取令牌有什么可能性?

回答

0

一个主要的风险是应用程序中的任何单个跨站点脚本漏洞都可能用于从cookie中窃取令牌,因为它不是httpOnly(虽然我理解为什么会是这种情况)。像JavaScript这样的JavaScript重载应用程序中的XSS是非常常见和难以避免的。

另外你还说令牌保存在cookie中,以便在关闭浏览器之后,用户仍然登录。一方面,这是不好的做法,关闭浏览器的用户可能期望被注销。另一方面,这意味着cookie被持久保存到磁盘,因此攻击者从客户端窃取cookie更容易。另一件想到的事情是跨站点请求伪造(CSRF),但是如果我理解正确,身份验证实际上是基于Authorize标头,其中标记在每个请求中被复制。如果是这样的话,CSRF对你来说不是问题(但是如果在cookie中发送令牌就足够了)。

因此,在最起码,我想你应该

  • 不使用持久的cookie的令牌

  • 尝试通过自动扫描你的代码,以尽量减少XSS(如的机会,但这绝不会是100%,也是通过仔细选择安全的默认技术)

  • 请确保auhintication基于Authorize标题而不是cookie

仍然主要是因为XSS风险,我可能不会推荐在安全关键型应用程序中这样做。

+0

事实上(纠正我,如果我错了)通过cookie发送令牌(因为该cookie存在,并且浏览器自动发送)在初始的,而不是AJAX请求,所以CSRF也是如此。 –

+0

基于你的回答,我认为很好的解决方案是将标记存储在HttpOnly cookie中,然后在初始请求中读取它,并将其保存在Redux JS存储中(正在使用),然后在每一个下一个使用'Authorization'标头REST请求。据我所知,在第一个问题中描述的架构的情况下,在这里需要CSRF保护。你怎么看待这件事? –

+0

在这种情况下,如果您也使用cookie中的令牌,则还必须关心CSRF。如果认证信息是由浏览器自动发送的,CSRF是一个问题。如果会话ID或令牌在Cookie中。如果只有一个请求头用于身份验证,那么在没有针对CSRF的进一步保护的情况下您会很好。我对Redux并不是很熟悉,但如果Cookie是httpOnly,那么您将无法从JavaScript访问它,因此您将无法使用Redux JS进行存储。将JWT存储在httpOnly cookie中使其更安全,但使用案例将受到限制。 –