JSON Web Token,是目前最流行的跨域认证解决方案,是一种基于Token的认证授权机制
JWT自身包含了身份验证所需要的所有信息,因此,服务器不需要存储Session信息
JWT 更符合设计RESTful API的 Stateless 原则
使用JWT认证可以有效避免CSRF攻击
组成
header:
{ "alg": "HS246", "typ": "JWT" }
- 定义生成签名的算法
- 定义Token类型
payload
{ "sub": "1234567890", "name": "Ethan", "admin": true, "iat": 1516239022 }
- 存放实际需要传输的数据
iat
是时间戳
signature
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret )
- 服务器通过payload、header、密钥使用header中指定的签名算法生成
基本格式:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
用法
- 用户向服务器发送登录表单
- 校验正确,服务端返回已经签名的Token,即JWT
- 用户以后每一次发送请求都在Header里带上这个JWT
- 服务端检查JWT并从中获取用户信息
注意事项
- 最好把JWT存在localStorage里面,防在Cookie里有CSRF风险
- 常见做法是把JWT放在HTTP Header的
Authorization
字段中(Authorization: Bearer Token
)