Cookie Session Token JWT的区别和实现原理(2)

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 协议传输。

 

posted @ 2021-06-11 10:19  JustJavaIt  阅读(78)  评论(0编辑  收藏  举报