为什么不推荐用JWT保护你的Web应用?

django应用JWT(JSON Web Token)实战 在前后端分离的项目中,前后端进行身份验证通常用JWT来进行,JWT 提供了一个理想的认证解决方案,用来保护 RESTful API,确保只有经过认证的用户才能访问受保护的资源。基于前端框架(如React, Angular, Vue.js)的单页面应用 (SPA),开发者通过使用 JWT可以获得一种简单、安全、高效的方式来处理用户认证和授权的问题。本文通过django项目的实战来说明如何应用和使用JWT。 阅读详情

一、回顾安全

认证 / 授权

  • 认证(Authentication):验证目标对象身份。比如,通过用户名和密码登录某个系统就是认证。
  • 授权(Authorization):给予通过验证的目标对象操作权限。
    更简单地说:

认证解决了「你是谁」的问题。
授权解决了「你能做什么」的问题。

对于一般的web应用,我们知道 HTTP 是无状态的,所以客户端和服务端需要解决的如何让之间的对话变得有状态。例如只有是登陆状态的用户才有权限调用某些接口,那么在用户登陆之后,需要记住该用户是已经登陆的状态。常见的方法是使用 session 机制
常见的 session 模型是这样工作的:

image.png

  • 用户在浏览器登陆之后,服务端为用户生成唯一的 session id,存储在服务端的存储服务(例如 MySql, Redis)中
  • 该 session id 也同时返回给浏览器,以 SESSION_ID 为 KEY 存储在浏览器的 cookie 中
  • 如果用户再次访问该网站,cookie 里的 SESSION_ID 会随着请求一同发往服务端
    服务端通过判断 SESSION_ID 是否已经在 Redis 中判断用户是否处于登陆状态

理论上来说 ,JWT 机制可以取代 session 机制。用户不需要提前进行登陆,后端也不需要 Redis 记录用户的登陆信息。客户端的本地保存一份合法的 JWT, 当用户需要调用接口时,附带上该合法的 JWT,每一次调用接口,后端都使用请求中附带的 JWT 做一次合法性的验证。这样也间接达到了认证用户的目的

然而 JWT 真的能取代 session 机制吗?这么做有哪些好处和坏处?

JWT 的目的不是为了隐藏或者保密数据,而是为了确保数据确实来自被授权的人创建的(不被篡改)

回想一下,当你拿到 JWT 时候,你完全可以在没有 secret 的情况下解码出 header 和 payload,因为 header 和 payload 只是经过了 base64 编码(encode)而已,编码的目的在于利于数据结构的传输。虽然创建 signature 的过程近似于加密 (encrypt),但本质其实是一种签名 (sign) 的行为,用于保证数据的完整性,实际上也并且并没有加密任何数据

二、JWT在web应用中的缺陷

缺点一: 无法满足注销场景

传统的 session+cookie 方案用户点击注销,服务端清空 session 即可,因为状态保存在服务端。但 jwt 的方案就比较难办了,因为 jwt 是无状态的,服务端通过计算来校验有效性。没有存储起来,所以即使客户端删除了 jwt,但是该 jwt 还是在有效期内,只不过处于一个游离状态。

缺点二: 无法满足修改密码场景

修改密码则略微有些不同,假设号被到了,修改密码(是用户密码,不是 jwt 的 secret)之后,盗号者在原 jwt 有效期之内依旧可以继续访问系统,所以仅仅清空 cookie 自然是不够的,这时,需要强制性的修改 secret。

缺点二: 无法满足token续签场景

我们知道微信只要你每天使用是不需要重新登录的,因为有token续签,因为传统的 cookie 续签方案一般都是框架自带的,session 有效期 30 分钟,30 分钟内如果有访问,session 有效期被刷新至 30 分钟。但是 jwt 本身的 payload 之中也有一个 exp 过期时间参数,来代表一个 jwt 的时效性,而 jwt 想延期这个 exp 就有点身不由己了,因为 payload 是参与签名的,一旦过期时间被修改,整个 jwt 串就变了,jwt 的特性天然不支持续签!

三、JWT应用场景

一次性验证

比如用户注册后需要发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时之内激活),不能被篡改以激活其他可能的账户

