本文介绍了JSON Web Token (JWT) 的基本概念、结构、在身份验证中的应用及其优缺点。文章强调了JWT在安全性方面的一些不足,如缺乏加密、依赖JavaScript存储令牌、易受XSS和CSRF攻击,以及浏览器施加的大小限制。同时,文章也给出了针对这些不足的一些建议。
用户凭据登录后,服务器生成包含用户信息或会话ID的JWT,返回给客户端存储。之后,客户端在每个请求中都包含JWT,以便访问受保护的资源。
JWT具有无状态性、可扩展性和安全性。无状态性意味着不需要服务器端存储会话信息;可扩展性则使其易于在多个服务器和应用程序之间共享,实现单点登录(SSO);安全性则通过数字签名确保完整性。
JWT存在一些安全性方面的不足,如缺乏加密、依赖JavaScript存储、易受XSS和CSRF攻击,以及浏览器施加的大小限制。这些不足可能对Web应用的安全性和性能产生显著影响。
为了确保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)。
之后,客户端在每个请求中都包含 JWT,通常在 Authorization 标头中,以便访问受保护的资源。
服务器验证 JWT 的签名和有效期,如果有效,则允许访问受保护的资源。
使用 JWT 身份验证有什么优点?
无状态性: JWT 是自包含的,包含验证所需的所有信息,避免了服务器端存储会话信息的需要。
可扩展性: JWT 可以轻松地在多个服务器和应用程序之间共享,实现单点登录 (SSO)。
安全性: JWT 使用数字签名来确保其完整性,防止数据篡改。
JWT 与传统会话管理相比如何?
要点
JWT 在现代 Web 开发中广泛用于身份验证,但其安全性存在一些显著的不足,包括缺乏加密、依赖 JavaScript 存储、易受攻击以及大小限制。
【早阅】了解JWT、OAuth和Bearer令牌
分析
缺乏加密:JWT 的签名机制确保了数据的完整性,但并未提供加密功能。这意味着 JWT 中的敏感信息(如用户 ID、角色等)在传输过程中是明文可见的,容易被窃取。
依赖 JavaScript 存储:JWT 通常存储在浏览器的 localStorage 或 sessionStorage 中,这使得它们容易受到 XSS(跨站脚本攻击)的威胁。攻击者可以通过注入恶意脚本来窃取这些令牌。
易受攻击:JWT 的签名机制虽然确保了数据的完整性,但仍可能受到 CSRF(跨站请求伪造)攻击。攻击者可以通过伪造请求来利用存储在客户端的 JWT 进行未授权操作。【第3241期】利用Png做持久型XSS攻击
大小限制:JWT 的大小受限于浏览器的存储限制,如 localStorage 的 5MB 限制。这限制了 JWT 中可以包含的信息量,尤其是在需要传输大量用户数据时。
影响
这些不足对 Web 应用的安全性和性能产生了显著影响:
结论
尽管 JWT 在身份验证中提供了便利,但其安全性和性能方面的不足需要开发者谨慎对待。未来,随着 Web 应用对安全性和性能要求的不断提高,可能需要开发新的标准或技术来替代或增强 JWT 的功能。开发者应密切关注这些发展,并在实际应用中采取适当的安全措施,如使用加密的 JWT、限制敏感信息的存储等,以确保应用的安全性和性能。
【第3243期】告别繁琐的数据校验:用JSON Schema简化你的代码
观点
不要将 JWT 存储在本地存储或会话存储中:这样做可能会让第三方脚本轻易访问到 token,从而导致安全风险。
即使有 CSRF 保护,也不能依赖本地存储:CSRF 令牌可以防止 CSRF 攻击,但不能阻止脚本读取本地存储中的 JWT。
JWT 有效载荷是可读的:由于 JWT 的有效载荷部分可以被解码,因此不应在其中包含敏感数据。
使用 HTTPS 传输 JWT:确保 JWT 在传输过程中的安全性,防止中间人攻击。
在服务器端验证 JWT 有效载荷:虽然 JWT 签名可以验证其完整性,但服务器应进一步验证有效载荷中的数据,以确保其有效性和安全性。
AI 阅:了解技术资讯的一种方式。