什么是JWT?
JWT(JSON Web Token)是一种用于在各方之间安全传输信息的紧凑型自包含令牌格式。了解JWT的定义、工作原理及应用场景。
JWT是一种开放标准(RFC 7519),定义了一种紧凑、自包含的方式,以JSON对象形式在各方之间安全传输信息。令牌通过HMAC(使用密钥)或RSA/ECDSA(使用密钥对)进行数字签名,使其可验证且可信赖。JWT最常用于Web应用程序的身份验证和授权。
JWT结构
JWT由三个Base64URL编码的部分组成,用点分隔: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuW8oOS4iSIsImlhdCI6MTUxNjIzOTAyMn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c • 头部(Header)——算法和令牌类型:{"alg": "HS256", "typ": "JWT"} • 载荷(Payload)——声明(数据):{"sub": "1234", "name": "张三", "iat": 1516239022} • 签名(Signature)——HMACSHA256(base64(头部) + "." + base64(载荷), 密钥)
JWT身份验证工作原理
1. 用户使用凭据登录 2. 服务器验证凭据并创建用密钥签名的JWT 3. 服务器将JWT发送给客户端 4. 客户端存储JWT(通常在localStorage或cookie中) 5. 客户端在每个请求的Authorization头中包含JWT: Authorization: Bearer <令牌> 6. 服务器验证JWT签名——如果有效,则授权请求 7. 无需数据库查询——载荷包含所有用户信息
JWT声明
载荷包含声明——关于用户的陈述和附加数据: • 注册声明(标准):iss(签发者)、sub(主题)、aud(受众)、exp(过期时间)、iat(签发时间) • 公共声明:由JWT用户定义,应注册以避免冲突 • 私有声明:用于各方之间共享信息的自定义声明 重要:JWT载荷只是Base64编码,不是加密的。任何人都可以解码并读取载荷——永远不要在JWT载荷中放置敏感数据。
Try it yourself
解码Base64关于JWT
JWT于2010年推出,并于2015年在RFC 7519中正式标准化。它作为基于会话的身份验证的无状态替代方案被广泛采用——由于所有信息都在令牌本身中,服务器不需要存储会话数据。生态系统包括JWS(JSON Web签名)、JWE(JSON Web加密)和JWK(JSON Web密钥)标准。
FAQ
- JWT代表什么?
- JWT代表JSON Web Token(JSON网络令牌)。
- JWT载荷安全/私密吗?
- 不。JWT载荷只是Base64编码,任何人都可以解码。它不是加密的。JWT只保证数据未被篡改(通过签名),而不保证其私密性。如需加密令牌,请使用JWE(JSON Web Encryption)。
- JWT和会话Cookie有什么区别?
- 会话Cookie存储服务器在数据库中查找的会话ID。JWT是自包含的——服务器只需验证签名。JWT是无状态的(无需数据库)但没有额外基础设施无法使其失效,而会话Cookie可以立即使其失效。