专栏名称: 前端早读课
我们关注前端,产品体验设计,更关注前端同行的成长。 每天清晨五点早读,四万+同行相伴成长。
目录
相关文章推荐
大力如山  ·  你以为的人生和你正在过的人生? ·  2 天前  
前端早读课  ·  【第3434期】VSCode 推出 ... ·  2 天前  
每日意图  ·  双语 | 内心不舒服的真相 ·  2 天前  
每日意图  ·  双语 | 内心不舒服的真相 ·  2 天前  
格斗迷  ·  格斗高手鬼屋受惊!一腿踢断NPC下巴 ·  4 天前  
太星小升初  ·  人大附中教育集团扩军了 ·  4 天前  
51好读  ›  专栏  ›  前端早读课

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

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

主要观点总结

本文介绍了JSON Web Token (JWT) 的基本概念、结构、在身份验证中的应用及其优缺点。文章强调了JWT在安全性方面的一些不足,如缺乏加密、依赖JavaScript存储令牌、易受XSS和CSRF攻击,以及浏览器施加的大小限制。同时,文章也给出了针对这些不足的一些建议。

关键观点总结

关键观点1: JWT的基本概念和结构

JWT是一种开放标准,用于服务器和客户端之间的身份验证。它由三部分组成:标头、有效载荷和签名。

关键观点2: JWT在身份验证中的应用

用户凭据登录后,服务器生成包含用户信息或会话ID的JWT,返回给客户端存储。之后,客户端在每个请求中都包含JWT,以便访问受保护的资源。

关键观点3: JWT的优点

JWT具有无状态性、可扩展性和安全性。无状态性意味着不需要服务器端存储会话信息;可扩展性则使其易于在多个服务器和应用程序之间共享,实现单点登录(SSO);安全性则通过数字签名确保完整性。

关键观点4: JWT的不足之处

JWT存在一些安全性方面的不足,如缺乏加密、依赖JavaScript存储、易受XSS和CSRF攻击,以及浏览器施加的大小限制。这些不足可能对Web应用的安全性和性能产生显著影响。

关键观点5: 对JWT安全性的建议

为了确保JWT的安全性,开发者应采取一些措施,如使用加密的JWT、不将JWT存储在本地存储或会话存储中、使用HTTPS传输JWT,以及在服务器端验证JWT有效载荷。


正文

作者:@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 阅:了解技术资讯的一种方式。