当前位置: 首页 > article >正文

JWT(JSON Web Token)

        

目录

一、跨域认证的问题

二、JWT 的原理

三、JWT的结构

四、JWT的使用场景

五、JWT的优缺点


JWT是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于将信息作为JSON对象在各方之间安全地传输。JWT通常用于在Web应用和API安全中,作为访问令牌(access tokens)和信息交换的载体。

一、跨域认证的问题

互联网服务离不开用户认证。一般流程是下面这样。

1、用户向服务器发送用户名和密码。

2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

3、服务器向用户返回一个 session_id,写入用户的 Cookie。

4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

        这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

        举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?

        一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

        另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

二、JWT 的原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。


{
  "姓名": "张三",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

        以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

三、JWT的结构

JWT由三部分组成,使用点(.)分隔:

  1. Header(头部):包含令牌的类型(默认为JWT)和JWT加密所使用的算法(如HMAC、SHA256、RSA等)。这部分使用Base64编码。

  2. Payload(有效载荷):存放用户数据的声明。这部分也使用Base64编码。通常包含的标准声明有:

    • iss(Issuer):JWT签发者(生产者)。
    • sub(Subject):JWT面向的用户(消费者)。
    • aud(Audience):接受JWT的一方。
    • iat(Issued At):JWT的签发时间。
    • exp(Expires At):JWT的过期时间,这个时间必须大于签发时间。
    • nbf(Not Before):定义在什么时间之前,该JWT都是不可用的。
    • jti(JWT Id):JWT的唯一身份标识,主要用作一次性token,从而回避重放攻击。

    自定义声明可以添加任何需要的信息,但通常不会包含敏感信息,因为Base64编码是可以解码的。

  3. Signature(签名):签名是使用前面两个JSON信息的Base64编码,再加一个盐值(secret),最后再使用Header中指定的算法进行加密得到的。签名用于验证信息的完整性和真实性,防止信息被篡改。

四、JWT的使用场景

  1. 用户认证:在用户登录成功后,服务器生成一个JWT并返回给客户端。客户端在后续请求中携带这个JWT,服务器验证JWT的有效性来确定用户的身份和权限。
  2. 信息交换:当系统A与系统B需要安全地交换信息时,可以使用JWT作为信息的载体。由于JWT是自包含的,并且经过签名验证,因此可以确保信息的完整性和真实性。

五、JWT的优缺点

优点

  1. 紧凑:JWT以JSON格式紧凑地表示信息,易于传输和存储。
  2. 自包含:JWT包含所有必要的信息,无需额外的查询或存储。
  3. 安全性:通过签名验证,可以确保JWT的完整性和真实性。

缺点

  1. 载荷大小:由于JWT是Base64编码的,因此载荷越大,JWT的长度就越长,可能影响传输效率。
  2. 敏感信息:虽然JWT可以包含自定义声明,但通常不建议包含敏感信息,因为Base64编码是可以解码的。如果需要包含敏感信息,应该使用加密技术进行处理。
  3. 过期时间:JWT具有过期时间,过期后需要重新生成。这增加了系统的复杂性,并可能导致令牌失效的问题。

编码实现


http://www.kler.cn/a/512767.html

相关文章:

  • iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析
  • C语言练习(17)
  • 麒麟系统中删除权限不够的文件方法
  • Dockerfile另一种使用普通用户启动的方式
  • feign调用跳过HTTPS的SSL证书校验配置详解
  • 两份PDF文档,如何比对差异,快速定位不同之处?
  • ChemLLM化学大模型再升级,AI助力化学研究
  • 【Python使用】嘿马头条项目从到完整开发教程第10篇:APScheduler定时任务,1. 什么是RPC【附代码文档】
  • 【2024年华为OD机试】(A卷,100分)- 完美走位 (Java JS PythonC/C++)
  • 周末总结(2024/01/18)
  • 面试--你的数据库中密码是如何存储的?
  • 《offer 来了:Java 面试核心知识点精讲 -- 框架篇》(附资源)
  • 【Elasticsearch】分片与副本机制:优化数据存储与查询性能
  • 在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息
  • C/C++ 时间复杂度(On)
  • 读西瓜书的数学准备
  • 【Java】探秘二叉树经典题,码农进阶“必刷清单”在此!(上)
  • 【Spring MVC】如何运用应用分层思想实现简单图书管理系统前后端交互工作
  • Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences
  • 【数据分享】1929-2024年全球站点的逐日最高气温数据(Shp\Excel\免费获取)
  • AI音乐生成模型Suno的技术原理,以及Suno的使用指南与应用场景
  • B3DM转换成STEP
  • 解决leetcode第3426题所有安放棋子方案的曼哈顿距离
  • Elasticsearch(ES)基础查询语法的使用
  • spring Ioc 容器的简介和Bean之间的关系
  • 一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用