定义
JWT (JSON WEB TOKEN) 是一种安全通讯标准,它定义了一种紧凑自包含的方式,用于在各方之间安全的传输 JSON 对象。常见应用场景是API之间的认证通讯。
一般的用户认证流程
1、请求方发送账户密码到服务器,验证账户可用性。
2、验证成功,生成 session,保存在服务端。
3、服务端返回一个 session ID, 保存在客户端 cookie 中。
4、客户端请求时携带 cookie。
5、服务器解析 cookie 中携带的 session ID,验证通过后返回响应数据。
以上流程核心是基于 session 进行状态管理,这样的认证方案有以下问题:
1、客户端如果禁用 cookie,将无法维持请求的身份验证状态。
2、分布式部署的环境中,需要考虑多机 session 的一致性。
3、请求会产生跨域问题。
JWT 原理
服务器和客户端之间的通讯信息完全采用 json 传递,不需要使用 session 进行状态维持。
- JWT 的格式包含三个部分
1、头部(Header),描述 JWT 的元数据,通常由令牌类型和加密用到签名算法组成,例如
{
"alg": "HS256", #加密方式
"typ": "JWT" #令牌类型
}
2、载荷(Payload),信息传输的主要内容,包含
- 注册信息,包含 iss(发出者),exp(到期时间),sub(主题),aud(受众)
- 公共信息,官方定义的其它的字段,因为 JWT 默认不是加密的,任何人都可以读取到公共信息,所以不要把敏感数据放到这里
- 私有信息,平台间协定的私有字段
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
3、签名(Signature),根据头部和载荷,加盐后根据头部指定算法生成
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
头部和载荷根据算法 Base64URL 进行转换,结合签名按顺序以”.“拼接形成 JWT 。
jwt.png
JWT 的用法
当客户端根据凭证成功登陆时,服务器将返回 JWT,客户端每次访问都应该携带 JWT,可以将放入cookie,但存在跨域问题,好的解决方式是加入 HTTP 请求头 Authorization 中
Authorization: Bearer <token>
JWT 的特点
1、JWT 脱离了 session 的束缚,服务端不需要再维持 session 状态,但也无法控制 token 的状态了,JWT 一旦签发,在到期之前始终有效,除非服务器有额外的验证逻辑。
2、JWT 可以很方便的支持跨域。
3、JWT 本身包含了验证信息,如果发生泄漏,任何人都可以使用令牌的权限进行请求。
4、JWT 本身不加密,需要通过更安全的 HTTPS 协议传输。