[关于JWT|青训营笔记]
这是我参加「第五届青训营」伴学笔记的第十九天
前言
记录青训营后端专场的学习过程,有不足的地方还请大佬指正。
由于本人基础比较薄弱,所以笔记尽可能的详细。
该文章开始的版本将以简述课程知识点为主,等后面实践有自己的理解后会编辑添加自己的理解
JWT简介
Token进行身份验证流程
在介绍JWT之前,首先要明白利用token进行身份认证的过程:
1、客户端使用用户名和密码请求登录
2、服务端收到请求后,验证用户名和密码
3、验证成功后,服务端会签发一个token,再把这个token返回给客户端
4、客户端收到token后可以把它存储起来,比如放到cookie中
5、客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
6、服务端收到请求,然后去验证客户端请求里带着的token,如果验证成功,就向客户端返回请求数据
使用token优势
- 支持跨域访问:cookie是无法跨域的,而token由于没有用到cookie(前提是将token放到请求头中),所以跨域后不会存在信息丢失问题
- 无状态:token机制在服务端不需要存储session信息,因为token自身包含了所有登录用户的信息,所以可以减轻服务端压力
- 更适用CDN:可以通过内容分发网络请求服务端的所有资料
- 更适用移动端:当客户端是非浏览器平台时,cookie是不被支持的,此时采用token认证方式会简单很多
- 无需考虑CSRF:由于不再依赖cookie,所以采用token认证方式不会发生CSRF,所以也就无需考虑CSRF防御
JWT是实现token的其中之一
JWT本质是一个字符串,它是将用户信息保存到一个JSON字符串中,然后进行编码得到一个JWT Token,并且这个JWT token带有签名信息,接收后可以检验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输,JWT认证流程如下:
- 前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个
POST请求。建议的方式是通过SSL加密的传输(HTTPS),从而避免敏感信息被嗅探 - 后端核对用户名和密码成功后,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个
JWT Token,形成的JWT Token就是一个如同lll.zzz.xxx的字符串 - 后端将
JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可 - 前端在每次请求时将
JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和XSRF问题) - 后端检查前端传过来的
JWT Token,验证其有效性,比如检查签名是否正确、是否过期、token的接收方是否是自己等等 - 验证通过后,后端解析出
JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果
JWT结构
JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串