这种场景就和 jwt 的特性非常贴近,jwt 的 payload 中固定的参数:iss 签发者和 exp 过期时间正是为其做准备的。

四、总结

Web 应用中使用 JWT 是让应用变得更复杂了。在 web 应用中,绝大多数情况下,传统的 cookie-session 机制工作得更好。jwt 适合做简单的 restful api 认证,颁发一个固定有效期的 jwt,降低 jwt 暴露的风险,不要对 jwt 做服务端的状态管理,这样才能体现出 jwt 无状态的优势。

SpringBoot 使用 JWT 保护 Rest Api 接口 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。Jwt 主要应用场景:授权Authorization (授权) : 这是使用 JWT 的最常见场景。一旦用户登录,后续每个请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的 JWT 的一个特性,因为它的开销很小,并且可以轻松地跨域使用。 阅读详情

相关推荐

理解和使用JSON Web Tokens(JWT)进行Web应用程序授权

如今,Web令牌是在网络中进行授权的一种非常流行的方式。JWT在Microsoft的背景下也变得非常流行,并且对我们今天构建应用程序的方式产生了一些其他影响。在本篇笔记中,我们将学习JWT是什么,以及如何在保护Web应用程序的上下文中具体使用它。JWT的全称通常发音为"jot",顺便提一句,这就像添加额外的"a"一样,也就是"jabbin"。然而,我发现在社区中,对JWT存在一些争议。但是在本篇笔记中,我们将把它称为Jabber。虽然Jabber通常用于管理授权,但其背后的理念是创建两方之间安全通信的标准方

喵喵分享师 1263

你管这破玩意儿叫 Token?

上周我们在团队内部首次采用了 jwt(Json Web Token) token 这种 no-session 的方式来作用户的账号验证,发现网上很多文章对 token 的介绍有误,所以对 ...

weixin_41385912的博客 879

【Actix Web】Rust Web开发JWT认证

在现代 Web 开发中,JWT(JSON Web Token)是一种常用的无状态认证方式。通过 JWT,服务端可以发放加密令牌给客户端,客户端每次请求时携带此令牌,服务器通过验证令牌来识别用户身份,省去了服务器端存储会话信息的负担。 Rust 作为一门性能与安全兼备的系统级编程语言,结合 Actix Web 框架开发高性能 Web 应用,成为后端开发的新趋势。

景天科技苑 1万+

关于使用JWT我的一些建议及避坑指南(非必须建议别用)

关于jwt的一些不足之处,可以参考这里:(译)别再使用 JWT 作为 Session 系统!问题重重且很危险。 JWT存在的意义是什么?很显然就是去中心化,无状态化!这是他存在的核心意义和价值,除去这两点JWT可以说是一无是处! 如果你尝试使用jwt构建session方案,我直接告诉你,赶紧放弃!越早越好!会玩死你,JWT在作为session时, 最大的痛苦就是自动续期和指定失效2个方面是致命伤。而且无解! 最重要的,不要考虑在服务器维护 JWT,比如在服务端维护一个 token...

wh445306 8270

springboot-jwt:使用JSON Web令牌(JWT)保护REST API的示例Springboot应用程序。 有关与Angular(版本2+)集成的示例,请访问https

springboot-jwt 使用JSON Web令牌(JWT)保护REST API的示例Spring Boot应用程序 此应用程序可用作启动具有完整功能的安全模块的Spring Boot REST API项目的种子。 主要组成部分 Spring Boot 1.5.3.RELEASE转到了解有关Spring Boot的更多信息 JSON Web令牌转到解码生成的令牌并了解更多信息 H2数据库引擎-用于快速原型开发和开发,但至少在大多数情况下不适用于生产。 请访问了解更多信息 运行应用程序 使用运行Spring Boot应用程序的几种方法之一。 以下是三个选项: 使用Maven目标进行构建: mvn clean package并执行以下生成的工件,如下所示: java -jar springboot-jwt-0.0.1-SNAPSHOT.jar或 在基于Unix / Linux的系统上:运

突破III-V/硅混合集成的挑战:UTC光电探测器能带工程仿真实践

