Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
Session与JWT的区别:
- session是存放于服务端的,而jwt是存放于客户端的
JWT的组成
eyJhbGciOiJIUzUxMiJ9.//头部(Header)
eyJyYW5kb21LZXkiOiJucTdnc2xjMWxyIiwic3ViIjoieHV5aCIsInVzZXJOYW1lIjoieHV5aCIsImV4cCI6MTU4NzI4MDg0MiwidXNlcklkIjoiM2QwMjBiMDBlZmUyNDM1OWJjZTk0ZDUwZWE1NTkxNDUiLCJpYXQiOjE1ODQ2ODg4NDJ9.//载荷(Payload)
yeMfW-oEqlw31LqnYIbPkSrZXGLt0z6pB3RW0mp2JSSySOqnVn_ffWEunFPxhqu44PshHr9w_tqN3K9KtQ4V_w//签名(signature)
- 头部(Header)
用于存储JWT的基本信息,类型type与签名算法;
{
'typ': 'JWT',
'alg': 'HS256'
}
- 载荷(Payload)
用于存放有效信息(不敏感信息,base64可对称解密)的地方,比如用户名,用户ID,电话等信息,后端可从中拿取;
DecodedJWT verifier = JWT.decode(token);
Claim mobile = verifier.getClaim(“username”);
{
"iss": "zhangsan", //JWT发行者
"iat": 1441593502, //JWT发布时间
"exp": 1441594722, //token失效时间
"aud": "www.test.com", //接收JWT的一方
"sub": "zzz@tet.com", //该JWT所面向的用户
}
- 签名(signature)
签证信息,由base64解密后的Header与Payload,再由Header中的签名算法加上后端的secret在后端生成的签证;
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret'); //secret是存放于后端的,自定义
使用
第一次用户登录成功之后,生成token,存放于后端,并返回给用户,用户以后每次请求的时候都带着token
优缺点
- 优点
1、通用性,可跨语言;
2、无状态,jwt不在服务端存储任何状态,可在载荷Payload中存放一些业务逻辑所需要的信息,降低查询数据库的次数;
3、可扩展性好,分布式部署情况下,session需要多机共享数据,存放redis或数据库中,而jwt不需要 - 缺点
1、安全性,payload不能存放敏感信息,因为base64加密的,可解密。
2、