Token和JWT的详细介绍

目录

JWT

Token

无状态与有状态的对比

有状态:

无状态:

JWT结构

Header标头

Payload载荷

Signature签名

JWT的优缺点

优点

缺点


JWT

Json Web Token ,是Token的一种实现方式,本质上是一条字符串。

既然JWT是Token的一种实现方式,那我们就先简单说一下Token是什么。

Token

Token的意思是“令牌”,简单说Token就是一种身份认证方式,基于Token的用户认证是一种无状态的认证方式。而所谓无状态指的是在服务端不需存储token数据或者登录用户信息,而是在客户端的每次请求时,携带在请求头里一起到达服务端,用户信息则存储在Token中,由服务器来解析Token以达到验证的目的。

无状态与有状态的对比

有状态:

服务端存储用户信息(当然,只有用户已经登录过了才会在服务端存储信息)。

缺点:当用户量大时,服务端会存储大量的用户信息(无论是在Session域中还是Redis中),会给服务端带来很大的存储压力。

优点:存储在服务端数据很安全(因为服务器是很难攻破的,而请求是可以被抓包的)。

无状态:

服务端不存储用户信息,而是每次请求中携带Token (服务器不知道用户有没有登录,只能每次都通过解析Token获取用户信息)。

缺点:容易被截获,一旦Token的密钥泄露,客户端则可以任意访问服务端。

优点:节省服务端存储,支持跨域。

乍一看,无状态的Token是牺牲了安全性而解放了服务器的存储能力,但事实并非如此!既然已经知道了Token容易被截获,当Token一旦被解密就会造成巨大的危害,那就会有相应的解决办法了,所以在Token加密这个阶段就下了大功夫,所以我们来看一下JWT的结构和加密方式。

JWT结构

JWT由三部分组成,分别是标头(Header)、载荷(payload)、签名(Signature)

分别解析这三部分都是什么:

Header标头

是一个Json对象,用来描述JWT元数据,存储alg(签名算法),type(Token类型)等信息

 Header Json对象会以Base64Url编码方式编译成字符串。

Payload载荷

主体内容部分,也是一个Json对象,Payload主要承载了一些用户信息,例如用户Id。Payload的Json对象也是通过Base64Url编码方式编译成字符串。

注意:因为Base64Url编码是著名的防君子不防小人,所以并不建议在Payload中存储用户的敏感信息

Signature签名

该部分是将前两部分Base64Url编码后的字符串,用 "." 拼接在一起后,再使用Header中记录的签名算法进行加密产生第三条字符串。

Signature的作用是使用不可逆的加密算法来保存前两部分的信息,目的是校验JWT是否被修改过。

三条字符串以 "." 拼接后就组成了一条完整的JWT。这种结构,既保证了JWT的不会被篡改,又易扩展(可以携带用户信息)

JWT的优缺点

优点

1,可扩展

在JWT中的Payload部分可以存储用户信息

2,支持跨域

默认的Cookie和Session只能在一台服务器上存储数据不支持跨服务器,但JWT支持跨服务器

3,无状态

在大量用户的情况下,减少了服务端的存储压力

缺点

1,安全性

JWT是随着请求到达服务器中的,容易被抓包,Payload中用户信息容易被泄露,所以不建议在JWT中存储用户的敏感信息。

2,存储性能

JWT有着易扩展的属性,所有的数据都可以被存储在Payload中,经过编码之后就会导致JWT很长。而且每一次请求都会在请求头中的Local Storage中携带JWT,这就导致使用JWT的HTTP请求会造成巨大的开销。

3,一次性

JWT的特点是无状态的,这也就导致了JWT是一次性的,想要修改内容就必须签发一个新的JWT。

4,无法废弃

一旦签发一个JWT,在过期之前这个JWT都是有效的。即使签发了一个新的JWT,在验证时未过期的旧JWT也是可以验证通过的。

5,无法续签

与上同理,如果想维持JWT无状态的特性,续签JWT的有效时间则必须签发新的JWT。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值