当前位置: 首页 > 知识库问答 >
问题:

在客户端Javascript应用程序中处理JWT令牌-http只有Cookie与Local存储

安奇
2023-03-14

我看过的大多数博客文章都建议使用httpOnly cookies,以便在客户端(javascript应用程序)上安全地存储jwt令牌。我对此有几个问题(我在那些博客文章中找不到)。

    < li >如果jwt令牌存储在httpOnly cookie中,javascript应用程序将无法访问令牌,也无法知道当前用户的身份验证状态。我们该如何处理? < li >“使用httpOnly cookie”在API端是否符合REST的无状态性? < li >对jwt令牌使用localStorage可以吗?我们只需要提防XSS?

共有2个答案

易书
2023-03-14

如果jwt令牌存储在httpOnly cookie中,javascript应用程序无法访问令牌,也无法知道当前用户的身份验证状态。我们如何处理?

令牌可能对客户端隐藏,但这并不意味着客户端不能拥有任何信息。当客户机向服务器发出成功的请求,并且服务器对客户机进行身份验证时,响应可以在HttpOnly cookie中包含JWT,当客户机看到请求成功时,就在本地存储中设置一个标志,指示cookie存在(即使JS不能访问它),或者指示cookie的过期日期。

然后,客户机可以在将来的页面加载中使用存储中的这个值来查看向服务器发出的请求是否会成功(也就是说,HttpOnly cookie存在,并且它包含有效的JWT)。如果该值存在,客户端可以发出请求,服务器可以验证cookie,并将信息发送回客户端,而无需客户端直接通过JavaScript访问JWT。

也就是说,这种方法有点麻烦,而且只适用于页面上可能运行着其他不一定值得信赖的代码的情况。当我的一个应用程序在我无法控制的外部域上的页面上运行时,我使用这种方法,还有我不太了解的其他脚本——使用Http比如说cookie意味着我的服务器可以安全地在那里存储客户端信息,而不必担心页面上的其他脚本可能在做什么。

如果应用程序运行的页面是您自己的,您可以选择将JWT存储在普通(非HttpOnly cookie)或本地存储中,并通过JavaScript访问它。

“对jwt token使用localStorage”就可以了吗?我们只需要提防XSS?

如果它在您自己的页面上,是的,在大多数情况下。如果 JWT 可以使用 JavaScript 访问,恶意 JavaScript 可以抓取它 - 这是唯一的担忧。

农鸿德
2023-03-14

使用httpOnly的建议是避免使用恶意代码(例如XSS、脚本注入)来读取JWT。这是在这样的假设下进行的,即身份验证仅在后端完成,如果Javascript代码需要从JWT中提取一些信息,则httpOnly不起作用。

我不认为这与其余地区的无国籍状态有任何关系。

使用localStorage有这个风险,但是如果需要的话,是的,你需要小心。

 类似资料:
  • Stormpath 中有很多博客文章讨论了您应该如何使用 cookie 而不是 sessionStorage/localStorage 来存储您的 JWT: https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage https://stormpath.com/blog/token-auth-sp

  • 我正在使用Spring Boot 2.1.3和Spring Security 5.1.3实现一个OAuth2 web应用程序客户端,它通过授权代码授予类型从授权服务器获取JWT令牌,并调用受保护的资源服务器。 这是到目前为止的执行情况: 安全配置和用于调用受保护资源的restTemplate bean: 和调用受保护资源服务器的控制器: OAuth2客户端配置直接在application.yml中

  • 我正在用Django和angular构建一个应用程序。目前,我正在本地存储上存储后端发布的JWT。但是,我担心XSS攻击。我应该使用仅HTTP cookie存储令牌吗?我还考虑将令牌存储在auth服务类的变量字段中。但我不能完全确定angular是否在整个应用程序中共享该服务。我的身份验证服务是否只有一个实例?

  • 我正在尝试使用 GraphQL 使用 JWT 对用户进行身份验证。登录用户后,我会收到令牌作为 JSON 响应和存储刷新令牌的 httponly cookie。(服务器端使用的是销售核心) 从Saleor的文档和其他一些博客帖子中,我假设这个响应cookie现在应该存储在浏览器中,每当我需要刷新令牌时,cookie refreshToken将用于验证我的请求。然而,当我在开发工具中将选项卡切换到“

  • 我的SPA应用程序使用以下体系结构(来源): 这假设我的客户端应用程序知道刷新令牌,因为如果没有用户凭据(例如电子邮件/密码),我需要它来请求新的访问令牌。 我的问题:在客户端应用程序中,刷新令牌存储在哪里?关于这个话题有很多问题/答案,但是关于刷新标记,答案并不清楚。 访问令牌和刷新令牌不应存储在本地/会话存储器中,因为它们不是存放任何敏感数据的地方。因此,我会将访问令牌存储在一个cookie中

  • 我使用带有Angular 9的Spring boot和无状态会话实现。应用程序正在成功执行登录和注册功能。字符串引导在每个登录请求上生成令牌(JWT)。登录后,当我尝试运行第二个选项卡的应用程序时,它再次要求我登录。为了克服这个问题,我将令牌保存在LocalStorage,然后在单击另一个选项卡时,angular代码能够从LocalStorage中选择令牌。但是经过一些研发,我知道应该使用HTTP