跳至主要內容

JWT和Token之间的区别

Leo约 1424 字大约 5 分钟

JWT和Token之间的区别

在这篇文章中open in new window,我们主要介绍了JWT的相关概念。

  1. 什么是JWT
  2. JWT由哪些部分组成
  3. JSON Web Tokens是如何工作的
  4. 如何基于 JWT 进行身份验证
  5. 如何防止 JWT 被篡改的Z

今天我们主要介绍一下JWT跟Token之间的区别和联系。

1.Token

Token是一个宽泛的术语,它可以指代任何一种用于身份验证的机制。Token 常常被用在验证和授权流程中。Token 可以有不同的形式和结构,如随机生成的字符串或者特定格式的编码数据。

1.1 特点和使用

  1. 不固定格式:Token 可以是任何格式的数据字符串,不仅限于JWT。
  2. 存储信息:Token 可能仅作为引用存储在服务器上,服务器通过该引用来获取存储的状态信息。
  3. 会话管理:经统一的身份验证后,Token用来管理用户会话。
  4. 传输方式灵活:可以通过HTTP headers、URL参数或请求体传输。

1.2 Token基本原理

Token (就是加密的字符串,使用MD5,等不可逆加密算法,一定要保证唯一性)

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功,服务端会签发一个Token保存到(Session,redis,mysql…)中,然后再把这个 Token 发送给客户端

客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

服务端收到请求,验证密客户端请求里面带着的 Token和服务器中保存的Token进行对比效验, 如果验证成功,就向客户端返回请求

1.3 优点

  1. 可以隐藏真实数据,安全系数高
  2. 适用于分布式/微服务
  3. Token支持手动控制,过期、吊销等
  4. 可以实时查询现有Token

1.4 缺点

  1. 存放在数据库或者redis,依赖服务器资源
  2. 效率相对JWT比较低

2.JWT

2.1 JWT优势

1.无状态

JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。

不过,也正是由于 JWT 的无状态,也导致了它最大的缺点:不可控!

就比如说,我们想要在 JWT 有效期内废弃一个 JWT 或者更改它的权限的话,并不会立即生效,通常需要等到有效期过后才可以。再比如说,当用户 Logout 的话,JWT 也还有效。除非,我们在后端增加额外的处理逻辑比如将失效的 JWT 存储起来,后端先验证 JWT 是否有效再进行处理。

2.有效的避免的CSRF攻击

CSRF(Cross Site Request Forgery) 一般被翻译为 跨站请求伪造,属于网络攻击领域范围。相比于 SQL 脚本注入、XSS 等安全攻击方式,CSRF 的知名度并没有它们高。但是,它的确是我们开发系统时必须要考虑的安全隐患。就连业内技术标杆 Google 的产品 Gmail 也曾在 2007 年的时候爆出过 CSRF 漏洞,这给 Gmail 的用户造成了很大的损失。

关于CSRF具体可以参考我这篇文章open in new window

2.2 JWT基本原理

JWT是JSON Web Token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证JWTToken的正确性,只要正确即通过验证。

JWT包含三个部分: Header头部,Payload负载和Signature签名。由三部分生成JwtToken,三部分之间用“.”号做分割。 校验也是JWT内部自己实现的 ,并且可以将你存储时候的信息从JwtToken中取出来无须查库

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功,服务端会签发一个JwtToken,无须存储到服务器,直接再把这个JwtToken发送给客户端

客户端收到JwtToken以后可以把它存储起来,比如放在 Cookie里或者LocalStorage 里

客户端每次向服务端请求资源的时候需要带着服务端签发的JwtToken

服务端收到请求,验证密客户端请求里面带着的 JwtToken, 如果验证成功,就向客户端返回请求的数据

2.4 差异性

  1. 标准与自定义:JWT 是一个开放标准(RFC 7519),明确定义了 Token 的结构和生成方式,而 Token 通常是自定义的,没有统一的结构标准。
  2. 状态存储:JWT 是无状态的,被设计为自包含,携带所有用户信息,因此服务端无需保存状态。而传统 Token 可能需要服务端存储额外的会话信息。
  3. 安全性:JWT 通过签名提供了额外的安全性。传统 Token 若无额外的安全措施,则可能容易受到中间人攻击等安全威胁。
  4. 体积:JWT 通常比简单 Token 体积更大,因为它包含了更多的用户信息和必需的加密数据。