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

标签 angularjs express cookies passport.js jwt

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

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

我最近才了解到这种做法有多么危险。

我了解在这种情况下代币来回转移的方法。但是,是否有人能从高层次上解释一下当您想要将该 JWT 存储在客户端 Javascript 无法读取的安全、仅限 HTTP 的 cookie 中时所采用的方法?

例如:凭证成功后

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

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

最佳答案

处理 cookie 有其微妙之处,但从高层次来看,cookie 是您的网络服务器可以设置的一段数据,然后由用户的网络浏览器存储并在任何情况下发送回服务器。只要 cookie 有效并且适用于正在发出的请求,浏览器将来就会向同一服务器发出请求。

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

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

综上所述,cookie是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 - Ionic、Cordova、Phonegap 加载消息

javascript - Angular Controller 错误: 'Controller is not a function, got undefined'

javascript - DHtmlX 调度程序事件未在 Safari 和 Internet Explorer 中显示

java - Cookie http 仅适用于 spring security 和 servlet 2.5?

url - 为 URL 请求设置 Cookie

C#在重定向的HttpWebRequest中发送cookie

javascript - AngularJS 将常量注入(inject)工厂时出现未知提供者错误

angularjs - 推荐使用 $http.get 的地方在哪里

javascript - 错误: StatusCodeError: 413 - {"error": {"code":413 ,"message" :"request entity too large"}}

html - 使用 Jade 呈现的 HTML 值中的额外空格