这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
1.为何使用JWT
1.1 HTTP协议的无状态性
HTTP协议是一种无状态的协议,HTTP服务器对客户的每个请求和响应都是作为一个分离的事务处理。服务器无法确定多个请求是来自相同的客户还是不同的客户。这意味着服务器不能在多个请求中维护客户的状态。有些时候不需要服务器记住客户。例如在线查询系统就不需要维护客户的状态。但在某些特定的场景中客户与服务器的交互中就需要有状态,最典型的例子就是购物车系统。HTTP的无状态性使得服务器在处理数量庞大的请求时不能辨别出请求的具体客户,为了解决这一问题,传统的方法是通过session或cookie来到达分辨客户的效果
1.2 传统的session和cookie
1.2.1 什么是cookie:
Cookie由服务器端生成,发送给客户端(一般是浏览器),客户端会将Cookie的key/value保存下来,在下次请求同一网站时就将保存下来的Cookie发送给服务器。服务器再通过客户端发来的cookie识别客户信息
1.2.2 什么是session:
session 是一种记录服务器和客户端会话状态的机制,是基于cookie实现的,session存储在服务器端,sessionId会被存储到客户端的cookie中。
cookie和session的运行原理:(图片引用于网络)
1.2.3 两者的弊端
- 服务器开销大: 用户的登录信息都会储存到服务器的session中,随着用户的增多,服务器开销会显著增大
- 移动端等不适用: session依赖于cookie,而移动端经常没有cookie
- **分布式系统中session失效:**session存在于服务器的物理内存中,所以在分布式系统中,这种方式将会失效。
- 安全性存在问题: 所以如果cookie被截获,用户很容易收到跨站请求伪造攻击。
- 前后端分离系统不适用: 前端发送的请求往往经过多个中间件到达后端,cookie中关于session的信息会转发多次
- cookie无法跨域: session是基于cookie实现的,所以session的认证也无法跨域,对单点登录不适用
2. JWT详解
2.1 什么是JWT
JWT是用于微服务之间传递用户信息的一段加密字符串,该字符串是一个JSON格式,各个微服务可以根据该JSON字符串识别用户的身份信息,也就是该JSON字符串中会封装用户的身份信息。
2.2 JWT的构成
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
- Header (头部)
- Payload (载荷)
- Signature (签名)
一般样子:
“xxxxx.yyyyy.zzzzz”
具体形式:
Header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
Payload: eyJleHAiOjE2NTY0MjE5NTgsInVzZXJfaWQiOiIxMDAwMSJ9.
Signature: RVX-2J6peydRYKeSU0NwjLQF8w2zffftC4TQMkFFggI
2.2.1 头部(Header)
头部用于指定了令牌类型和令牌签名的算法。
{"typ":"JWT","alg":"HS256"}
- typ属性: 表示令牌的类型,JWT令牌统一写为JWT
- alg属性: 指明签名算法是HS256算法
在头部指明了签名算法是HS256算法。 进行BASE64编码