您现在的位置是:首页» windows系统» 一文搞懂evolution,jwt知识点总结

一文搞懂evolution,jwt知识点总结

2024-07-13 14:07:20
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。.markdown-body { line-height: 1.75; font-weight: 400; font-siz

本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。

.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(51, 51, 51, 1) } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { line-height: 1.5; margin-top: 35px; margin-bottom: 10px; padding-bottom: 5px } .markdown-body h1 { font-size: 24px; margin-bottom: 5px } .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { font-size: 20px } .markdown-body h2 { padding-bottom: 12px; border-bottom: 1px solid rgba(236, 236, 236, 1) } .markdown-body h3 { font-size: 18px; padding-bottom: 0 } .markdown-body h6 { margin-top: 5px } .markdown-body p { line-height: inherit; margin-top: 22px; margin-bottom: 22px } .markdown-body img { max-width: 100% } .markdown-body hr { border-top: 1px solid rgba(221, 221, 221, 1); border-right: none; border-bottom: none; border-left: none; margin-top: 32px; margin-bottom: 32px } .markdown-body code { border-radius: 2px; overflow-x: auto; background-color: rgba(255, 245, 245, 1); color: rgba(255, 80, 44, 1); font-size: 0.87em; padding: 0.065em 0.4em } .markdown-body code, .markdown-body pre { font-family: Menlo, Monaco, Consolas, Courier New, monospace } .markdown-body pre { overflow: auto; position: relative; line-height: 1.75 } .markdown-body pre>code { font-size: 12px; padding: 15px 12px; margin: 0; word-break: normal; display: block; overflow-x: auto; color: rgba(51, 51, 51, 1); background: rgba(248, 248, 248, 1) } .markdown-body a { text-decoration: none; color: rgba(2, 105, 200, 1); border-bottom: 1px solid rgba(209, 233, 255, 1) } .markdown-body a:active, .markdown-body a:hover { color: rgba(39, 91, 140, 1) } .markdown-body table { display: inline-block !important; font-size: 12px; width: auto; max-width: 100%; overflow: auto; border: 1px solid rgba(246, 246, 246, 1) } .markdown-body thead { background: rgba(246, 246, 246, 1); color: rgba(0, 0, 0, 1); text-align: left } .markdown-body tr:nth-child(2n) { background-color: rgba(252, 252, 252, 1) } .markdown-body td, .markdown-body th { padding: 12px 7px; line-height: 24px } .markdown-body td { min-width: 120px } .markdown-body blockquote { color: rgba(102, 102, 102, 1); padding: 1px 23px; margin: 22px 0; border-left: 4px solid rgba(203, 203, 203, 1); background-color: rgba(248, 248, 248, 1) } .markdown-body blockquote:after { display: block; content: "" } .markdown-body blockquote>p { margin: 10px 0 } .markdown-body ol, .markdown-body ul { padding-left: 28px } .markdown-body ol li, .markdown-body ul li { margin-bottom: 0 } .markdown-body ol li .task-list-item, .markdown-body ul li .task-list-item { list-style: none } .markdown-body ol li .task-list-item ol, .markdown-body ol li .task-list-item ul, .markdown-body ul li .task-list-item ol, .markdown-body ul li .task-list-item ul { margin-top: 0 } .markdown-body ol ol, .markdown-body ol ul, .markdown-body ul ol, .markdown-body ul ul { margin-top: 3px } .markdown-body ol li { padding-left: 6px } .markdown-body .contains-task-list { padding-left: 0 } .markdown-body .task-list-item { list-style: none } @media (max-width: 720px) { .markdown-body h1 { font-size: 24px } .markdown-body h2 { font-size: 20px } .markdown-body h3 { font-size: 18px } }

本文原发于 JWT 身份认证优缺点分析 。

在 JWT 基本概念详解 这篇文章中,我介绍了:

什么是 JWT? JWT是由何制成的? 如何根据 JWT进行身份验证? JWT如何防止トークン被修改? 如何提高 JWT的安全?

本文讨论了 JWT认证的优点和缺点,以及常见问题的解决方法。

JWT 的优势

相比于 Session 认证的方式来说,使用 JWT 进行身份认证主要有下面 4 个优势。

无状态

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

但 JWT的无状态性也是其最大的缺点:无法控制!

就比如说,如果我们希望在 JWT有效期内废除 JWT或改变其管辖权,并不会立即生效,通常需要到有效期届满为止。再比如说,当用户退出时,JWT 也还有效。除非,我们向后端添加了额外的处理逻辑,例如存储无效的 JWT,后端验证 JWT是否适用于进一步处理.具体的解决办法,我们将在下面详细解释,这是简单的引言。

