专栏名称: 前端早读课
我们关注前端,产品体验设计,更关注前端同行的成长。 每天清晨五点早读,四万+同行相伴成长。
目录
相关文章推荐
前端早读课  ·  【早阅】JWT 认证:最佳做法和何时使用 ·  昨天  
前端早读课  ·  【早阅】JS中的OOPS - 终极指南 ·  2 天前  
前端早读课  ·  【第3385期】你不知道的字体特点 ·  4 天前  
前端早读课  ·  【第3384期】Chrome 126 ... ·  6 天前  
前端大全  ·  Chrome 129:正式推出原生的 ... ·  1 周前  
51好读  ›  专栏  ›  前端早读课

【早阅】JWT 认证:最佳做法和何时使用

前端早读课  · 公众号  · 前端  · 2024-10-02 08:00

正文

作者:@Flavio Copes
原文:https://blog.logrocket.com/jwt-authentication-best-practices/

背景

JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,通常用于服务器和客户端之间的身份验证。JWT 中的信息可以经过数字签名,便于验证其真实性和完整性。

【早阅】会话令牌和JWT结合的优势

最近,Chigozie Oduah 在 2024 年 9 月 12 日更新了一篇关于 JWT 认证的教程,讨论了现代 JWT 的一些不足之处,如缺乏加密、依赖 JavaScript 存储令牌、易受 XSS 和 CSRF 攻击,以及浏览器施加的大小限制。

JWT 的结构是怎样的?

JWT 由三部分组成,以点号 (.) 分隔:

 (Header).(Payload).(Signature)
  • 标头 (Header):标头通常包含两部分信息:令牌类型 (JWT) 和所使用的签名算法,例如 HMAC SHA256 (HS256)。

  • 有效载荷 (Payload):有效载荷包含声明 (claims),声明是指令牌中包含的信息,用于说明令牌主题和相关权限。

  • 签名 (Signature):签名部分用于验证令牌的完整性,确保信息在传输过程中没有被篡改。

JWT 如何用于身份验证?
  • 用户使用其凭据登录应用程序。

  • 服务器验证凭据后,将生成一个 JWT,其中包含用户信息或会话 ID。

  • 服务器将 JWT 返回给客户端。

  • 客户端在本地存储 JWT(例如,浏览器中的 LocalStorage 或 Cookie)。

    • LocalStorage: 仅限于单一网域,更安全但容易受到 XSS 攻击。

    • Cookie: 可以跨网域使用,但容易受到 CSRF 攻击。应设置 HttpOnly 和 Secure 标志以增强安全性。

  • 之后,客户端在每个请求中都包含 JWT,通常在 Authorization 标头中,以便访问受保护的资源。

  • 服务器验证 JWT 的签名和有效期,如果有效,则允许访问受保护的资源。

使用 JWT 身份验证有什么优点?
  • 无状态性: JWT 是自包含的,包含验证所需的所有信息,避免了服务器端存储会话信息的需要。

  • 可扩展性: JWT 可以轻松地在多个服务器和应用程序之间共享,实现单点登录 (SSO)。

  • 安全性: JWT 使用数字签名来确保其完整性,防止数据篡改。

JWT 与传统会话管理相比如何?
  • 传统会话管理依赖于服务器端存储会话数据,而 JWT 将所有必要信息存储在令牌中,实现无状态性。

  • JWT 更易于扩展,因为它可以在多个应用程序和服务器之间共享。

要点

JWT 在现代 Web 开发中广泛用于身份验证,但其安全性存在一些显著的不足,包括缺乏加密、依赖 JavaScript 存储、易受攻击以及大小限制。

【早阅】了解JWT、OAuth和Bearer令牌

分析

  1. 缺乏加密:JWT 的签名机制确保了数据的完整性,但并未提供加密功能。这意味着 JWT 中的敏感信息(如用户 ID、角色等)在传输过程中是明文可见的,容易被窃取。

  2. 依赖 JavaScript 存储:JWT 通常存储在浏览器的 localStorage 或 sessionStorage 中,这使得它们容易受到 XSS(跨站脚本攻击)的威胁。攻击者可以通过注入恶意脚本来窃取这些令牌。

  3. 易受攻击:JWT 的签名机制虽然确保了数据的完整性,但仍可能受到 CSRF(跨站请求伪造)攻击。攻击者可以通过伪造请求来利用存储在客户端的 JWT 进行未授权操作。【第3241期】利用Png做持久型XSS攻击

  4. 大小限制:JWT 的大小受限于浏览器的存储限制,如 localStorage 的 5MB 限制。这限制了 JWT 中可以包含的信息量,尤其是在需要传输大量用户数据时。

影响

这些不足对 Web 应用的安全性和性能产生了显著影响:

  • 安全性:缺乏加密和易受攻击的存储方式使得 JWT 在处理敏感信息时存在较高的风险。

  • 性能:大小限制可能导致在需要传输大量数据时,JWT 无法满足需求,从而影响应用的性能和用户体验。

结论

尽管 JWT 在身份验证中提供了便利,但其安全性和性能方面的不足需要开发者谨慎对待。未来,随着 Web 应用对安全性和性能要求的不断提高,可能需要开发新的标准或技术来替代或增强 JWT 的功能。开发者应密切关注这些发展,并在实际应用中采取适当的安全措施,如使用加密的 JWT、限制敏感信息的存储等,以确保应用的安全性和性能。

【第3243期】告别繁琐的数据校验:用JSON Schema简化你的代码

观点

  • 不要将 JWT 存储在本地存储或会话存储中:这样做可能会让第三方脚本轻易访问到 token,从而导致安全风险。

  • 即使有 CSRF 保护,也不能依赖本地存储:CSRF 令牌可以防止 CSRF 攻击,但不能阻止脚本读取本地存储中的 JWT。

  • JWT 有效载荷是可读的:由于 JWT 的有效载荷部分可以被解码,因此不应在其中包含敏感数据。

  • 使用 HTTPS 传输 JWT:确保 JWT 在传输过程中的安全性,防止中间人攻击。

  • 在服务器端验证 JWT 有效载荷:虽然 JWT 签名可以验证其完整性,但服务器应进一步验证有效载荷中的数据,以确保其有效性和安全性。

AI 阅:了解技术资讯的一种方式。