1. 在微服务背景和前后端分离开发风格下, jwt作为授权和信息交换的技术方案,得以广泛梭哈。

1> 授权

用户一旦通过登录认证, 会被下发一个token, 之后的每次请求都会带上这个token, 将能访问该token允许的资源/服务, 单点登录广泛采用了jwt, 因为它负载轻量且自然跨域使用。

2> 信息交换

jwt中含有轻量用户数据,有效使用JWT,可以降低服务器查询数据库的次数。利用非对称的公钥私钥,还可以做到可信的信息交换。

核心优势:

  • 无状态
  • 自包含
  • 天然跨域支持
  • 可扩展(自定义claims)

2. jwt(json web token)明面上是一个based64字符串, 那json从何而来?

jwt一般附加在请求头:

Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzU1MTkwNTEyLCJpYXQiOjE3NTQ4MzA1MTIsImp0aSI6ImRiY2M2ZjE4ODVlZjRmNTliODgxMzUyNzBiYWY1NTU2IiwidXNlcl9pZCI6MX0.JBQD87mcrRm6dG4tYdrxqV_fVDeuonsbPyJr2mgiFiM

静态结构有点类似基本身份认证basic authentication:

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l

jwt token分为三块, 中间用.连接

  • header: 明文记录了token校验的算法(base64 算作明文)

    base64({"alg": "HS256","typ": "jWT"})

  • payload: 记录了下发身份信息的发牌人、发牌时间、过期时间、待传递身份信息

  base64({
"token_type": "access",
"exp": 1755190512,
"iat": 1754830512,
"jti": "dbcc6f1885ef4f59b88135270baf5556",
"user_id": 1
})
  • sign: 通过算法(header中alg标记的算法)对header和payload做计算产生的签名字符串.

如果使用HS256对称加密算法:

sign= HMACSHA256(base64(header) + "." +base64(payload),secret)


jwt payload中的claims

iss Issuer 发牌人
sub Subject 主题
aud Audience claim的受众
exp Expiration Time 过期时间
iat Issued At 发牌时间
jti JWT ID jwt 的唯一id,用于防止重放攻击、或注销token

拒绝重放攻击

  • 攻击者截获了一个有效的 Token,试图重复使用。
  • 服务端可以通过检查jti是否已在“已使用列表”或“黑名单”中来拒绝重复请求。

注销token

  • 可以用jti作为 key 存储在 Redis 中,实现 Token 注销(logout)功能。

    例如:用户登出后,将 jti 加入黑名单,后续请求即使有有效签名也会被拒绝。

3.使用jwt token我们还应该知道什么?

  • JWT 默认是不加密,不能将敏感关键信息写入JWT。

  • JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

  • JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT的有效期应该设置得比较短,且使用HTTPS传输。对于一些比较重要的权限,使用时应该再次对用户进行认证。

4. jwt校验和jwt验证

客户端携带jwt token,服务端完整的校验流程

1> validation

  • 结构校验: 是否包含header,payload,sign 并以点号分割
  • 格式校验:每一部分是否都是base64 编码
  • 内容校验:检查payload 携带的claims是否正确: 过期时间exp、发牌时间iat, 令牌可用时间nbf

2> verification

  • 签名验证: 使用header 中约定的算法,服务器利用内置的secret key 或者 public key产生签名sign2,如果签名sign2 !=sign, 则令牌可能被篡改或并非来自可信来源。

密码学原理:

  • 如果header中约定使用对称加密, 那么发牌人和验证服务器共享密钥 secret key, 这个需要双方都妥善保管。
  • 如果header中约定使用非对称加密, 那么是由发牌人持私钥签名, 验证服务器持公钥public key验签。
