填一个坑,之前一开始看http请求时候一直不理解为什么传输的数据叫做payLoad,今天想起来把JWT的坑填了。
session机制在分布式系统下,有诸多问题。
1. 负载均衡,每次访问的服务器都不一样,无法识别sesssionId
2. 另外分配一台中心化服务器当作存储会话服务器,导致性能降低
3. session对应的用户名在服务器端!!! 返回的sessionId在客户端
所以出现了JWT,JSON Web Token
1. JWT在客户端,别担心造假,经过签名处理(各种h),密钥在服务器端,服务器会检查
2.JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.
进行连接形成最终传输的字符串
JWTString = Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey)
多说几句,playLoad就是你传输的数据对象。
优势,直接看红色文字即可
对比传统的session认证方式,JWT的优势是:
1. 因为JWT Token是以JSON加密形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持
2. 不需要在服务端保存会话信息,也就是说不依赖于cookie和session,所以没有了传统session认证的弊端,特别适用于分布式微服务
3. 单点登录友好:使用Session进行身份认证的话,由于cookie无法跨域,难以实现单点登录。但是,使用token进行认证的话, token可以被保存在客户端的任意位置的内存中,不一定是cookie,所以不依赖cookie,不会存在这些问题
4. 适合移动端应用:使用Session进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到Cookie(需要 Cookie 保存 SessionId),所以不适合移动端