JSON WEB TOKEN为了在网络应用环境间传输声明而执行的一种基于JSON的开放标准 被设计为紧凑且安全的,适用于分布式站点的单点登录
传统的session认证
基于session的认证是应用本身很难扩展
- session session保存在内存中,随着认证用户增加,服务端开销明显增大
- 扩展性 服务端做认证记录,用户下次请求必须在这台服务器上,限制了扩展的能力
- CSRF 基于cookie认证会遭到伪造的攻击
基于token的鉴权机制
无状态 为扩展提供了便利
- 用户使用用户名密码登录
- 服务器发送给用户token
- 客户端存储token 并在每次请求都附加token
- 服务端验证token 并返回数据
JWT构成
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
header
{
'typ':"JWT",
"alg":"HS256"
}
进行base64加密
playload
存放有效信息 (base64加密)
- 标准中注册的声明
- 公共声明
- 私有声明
**iss**: jwt签发者
**sub**: jwt所面向的用户
**aud**: 接收jwt的一方
**exp**: jwt的过期时间,这个过期时间必须要大于签发时间
**nbf**: 定义在什么时间之前,该jwt都是不可用的.
**iat**: jwt的签发时间
**jti**: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
{
"sub":"1234567",
"name":"johen",
"admin":true
}
signature
签名部分 base64(header) + "." + base64(payload) 在加盐 HA256加密
加盐是保存在服务端
优点 服务器只保存secret
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。