文章目录
一、概念
Json web token (JWT)是啥?
JWT 是 JSON Web Token 的缩写,JWT 本身没有定义任何技术实现,它只是定义了一种基于 Token 的会话管理的规则,涵盖 Token 需要包含的标准内容和 Token 的生成过程。
是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
二、背景分析
HTTP 是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权是非常重要的一环,实践中有多种可用方案,并且各有千秋。
1.传统基于session
的会话管理/认证
a. session
基本认知
在 Web 应用发展的初期,大部分采用基于 Session 的会话管理方式,逻辑如下:
-
客户端使用用户名密码进行认证
-
服务端认证成功后,生成并存储 Session,将 SessionID 通过 Cookie 返回给客户端
-
客户端访问需要认证的接口时在 Cookie 中携带 SessionID,服务端通过 SessionID 查找 Session 并进行鉴权,返回给客户端需要的数据
b. session
的认证方式暴露的问题
-
服务端开销大:为便用户下次请求的鉴别,服务端会存储
session
,为了快速认证,通常而言session
都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。 -
扩展差:session存储在客户当时请求的服务器的内存中,当需要做分布式等扩展性服务时,数据同步的问题,会变得很麻烦,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
-
易被CSRF攻击:由于客户端使用 Cookie 存储 SessionID,在跨域场景下需要进行兼容性处理,同时这种方式也难以防范 CSRF 攻击。
2. 基于token的会话管理/认证
鉴于基于 Session 的会话管理方式存在上述多个缺点,无状态的基于 Token 的会话管理方式诞生了,所谓无状态,就是服务端不再存储信息,甚至是不再存储 Session,意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,逻辑如下:
- 客户端使用用户名密码进行认证
- 服务端认证成功后,利用特定算法,生成token,将token返回给客户端
- 客户端访问需要认证的接口时在 URL 参数或 HTTP Header (推荐)中加入 Token,服务端通过解码 Token 进行鉴权,返回给客户端需要的数据
基于 Token 的会话管理方式有效解决了基于 Session 的会话管理方式带来的问题。
- 服务端不需要存储和用户鉴权有关的信息,鉴权信息会被加密到 Token 中
- 服务端只需要读取 Token 中包含的鉴权信息即可
- 避免了共享 Session 导致的不易扩展问题不需要依赖 Cookie,有效避免 Cookie 带来的 CSRF 攻击问题
- 服务器使用
CORS
(跨域资源共享) 可以快速解决跨域问题Access-Control-Allow-Origin: *
三、主角JWT
1. jwt基本结构
Jwt是由三段信息构成的,将这三段信息文本用.
链接一起就构成了Jwt字符串。就像这样
jwt 结构生成下
- 其构成由三部分构成,分别为:头部(