有效避免CSF攻击

CSRF(Cross Site Request Forgery)通常被翻译为跨站点请求伪造。它属于网络攻击的领域。与SQL脚本注入、XSS和其他安全攻击方法相比,CSRF 对 他们 并不 很 熟悉 。但是,的确,在开发系统时,我们必须考虑到安全风险。就连业内技术标杆 Google 的产品 Gmail 也曾在 2007 年的时候爆出过 CSRF 漏洞,这给Gmail用户造成了重大损失。

那么究竟什么是跨站请求伪造呢?简单来说就是用你的身份去做一些不好的事情(发送一些对你不友好的请求比如恶意转账)。

举个简单的例子:小周登录到网上银行,他来到网上银行的邮局,请看下面的连结,上面写着“科学金融,年盈利率过万”,一个奇怪的小点打开了链接,结果是他在账户上损失了10,00元.这是这么回事呢?黑客在链接中隐藏了一个请求,本请求将直接使用小庄的身份向银行发出汇款请求,也就是说,您通过您的cookie向银行发送请求。

CSRF攻击需要依赖于 Session authentication中的cookieSessionID浏览器将Cookie发送到服务器,并在请求时随身携带。 这个功能,即使黑客无法取得你SessionID,只要您错位攻击链接,您就可以达到攻击效果。

另外,并不是必须点击链接才可以达到攻击效果,很多时候,只要你打开了某个页面,CSRF 攻击就会发生。

那么 JWT为什么没有这个问题呢?

一般来说,我们使用 JWT,我们成功登录 JWT后,一般来说, 你将选择将它存储在本地存储.每个前端的请求将由本 JWT 执行,整个过程不涉及cookie。因此,即使您点击了一个非法的链接发送到服务端的请求,这项非法请求也不会载有 JWT,因此这项请求将是非法的。

总结来说就一句话:使用 JWT 进行身份验证不需要依赖 Cookie ,因此可以避免 CSRF 攻击。

不过,这样也会存在 XSS 攻击的风险。为了避免 XSS 攻击,你可以选择将 JWT 存储在标记为httpOnly的 Cookie 中。但是,这样又导致了你必须自己提供 CSRF 保护,因此,实际项目中我们通常也不会这么做。

避免XSS攻击的常见方法是筛选请求中包含XSS攻击风险的可疑字符串。

在春季项目中, 我们通常通过创建XSS滤波器来实现它.

适合移动端应用

如果您使用 Session 来验证,需要保存一份信息在服务器端,而且这种方式会依赖到 Cookie(需要 Cookie 保存SessionId),因此不适合移动端部。

然而,在使用 JWT进行认证时不会有这样的问题,因为 JWT可以在客户存储期间使用,而且 JWT也可以在多种语言中使用。

单点登录友好

如果您使用 Session 来验证,实现单点登录,需要我们把用户的 Session 信息保存在一台电脑上,还有一些常见的跨域 Cookie 问题。但是,如果你使用 JWT进行认证,JWT存储在客户身上,不会存在这些问题。

JWT身份认证常见问题及解决方案

JWT亦适用于如取消登录等情形

同样, 具体 的 相关 情况 包括 :

退出登录; 修改密码; 服务端修改了用户权限或角色; 用户帐户被封锁/删除; 用户被迫终止服务; 用户被踢下线; ......

该问题不在会议认证方法中存在,因为在会议认证方法中,如果发生这种情况,服务器可以删除相应的会议记录。但是,使用 JWT认证并不是一个好的解决方法。我们也说过了,一旦 JWT 被 部署,如果后端没有添加其他逻辑,它在失败之前是有效的。

那么,我们如何解决这个问题?我浏览了大量的信息,并总结了以下四个方案:

1.存储 JWT在内存数据库中

保存 JWT到DB,Redis内存数据库在这里是一个很好的选择。如果需要 disabled JWT, 它可以直接从 Redis 中删除.但是,因此,每次使用 JWT发送请求时,必须首先从 DB 查询 JWT 的存在步骤,它也违反了 JWT 无国籍原则。

2、黑名单机制

和上面的方式类似,使用像Redis这样的内存数据库来维护黑名单,如果你想消灭 JWT,你可以直接将其添加到黑名单中。然后,每次使用 JWT 进行请求的话都会先判断这个 JWT 是否存在于黑名单中。

