JSON Web Token详解
JWT几乎出现在所有现代登录和API中。本指南介绍它的结构、如何读取以及如何安全使用。
三个部分
JWT的形式是xxxxx.yyyyy.zzzzz。第一部分是头部,一个包含算法(alg)和类型(typ)的JSON对象;第二部分是包含声明的载荷;第三部分是用密钥或私钥对前两部分计算出的签名。每部分都经过Base64url编码,可安全用于URL和HTTP头。
注册声明
- iss(签发者):创建并签名令牌的一方。
- sub(主题):令牌所指的用户或服务。
- aud(受众):应当接受令牌的应用。
- exp(过期时间):令牌失效的时间。
- nbf(生效时间):令牌开始有效的时间。
- iat(签发时间):令牌创建的时间。
- jti(JWT ID):用于防止重放的唯一ID。
访问令牌与ID令牌
在OpenID Connect中,ID令牌告诉客户端应用是谁登录了,并包含姓名、邮箱等资料声明。访问令牌发送给API,用来证明调用方被允许做什么,通常带有scope声明。访问令牌应当短期有效,一般为几分钟到一小时,并通过刷新令牌续期。
需要避免的错误
- 只解码不验证就信任令牌中的声明。
- 接受令牌中声明的算法,而不是服务器预期的算法。
- 使用短小、易猜的HMAC密钥,应至少使用32字节的随机值。
- 在载荷中存放敏感数据。
- 签发永不过期的令牌或有效期很长的访问令牌。