token
什么是 token ?
token 是验证用户身份的凭证,我们通常叫它:令牌。
最简单的token组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,以哈希算法压缩成一定长的十六进制字符串)。
token 特点
无状态、可扩展
支持移动端设备
支持跨程序调用
安全
token 工作流程
(1)客户端使用用户名和密码请求服务器登录;
(2)服务端收到请求后进行鉴权,鉴权成功后服务端会生成一个 token 并发送给客户端,客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里;
(3)客户端下一次向服务端请求资源的时候需要带着存储的 token;
(4)服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据。
注意
(1)客户端请求时可以将 token 放到 HTTP 的 Header 里;
(2)基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 。
(3)用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库。
JWT
平常用的Session仅适用于单节点情况,如果采用多节点部署,需要考虑session持久化spring-session-data-redis,也可以考虑jwt。
什么是JWT?
JSON Web Token(JWT)是一个轻量级的认证规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。其本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。
组成
一个JWT,应该是如下形式的:
无状态,它是一个很长的字符串,中间用两个点(.)分隔成三个部分。
这些东西看上很凌乱,但是非常紧凑,并且是可打印的主要用于验证签名的真实性。
JWT 共有三部分组成:
(1)Header(头部),主要声明一些描述的信息,加密的算法使用的签名算法HS256,声明类型token的type是jwt 。
(2)Payload(负载, 类似于飞机上承载的物品),用来存放实际需要传递的数据,一般存一些用户名,过期时间什么的 。
(3)是签证(signature),signature = 签名算法(header(base64后的)+payload (base64后的)+secret) 。
JWT 解决什么问题?应用场景?
1.认证 Authentication;
2.授权 Authorization;
3.联合识别;
4.客户端会话(无状态的会话);
5.客户端机密。
JWT工作原理
(1)客户端浏览器使用用户名和密码登录;这一过程一般是POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探
(2)服务端收到请求后,核对用户名和密码,创建JWT,并设置有效时间。
(3)客户端在后面每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRF问题) 。
(4)服务端对收到的JWT进行解密和校验,如检查签名是否正确、Token是否过期、Token的接收方是否是自己等。验证通过后服务端使用JWT中包含的用户信息进行其他逻辑操作。
(5)响应客户端。
缺点
(1)JWT的最大缺点是,一旦JWT生成之后了,在到期之前就会始终有效,无法废止某个token,或者更改token
(2)容易被盗用,拿到jwt就能获得权限,为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。