将 JWT 存储在基于会话的 cookie Angular 6 中

Posted

技术标签:

【中文标题】将 JWT 存储在基于会话的 cookie Angular 6 中【英文标题】:Storing JWT in session based cookie Angular 6 【发布时间】:2019-02-18 02:28:54 【问题描述】:

我是 Angular 开发的新手,想知道存储 JWT 的正确方法是什么?

我正在使用 Auth0 身份验证在 Angular 6.1 单页应用程序中开发应用程序。

身份验证发生后,Auth0 返回一个 JWT(访问令牌(jwt)),然后应用程序将其存储在本地存储中。然后,客户端应用程序对 api(MVC C#) 中的 [authorize] 修饰方法进行后调用,以验证对 api 资源的访问。该 api 正在使用 OWIN 并进行验证。

虽然访问令牌中包含颁发者和受众值,这些值由 OWIN 中间件检查,但我担心的是任何人都可以从本地存储访问它并稍后重用它并通过登录过程吗?

我应该将“access_token”存储在服务器端的会话 cookie 中吗?

任何指导将不胜感激。

【问题讨论】:

security.stackexchange.com/questions/116898/… 【参考方案1】:

在服务器端存储“access_token”是个坏主意,因为它破坏了无状态 JWT Auth 的主要目的。采用这种方式,您可以在后端实现任何其他类型的授权,例如存储在数据库中的旧的、良好的会话,并且不需要 JWT。

JWT 必须是无状态的,这是真的 -> 有人可以重用您的令牌。但是您可以实施很好的技巧来防止这种不安全的情况。您可以生成带有用户 IP 地址的 JWT(将 IP 地址添加到 JWT 内容中)。

因此,您可以在授权中间件(一些 preAuth 钩子?)中实现纯逻辑,这将验证请求 IP 是否等于存储在 JWT 中的 IP。如果 IP 地址改变了,那么可能有人偷了令牌。

【讨论】:

如果您要通过连接到 3g/4g 等网络的移动设备使用您的应用程序,IP 地址可能会经常变化。【参考方案2】:

Blockquote 虽然访问令牌中包含颁发者和受众值,由 OWIN 中间件检查,但我担心的是任何人都可以从本地存储访问它并稍后重用它并通过登录过程吗?

是的,他们可以重复使用它。但是您可以设置主令牌的到期时间并创建刷新令牌并在 X 时间主令牌和刷新令牌中刷新它,当主令牌过期时您要求刷新令牌,如果它有效则刷新两个令牌。这比无休止的访问令牌更好,有人可以重复使用。您在拦截器中实现此逻辑,当令牌从后端过期时,您返回状态 403,当您在前端获得此状态时,您将主令牌和刷新令牌发送到后端以刷新它。如果两个令牌有效,则刷新它,否则断开用户连接。

【讨论】:

以上是关于将 JWT 存储在基于会话的 cookie Angular 6 中的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net 核心中的会话和应用程序变量,以防我们使用 JWT 令牌(因此没有基于 cookie 的会话)

具有基于 HttpOnly cookie 的身份验证和会话管理的单页应用程序

将 jwt 保存在 cookie 中以将其传递到本地存储是不是安全?

快速了解会话管理三剑客cookiesession和JWT

ASP.Net Core 2.1 API JWT 无 cookie 会话?

会话 cookie 与 JWT