如何在仅HTTP cookie中存储JWT令牌?

15 cookies express jwt angularjs passport.js

我创建了一个应用程序,它只使用服务器在正确的登录凭据上发送的JWT,并授权/api我的后端Express.js服务器上的任何路由.

另一方面,AngularJS使用此令牌,将其存储在会话存储中,并且每次使用auth拦截器将令牌发送回服务器.

我最近才明白这种做法有多危险.

在这种情况下,我理解来回传递令牌的方法.但是,如果您希望将JWT存储在客户端Javascript无法读取的安全的,仅HTTP的cookie中,那么有人会非常善意地解释发生的方法吗?

例如:凭证成功

  1. cookie在服务器上创建,
  2. 在cookie的同时创建一个JWT
  3. 将JWT存储在名为token等的cookie属性中.

我试图在这里获得一个关于它是如何工作的心智模型.如果我的理解是正确的,那么这样做就不再需要auth拦截器,因为在正确的凭证登录时,服务器将在cookie内完成所有的令牌传输.

Joã*_*elo 15

处理cookie具有公平的微妙之处,但在较高的层面上,cookie是您的Web服务器可以设置的一段数据,然后由用户的Web浏览器存储,并在以后的任何请求中发送回服务器.只要cookie有效且适用于正在进行的请求,浏览器就会生成相同的服务器.

(这就是为什么你不再需要使用Angular拦截器,因为它是确保cookie被发送的浏览器本身)

除了一些特殊标志选项,如仅HTTP,在更高级别,您可以将cookie设置为与给定域和路径相关联.例如,您的服务器可以设置cookie,使其稍后只能由浏览器发送到/api路径下发出的请求.

总结一下,cookie是HTTP的状态管理机制,有关更多详细信息,请参阅相关的RFC 2617.

相比之下,JWT只是一些具有众所周知的表示并遵循一些约定的数据.更具体地说,JWT由头部,有效载荷和签名部分组成,并且通常建议在大多数JWT用例中保持有效载荷的大小.有关更多详细信息,请参阅JSON Web令牌入门.

如果您浏览上一篇文章,您会注意到JWT的最终表示形式是由点分隔的三个Base64url编码字符串.这特别令人感兴趣,因为它意味着JWT非常适合在HTTP中使用,包括作为cookie的值.

要记住的一点是,通过规范,您只能保证浏览器将支持每个cookie最多4096个字节的cookie(以cookie的名称,值和属性的长度总和来衡量).除非您存储令牌中的大量数据,否则您不应该遇到问题,但始终需要考虑.是的,您也可以将JWT令牌分解为多个cookie,但事情开始变得更加复杂.

此外,cookie有他们的到期概念,所以请记住,因为JWT本身,当在身份验证范围内使用时,也会有自己的到期概念.

最后,我只想解决一些关于将JWT存储在localStorage/中的问题sessionStorage.你是对的,如果你这样做,你必须理解它的含义,例如,与存储相关联的域中的任何Javascript代码都能够读取令牌.但是,仅HTTP的cookie也不是银弹.我会给以下文章读一读:Cookies vs Tokens:The Definitive Guide.

它侧重于传统会话标识符cookie与基于令牌的(JWT)身份验证系统之间的差异,名为Where to Store Tokens的部分保证阅读,因为它解决了存储的安全相关方面.

TL的摘要:DR人员:

面向网站的两种最常见的攻击媒介是跨站点脚本(XSS)和跨站点请求伪造(XSRF或CSRF).当外部实体能够在您的网站或应用程序中执行代码时,就会发生跨站点脚本攻击.(......)

如果攻击者可以在您的域上执行代码,则您的JWT令牌(在本地存储中)容易受到攻击.(......)

如果您将JWT与本地存储一起使用,则跨站点请求伪造攻击不是问题.另一方面,如果您的用例要求您将JWT存储在cookie中,则需要防止XSRF.

(重点是我的)

  • 实际上,将 JWT 存储在 cookie 中不是问题,问题是服务器正在根据 cookie 检查它。 (2认同)
  • 但关键是我们可以通过生成 XSRF 令牌来防止 XSRF,但我们无法防止 XSS,因为用户的浏览器中肯定会有一些 chrome/firefox 扩展/插件,并且他们可以轻松读取会话/localStorage。没有办法阻止这种情况。 (2认同)