JSON Web Token (JWT)
JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。此信息可以被验证和信任,因为它是经过数字签名的。JWT可以使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
JWT结构
JWT由三个部分组成,用点(.)分隔,它们是:
.yyyyy.zzzzz
-
:
包含令牌类型(JWT)和签名算法(例如HS256、RS256)
-
载荷 :
包含声明 - 关于实体(通常是用户)和其他数据的语句
-
签名 :
用于验证JWT的发送者就是它所声称的那个人,并确保消息在传输过程中没有被更改
签名算法
JWT支持多种签名算法:
- HS256: HMAC使用SHA-256。使用共享密钥的对称算法
- HS384: HMAC使用SHA-384。使用更强哈希的对称算法
- HS512: HMAC使用SHA-512。使用最强哈希的对称算法
- RS256: RSA签名使用SHA-256。使用公钥/私钥对的非对称算法
- RS384: RSA签名使用SHA-384。使用更强哈希的非对称算法
- RS512: RSA签名使用SHA-512。使用最强哈希的非对称算法
标准声明
JWT定义了几个标准声明(注册的声明名称),提供有用的信息:
- iss (Issuer): 令牌颁发者
- sub (Subject): 令牌的主题(用户ID)
- aud (Audience): 预期的受众
- exp (Expiration Time): 过期时间(Unix时间戳)
- nbf (Not Before): 生效时间
- iat (Issued At): 签发时间
- jti (JWT ID): 令牌的唯一标识符
常见用例
- 认证:用户登录后,每个后续请求都包含JWT,允许访问路由、服务和资源
- 信息交换:通过签名验证安全地在各方之间传输信息
- 单点登录(SSO):由于开销小且跨域能力强,广泛用于SSO功能
- API授权:RESTful API的无状态认证
- OAuth 2.0和OpenID Connect:现代认证协议的核心组件
安全提示:
JWT令牌经过签名以验证真实性,但默认情况下不加密。除非单独加密,否则不要在载荷中存储敏感信息。始终使用HTTPS传输令牌。安全存储令牌(例如,Web应用程序使用httpOnly cookie)。实施适当的令牌过期和刷新机制。永远不要在客户端代码中暴露您的密钥。