本文探讨了UTC光电探测器在III-V/硅混合集成中的能带工程仿真实践,通过Ansys Lumerical平台实现多物理场仿真,解决晶格失配和能带不连续性等关键挑战。文章详细介绍了FDTD光学仿真和CHARGE电学仿真方法,优化器件性能,提升响应度和带宽,为高速光通信和量子计算提供技术支持。

weixin_29219539的博客 298

我不应该用JWT的!

JWT: 生成并发给客户端之后,后台是不用存储,客户端访问时会验证其签名、过期时间等再取出里面的信息(如username),再使用该信息直接查询用户信息完成登录验证。jwt自带签名、过期等校验,后台不用存储,缺陷是一旦下发,服务后台无法拒绝携带该jwt的请求(如踢除用户);Token+Redis: 是自己生成个32位的key,value为用户信息,访问时判断redis里是否有该token,如果有,则加载该用户信息完成登录。

2301_78976656的博客 1065

机器学习参数寻优:方法、实例与分析

机器学习模型的性能很大程度上依赖于其参数的选择。参数寻优(Hyperparameter Tuning)是提升模型表现的关键步骤之一。本文将详细介绍主流的参数寻优方法,包括网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesian Optimization)、和超参数优化库(如Optuna和Hyperopt)等,并探讨它们的优缺点及适用场景。

甜盐的博客 2843

JWT的优缺点,为什么不建议使用JWT

JSON Web Token(JWT)是一种用于在网络上传输信息的开放标准(RFC 7519)。它通过使用 JSON 对象将声明进行编码,可以被用来在用户和服务之间传递安全的、经过签名的信息。尽管JWT在某些场景下很有用,但也存在一些优缺点,其中一些原因可能导致不建议使用JWT。

d932385747的博客 3201

别只当玩具!聊聊这个555金属探测器电路背后的电磁感应与RLC调谐原理

本文深入解析了555金属探测器电路的工作原理,重点探讨了电磁感应与RLC调谐原理。通过分析电感线圈的电磁特性、RLC谐振电路的行为以及555定时器的多重功能,揭示了这一看似简单的装置如何实现金属检测。文章还提供了灵敏度优化方案和常见问题解决方法,帮助读者从科学角度理解这一实用技术。

weixin_29204205的博客 481

总结:知识图谱KG+大模型LLM

知识图谱KG+大模型LLM

安静的软件工程师 4217

为什么不推荐用JWT保护你的Web应用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34060741的博客 6149

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2673

为什么很多人不推荐你用JWT?

JWT真的安全吗?本文告诉你为什么在对安全性高的环境不推荐使用JWT

CodeSuc 的技术博客 1173

智能驾驶辅助系统(ADAS)全解析:功能详解 + 技术原理 + 实战案例

智能驾驶辅助系统(ADAS)是现代汽车技术的重要组成部分,旨在提升驾驶安全性和便利性。本文详细解析了ADAS的多个功能模块,包括自适应巡航控制(ACC)、车道偏离预警/车道保持辅助(LDW/LKA)、前向碰撞预警/自动紧急制动(FCW/AEB)、盲区检测/变道辅助(BSD/BSM)、倒车影像、自动泊车辅助(APA)、交通标志识别(TSR)、自动远光控制(AHB)、后方交叉来车预警(RCTA)和驾驶员疲劳监测。每个功能模块都基于特定的技术原理,如毫米波雷达、摄像头、传感器融合和深度学习算法,以实现对车辆周围环

weixin_43199439的博客 2106

教师模型与学生模型:知识蒸馏的核心概念

知识蒸馏,教师模型,学生模型,模型压缩,迁移学习,深度学习 1. 背景介绍 深度学习模型在图像识别、自然语言处理等领域取得了显著的成就,但其巨大的模型规模和高昂的计算成本限制了其在资源有限的设备上的部署。知识蒸馏(Knowledge Distillation)作为一种模型压缩技术,旨

AI架构师小马 2772

为什么很多人不推荐你用JWT?

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 340

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 面试官:聊一下你对MySQL索引实现原理?
下一篇: 深入浅出Redis【一】Redis简介及环境安装
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值