一、概念:
1、什么是认证?什么是授权?
认证
用于在系统登录时,验证身份的凭证,类似于账号、密码等。
授权
用户在访问资源时,根据权限的不同对资源访问程度不同。
2、什么是cookie?什么是session?
cookie
cookies是网站为了区分用户而存储在用户本地终端的一些数据。存放于客户端,保存用户信息。
场景:
1、存储登录用户的用户名和密码,下次登录可以自动填入。
2、保存sessionID和Token,请求后端的时候带上cookies,后端就可以读取到session和token。
session
用于在服务端跟踪用户,记录该用户的状态。
场景:
登录系统之后,如果用户进行一些增改的操作,session可以标识并跟踪当前用户。
3、什么是JWT
全称JSON Web Token,目前最流行的基于Token的跨域认证解决方案。其自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。并且, 使用 JWT 认证可以有效避免 CSRF 攻击,因为 JWT 一般是存在在 localStorage 中,使用 JWT 进行身份验证的过程中是不会涉及到 Cookie 的。
二、结构
1、JWT组成部分
本质上是一个字符串,分为3部分,Header(头部)、Payload(载荷)、Signature(签名)。
Header:
定义了生成签名的算法以及 Token的类型。
Payload:
用来存放实际需要传递的数据,包含声明(Claims),如sub(subject,主题)。
Signature:
通过头部指定的签名算法生成的签名。
2、如何基于JWT做身份验证
-
用户向服务器发送用户名、密码以及验证码用于登陆系统。
-
如果用户用户名、密码以及验证码校验正确的话,服务端会返回已经签名的 Token,也就是 JWT。
-
用户以后每次向后端发请求都在 Header 中带上这个 JWT 。
-
服务端检查 JWT 并从中获取用户相关信息。
三、对比
1、优势
-
无状态:JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。
-
避免CSRF攻击:跨站请求伪造。因为CSRF需要借助cookie,但是JWT在登录成功之后会存储在localstorage,过程中不涉及到cookie,所以可以避免CSRF攻击。
-
适合移动端应用,因为使用session必须存储一份在服务端,这样的话需要依赖到cookie,因此不适合移动端的使用。
-
单点登陆友好
2、缺点
不可控:注销登录的场景下,JWT还有效。即使对权限做了修改,在JWT失效之前,都有效。
解决办法:
1、在redis中维护一个JWT名单/一个黑名单,通过比对判定是否失效,违背无状态原则。
2、修改密钥,为每个用户都创建一个专属密钥,如果我们想让某个 JWT 失效,我们直接修改对应用户的密钥即可。
3、设置更短的失效时间,经常更新,导致用户需要经常登录。