angularjs - 如何将 JWT token 存储在仅限 HTTP 的 cookie 中?

标签 angularjs express cookies passport.js jwt

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

另一方面,AngularJS 获取此 token ,将其存储在 session 存储中,并使用身份验证拦截器每次来回将 token 发送回服务器。

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

在这种情况下,我了解 token 来回转移的方法。但是,有人会在高层次上解释一下当您想将该 JWT 存储在客户端 Javascript 无法读取的仅 HTTP 的安全 cookie 中时发生的方法吗?

例如:凭证成功后

  • cookie 在服务器上创建,
  • 与 cookie 同时创建 JWT
  • 将 JWT 存储在名为 token 等的 cookie 属性中。

  • 我试图在这里获得它如何工作的心理模型。如果我的理解是正确的,这样做将不再需要身份验证拦截器,因为在正确的凭据登录后,服务器将执行 cookie 内 token 的所有传输。

    最佳答案

    处理 cookie 有相当多的微妙之处,但在高层次上,cookie 是您的网络服务器可以设置的一段数据,然后由用户的网络浏览器存储,并在 future 的任何请求中发送回服务器只要 cookie 有效且适用于所发出的请求,浏览器就会访问同一台服务器。

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

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

    总结一下,cookies是HTTP的一种状态管理机制,见相关RFC 2617更多细节。

    相比之下,JWT 只是一些具有众所周知的表示并遵循一些约定的数据。更具体地说,JWT 由 header 、有效载荷和签名部分组成,通常建议在大多数 JWT 用例中保持有效载荷的大小较小。见 Get Started with JSON Web Tokens更多细节。

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

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

    此外,cookie 有过期的概念,因此请记住这一点,因为 JWT 本身在身份验证范围内使用时也有自己的过期概念。

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

    它侧重于传统 session 标识符 cookie 与基于 token (JWT) 身份验证系统之间的差异,该部分名为“在哪里存储 token ?值得一读,因为它解决了存储的安全相关方面。

    TL:DR 人员的总结:

    Two of the most common attack vectors facing websites are Cross Site Scripting (XSS) and Cross Site Request Forgery (XSRF or CSRF). Cross Site Scripting) attacks occur when an outside entity is able to execute code within your website or app. (...)

    If an attacker can execute code on your domain, your JWT tokens (in local storage) are vulnerable. (...)

    Cross Site Request Forgery attacks are not an issue if you are using JWT with local storage. On the other hand, if your use case requires you to store the JWT in a cookie, you will need to protect against XSRF.



    (重点是我的)

    关于angularjs - 如何将 JWT token 存储在仅限 HTTP 的 cookie 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39810741/

    相关文章:

    javascript - 在 ng-repeat 中按顺序生成数字

    javascript - 无法使用带有 express 的 mongodb 调用未定义的方法 'get'

    javascript - node.js 需要 memcached 是什么?

    javascript - Google Puppeteer 未获取所有第三方 cookie

    java - 删除 HttpSessionListener 中的 Cookie

    angularjs - AngularJS 依赖注入(inject)有什么好处?

    javascript - 类型错误 : Cannot read property 'post' of undefined

    javascript - Angular 异步http请求

    javascript - 通过node中的Module.exports继承

    javascript - 如何使用 node.js (express) 处理 get 请求