前两种方案的核心在于将有效的 JWT 存储起来或者将指定的 JWT 拉入黑名单。

虽然这两个方案都违反了 JWT的无国制原则,但我们通常在一般实际项目中使用这两个方案。

3.修改秘密:

我们为每个用户都创建一个专属密钥,如果我们想让某个 JWT 失效,我们直接修改对应用户的密钥即可。但是,这样相比于前两种引入内存数据库带来了危害更大:

如果服务是分布式的,则每次发出新的 JWT 时都必须在多台机器同步密钥。为此,你需要将密钥存储在数据库或其他外部服务中,这样和 Session 认证就没太大区别了。 如果用户同时在两个浏览器中打开系统,或者在手机末端打开系统,则不允许用户从一个地点撤回帐户,然后另一个地点重新登录。

4.保持卡的有效期短,并经常旋转

这是一个简单的方法,然而,这可能导致用户登录状态无法永久记录,并要求用户经常登录。

另外,对于修改密码后 JWT 还有效问题的解决还是比较容易的。说一种我觉得比较好的方式:使用用户的密码的哈希值对 JWT 进行签名。因此,如果密码更改,则任何先前的令牌将自动无法验证。

JWT 的续签问题

JWT期限一般不推荐很长时间,因此如何验证 JWT期限过后,如何实现动态的 JWT更新,以及如何避免用户经常需要重新登录?

我们先来看看在 Session 认证中一般的做法:假如 Session 的有效期 30 分钟,如果 30 分钟内用户有访问,就把 Session 有效期延长 30 分钟。

我们应该如何解决 JWT认证续期的问题?我看了很多信息,并总结了以下4种选择:

1.与សម័យ身份验证类似的练习

这个方案满足了大多数场景.假设服务结束时提供的 JWT有效期为30分钟,每次服务结束时,若 JWT 届满 不久 后,服务端将 JWT 重新生成给客户。客户每次要求检查新的 JWT,如果不一致,更新本地 JWT.这种方法的问题是, JWT只有在请求耗时时才更新,这对客户并不友好。

每项请求都会返回一个新的 JWT

这种方案的的思路很简单,但是,开销会比较大,尤其是在服务端要存储维护 JWT 的情况下。

JWT的有效期为午夜

这是一个妥协方案,确保大多数用户可以在白天正常地登录,并且适用于低安全要求的系统。

用户登录返回两个 JWT

第一个是进入 JWT,它的有效期 JWT的有效期大约是半小时,另一种是 refreshJWT, 它可以持续一段时间, 例如一天.客户端登录后,将 accessJWT 和 refreshJWT 保存在本地,每个访问通过 JWT访问到服务端。服务终结核查 JWT的有效性,如果过期的话,将 refreshJWT 转移到服务端.如果有效,服务端为客户生成新的 JWT访问.否则,客户端可以重新登录。

这种方案的不足是:

需要客户端来配合; 当用户取消时,必须确保两个 JWT同时无效。 重新请求获取 JWT 的过程中会有短暂 JWT 不可用的情况(可以通过在客户端设置定时器,当 accessJWT 快过期的时候,提前去通过 refreshJWT 获取新的 accessJWT)。

总结

JWT的一个重要优点是无国家性,但事实上,如果我们想在实际项目中合理使用 JWT,我们还需要存储 JWT信息。

JWT 也不是银弹,也有很多缺陷,具体是选择 JWT 还是 Session 方案还是要看项目的具体需求。万万不可尬吹 JWT,而看不起其他身份认证方案。

另外,没有 JWT直接使用普通トークン(随机生成,不包含特定信息)也可以使用Redis来验证。我在 “质量开放源项目建议” 的 第 8 期 推荐过的 Sa-Token 该项目是基于 JWT 的更完美的身份认证解决方案,支持自动重新签名、激活下线、帐户封锁、人对人记录等。有兴趣的朋友可以看看.

参考

JWT超详细分析: learnku.com/articles/17.. How to log out when using JWT: medium.com/devgorilla/… CSRF protection with JSON Web JWTs: medium.com/@agungsanto… Invalidating JSON Web JWTs: stackoverflow.com/questions/2…

后记

集中分享Java原始产品,大三开源 JavaGuide (「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备参加Java面试,縣治Java。),现在是120k+星。

原创不易,欢迎点赞分享, 欢迎关注我在掘金的账号 ,我会持续分享原创干货!加油,冲!

如果本文对你有帮助的话,欢迎点赞分享,这对我继续分享&创作优质文章非常重要。感谢

XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com