特性 对称加密 非对称加密
加解密效率 较低
密钥管理 难(需安全分发) 易(公钥可公开)
能否确认发送者身份? 不能(无不可否认性) 能(通过数字签名

JWT 这点小秘密,你们肯定知道!的更多相关文章

  1. spring security oauth2搭建resource-server demo及token改造成JWT令牌

    我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html ...

  2. 客官,来看看AspNetCore的身份验证吧

    开篇 这段时间潜水了太久,终于有时间可以更新一篇文章了. 通过本篇文章您将Get: Http的一些身份验证概念 在AspNetCore中实现身份验证方案 JWT等概念的基础知识 使用Bearer To ...

  3. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  4. IdentityServer4实战 - JWT Issuer 详解

    一.前言 本文为系列补坑之作,拖了许久决定先把坑填完. 下文演示所用代码采用的 IdentityServer4 版本为 2.3.0,由于时间推移可能以后的版本会有一些改动,请参考查看,文末附上Demo ...

  5. IdentityServer4实战 - 谈谈 JWT 的安全策略

    一.前言 众所周知,IdentityServer4 默认支持两种类型的 Token,一种是 Reference Token,一种是 JWT Token .前者的特点是 Token 的有效与否是由 To ...

  6. django restframework jwt

    既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...

  7. JWT学习小结

    JWT全称JSON-Web-Tokens,是一套应对Http其无状态且明文传递请求的特性的规范,保证请求的安全性.我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持. 1,相较于常见的 ...

  8. spring jwt springboot RESTful API认证方式

    RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authentication)和授权(Authorization)过程,保证API的安全性. Authenticatio ...

  9. SpringBoot系列 - 集成JWT实现接口权限认证

    会飞的污熊 2018-01-22 16173 阅读 spring jwt springboot RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authenticati ...

  10. Shiro+JWT+Spring Boot Restful简易教程

    序言 我也是半路出家的人,如果大家有什么好的意见或批评,请务必issue下. 项目地址:https://github.com/Smith-Cruise/Spring-Boot-Shiro . 如果想要 ...

随机推荐

  1. 用脚手架创建odoo15项目

    Odoo 提供了一种机制来帮助建立一个新模块,odoo-bin有一个子命令脚手架来创建一个空模块 命令: $ odoo-bin scaffold <module name> <whe ...

  2. TINYINT[M]、INT[M]和BIGINT[M]中M值的意义

    TINYINT[(M)] [UNSIGNED] [ZEROFILL] A very small integer. The signed range is -128 to 127. The unsign ...

  3. 2025年KOL运营工具深度测评:11款高效工具全面解析,助力品牌全流程管理

    在数字营销日益精精化的今天,KOL(关键意见领袖)已成为品牌传播和用户转化的重要力量.然而,面对多平台.多任务的复杂协作需求,如何高效管理KOL资源.优化合作流程.提升ROI,成为品牌促销经理们急需解 ...

  4. 在MySQL中悲观锁及乐观锁的应用

    本文由 ChatMoney团队出品 在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段.MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题 ...

  5. [2024.10.27鲜花/csp后记?/rain] 夢をみせて

    [2024.10.27鲜花/csp后记?] 夢をみせて \(csp\)这周非常涨\(rp\)的,牙龈肿了,可能是牙周炎,总之又去了趟医院,自高中后,12.2,刚刚被月轮踩出的数字,很有趣,也许什么时候 ...

  6. Solon Flow:轻量级流程编排引擎,让业务逻辑更优雅

    在当今快速迭代的软件开发环境中,如何高效地管理和执行业务流程成为了开发者面临的重要挑战.Solon Flow作为Solon生态中的流程编排引擎,以其轻量级.高灵活性和强大的表达能力,为开发者提供了一种 ...

  7. 大模型学习笔记(一)—— transformer

    写在前面,一定要看懂self attention的代码实现,注意矩阵乘是谁@谁,矩阵乘不可以变换位置!!! Attention的出现 由于翻译任务往往不是1 vs 1的翻译,因此输入与输出不等长,所以 ...

  8. BZOJ2720 [Violet 5] 列队春游 题解

    Problem 对于一个数列 \(S\),\(S_0= \infty\),设对于 \(S_i\),\(S_{a_i}\) 是 \(S_i\) 之前第一个大于等于 \(S_i\) 的数.给定 \(S\) ...

  9. Java 开发者无痛迁移到 Cursor 开启AI编程新生涯

    习惯了IntelliJ IDEA的Java开发者,想尝试Cursor.Windsurf或Trae这类新兴的AI IDE,却担心迁移成本? 本文分享我的实战经验,帮助你高效切换开发环境,保留核心效率.效 ...

  10. Kong入门学习实践(3)路由转发

    最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看.由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版. 本篇,我们学习快速配置 ...