JWT当然不是玩具,理解其设计意图,和适用场景自然会发现存在的就是有价值的

JWT: JSON Web Token

起源和定义

JWT(JSON Web Token)是由 IETF(Internet Engineering Task Force)基于 RFC 7519 规范定义的。它是一种用于在网络应用间传递信息的标准方法。JWT 最初由无状态的分布式应用场景需求而定义,以提供一种简洁的方式来传递信息,同时保证安全性。

JWT的结构

JWT 由三部分组成,它们使用点号(.)分隔开来:

  1. Header(头部):包含了令牌的元数据信息,例如算法和类型。

    { "alg": "HS256", "typ": "JWT" }

  2. Payload(负载):包含了要传递的用户数据,例如用户ID、角色等。

    { "sub": "1234567890", "username": "exampleUser", "role": "admin" }

  3. Signature(签名):对头部和负载进行签名,以确保消息的完整性。

    HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

    其中,认证秘钥(secret)用于对签名进行验证和生成,确保令牌的真实性和完整性。密钥本身的安全非常重要,如果密钥泄漏那么签名本身等于裸奔

验证机制

JWT 的验证主要依赖于签名和有效期:

  1. 签名验证:接收方通过验证 JWT 中的签名来确保消息的完整性,防止篡改。

    这一过程包括:

    分离出Header和Payload并分别进行Base64Url解码。

    使用Header中定义的算法和服务器的私有密钥对(Header + Payload)进行签名运算。

    比较计算得出的签名与接收到的Token中的Signature部分是否一致。

  2. 有效期验证:接收方验证 JWT 的过期时间(exp),确保 JWT 在有效期内使用。

    对Payload部分进行检查,包括但不限于:

    过期时间(Expiration Time, exp):确认Token未过期。

    生效时间(Not Before, nbf):确认Token已生效。

    发行者(Issuer, iss) 和 受众(Audience, aud):确认Token是由预期的发行者为预期的受众发布的。

处理流程

  • 客户端请求:客户端在后续请求中携带JWT,通常放在Authorization HTTP头的Bearer模式下。
  • 服务器响应:服务器提取JWT,按照上述步骤验证其签名和载荷的有效性。
  • 授权决策:如果JWT验证通过,则服务器信任客户端提供的用户身份和权限信息,允许访问受保护的资源。

使用JWT认证流程图

安全考虑

  • 服务器端保存的蜜钥不可泄漏,最好定期刷新
  • 为了保持安全性,应设置合理的Token有效期,并提供Token刷新机制
  • 考虑提供Token撤销机制:创建一个可分布式存储的黑名单(例如,Redis缓存、数据库表或其他高效存储解决方案),用于存储撤销的token的相关信息。这可能是整个JWT令牌,或者是JWT中的唯一标识符(如JTI,JWT ID),当想要撤销某个已经下发的 token就将它加入到名单。需要注意的是,验证的时候肯定是先去验证有效期,如果已经过期,不需要关注是否在黑名单。而且黑名单本身也会自动过期并删除即可,毕竟一支存放它浪费空间毫无意义

优点和缺点

优点:

  • 无状态性:JWT 不需要服务器存储会话信息,减轻了服务器负担。传统方式下,我们需要将会话信息持久化到DB、缓存等服务中,每次都避免不了要获取才能验证。
  • 跨域支持:JWT 可在不同域之间轻松传递信息。
  • 安全性:JWT 使用签名验证消息完整性,防止数据篡改。

缺点:

  • Token 大小:JWT 包含了额外信息,增加了网络传输负担。
  • 无法撤销:JWT 一旦发放,无法撤销,除非设置短期过期时间。
  • 不是那么安全:不能传递敏感信息,本身虽然签名但是荷载部分知识base64,当然可以选择使用一种对成签名算法来对荷载部分加密

相关资料

JWT(JSON WEB TOKEN)是玩具吗的更多相关文章

  1. Java JWT: JSON Web Token

    Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...

  2. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  3. JWT(JSON Web Token) 【转载】

    JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...

  4. [更新]一份包含: 采用RSA JWT(Json Web Token, RSA加密)的OAUTH2.0,HTTP BASIC,本地数据库验证,Windows域验证,单点登录的Spring Security配置文件

    没有任何注释,表怪我(¬_¬) 更新: 2016.05.29: 将AuthorizationServer和ResourceServer分开配置 2016.05.29: Token获取采用Http Ba ...

  5. ( 转 ) 什么是 JWT -- JSON WEB TOKEN

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  6. 关于JWT(Json Web Token)的思考及使用心得

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...

  7. 什么是JWT(Json Web Token)

    什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...

  8. API安全验证之JWT(JSON WEB TOKEN) OLCMS

    假如www.olcms.com/getUserInfo获取用户信息,你怎么知道当前用户是谁?有人说登陆时候我把他UID写入session了,如果是API接口,没有session怎么办,那么就需要把UI ...

  9. 5分钟搞懂:JWT(Json Web Token)

    https://www.qikegu.com/easy-understanding/892 JWT 基于token的用户认证原理:让用户输入账号和密码,认证通过后获得一个token(令牌),在toke ...

  10. JWT(Json Web Token)认证

    目录 JWT(Json Web Token) JWT的数据结构 JWT的用法 JWT验证流程

随机推荐

  1. NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

    前  言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容. 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理 ...

  2. 金蝶云·苍穹追光者开发大赛,点燃高校AI应用创新之火

    在 2024 年的政府工作报告中,"人工智能 +" 行动被提出,标志着人工智能成为推动我国新质生产力发展的关键力量.与此同时,今年的高考作文有一道题目也聚焦于人工智能,再次凸显了这 ...

  3. SpringBoot如何解决跨域问题

    什么是跨域 跨域问题的本质是浏览器为了保证用户的一种安全拦截机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据. 跨域三种情况 在发起请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求: ...

  4. Java uuid生成随机32位

    import java.util.UUID; /** * @ClassName:UuidUtils * @Description:uuid工具类 * @Author:chenyb * @Date:20 ...

  5. NodeJS中Buffer与字符串相互转换时一个值得注意的问题

    什么问题 如果一个Buffer的 toString() 结果为乱码或含有乱码,那么用此字符串以 Buffer.from()方法构造出来的Buffer将与原来的Buffer不相同. 这一点其实很好理解, ...

  6. vue小知识:多层数据双向相应之向上派发和向下派发($dispatch和$broadcast)

    注意:这两个实例已经在vue3中弃用啦!!!(所以不详细说了,封装知道怎么用就行了,作为了解) 都是在vue实例配置(main.js) 向上派发:$dispatch 注意,在相应后代组件中使用 thi ...

  7. JMeter 基于脚本实现代码共享

    需求描述 需求是这样的:执行某次压测任务时,压测涉及的前端接口,要求携带一个userName请求头,该请求头值为实际用户名经过DES加密后,再采用Base64加密后的值,为此,编写了一段加密代码,发送 ...

  8. CF1988C Increasing Sequence with Fixed OR Solution

    题意简述如下: 给定一个正整数 \(n\),请构造一个正整数序列使其满足以下条件并尽可能长:这个序列中每个数都大于等于 \(1\) 且小于等于\(n\):这个序列是单调递增的:这个序列中任意两个相邻的 ...

  9. pyspark初步了解

    spark的运行角色: 分布式代码的流程分析 pythononspark原理

  10. 关于@Mapper与@MapperScan

    o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'gggDao' and 'com.xxx.dao ...