当前位置: 首页 > 知识库问答 >
问题:

正在使客户端JWT会话无效

吕鸿轩
2023-03-14

我读了很多关于JWT的书,以及如何通过JWT创建“无状态”会话。我理解的要点是因为签名

我不明白的是,如果您的用户需要注销,或者您需要在过期之前使会话无效,会发生什么情况?

从技术上讲,您可以指示浏览器从客户端删除它,但您不能确定这是否真的发生了。令牌本身在技术上仍然有效,如果没有遵循您的删除说明,它仍然可以使用。

这种理解正确吗?如果是这样,这难道不是客户端会话管理的一个巨大错误吗?除了让服务器存储会话或缩短过期时间之外,还有什么方法可以克服这一问题吗?

共有3个答案

宗政洋
2023-03-14

黑名单是一种JWT无状态违规行为。您可以使用许多身份验证方案。JWT是基于无状态的,所以应该这样使用。另一方面,它是非常常见的身份验证方案,如果必须实现它,并且如果希望应用程序(API)真正安全,则必须允许一些自定义

我个人在我的项目中使用这两种方法(单独或组合,取决于性能需求):

>

  • 令牌日志。我确实记录了我的项目中发布的每个令牌,包括ID、声明、过期,并且我在每个请求上都对其进行验证。如果令牌过期,它将从该日志移动到存档。性能下降没那么糟糕。

    除了用户名之外,我还向声明中添加了一个用户秘密哈希(类似于自动生成的隐藏令牌或密码),该哈希在下一步从dbo加载用户时得到授权。这没有显著的性能下降,因为无论如何都会执行对用户的查询。缺点是您不能使具体令牌无效,只能使所有用户的会话无效。

  • 傅花蜂
    2023-03-14

    我做了一些功课,似乎实现撤销的更好方法是使用jti(Jtw上的id)和一个被撤销id的黑名单(当令牌过期时,该黑名单将被清除)。这使得JTW只对黑名单部分有状态。

    奚无尘
    2023-03-14

    在JWT令牌到期前使其无效有几个原因:帐户删除/阻止/暂停、密码更改、权限更改、管理员注销用户。所以你的问题是关于主题的

    根据您的用例,有几种技术可以应用或组合

    1) 从本地存储中删除客户端令牌

    2)令牌黑名单:存储注销之间的令牌

    它需要服务器存储。如果您不希望撤销太多令牌,您也可以使用内存中的黑名单。您只需要在更新用户和当前时间的关键数据后设置一个条目-maxEXiryTime

    3) 到期时间短并轮换。每隔几个请求发出一个新的访问令牌。使用刷新令牌允许应用程序获取新的访问令牌,而无需重新验证并与滑动会话结合

    滑动会话是在一段时间不活动后过期的会话。当用户执行操作时,会发出一个新的访问令牌。如果用户使用过期的访问令牌,则会话将被视为不活动,需要新的访问令牌。可以使用刷新令牌或需要凭据来获取此新令牌

    >

  • 如果帐户被新用户泄露,允许更改用户唯一ID

    要在用户更改密码时使令牌无效,请使用密码哈希对令牌进行签名。如果密码更改,任何以前的令牌都会自动验证失败。将此机制扩展为其他感兴趣的字段进行签名。缺点是它需要访问数据库

    更改签名算法以吊销主要安全问题中的所有当前令牌

    看看如何使JSON Web令牌无效

  •  类似资料:
    • iam使用openam与Tomcat7一起使用,下面的行总是产生异常SSOTokenManager manager=SSOTokenManager.getInstance();SSOToken SSOToken=manager.createssotoken(请求); 无效的会话id AMSSOProvider:09/18/2012 01:18:01:882 PM EEST:Thread[http-

    • 我正在尝试各种基于JavaSpring的安全实现,如下所示 1.JWT认证 用户访问 Springboot标识为受保护的资源,并将用户重定向到 /login 用户输入凭据和浏览器做一个POST /authenticate 服务器验证凭据并生成JWT令牌。设置为响应标头并重定向到/ 浏览器加载 /.AngularJS在响应标头中识别JWT令牌,并将其存储在本地存储中 所有后续调用都将在头中包含承载令

    • 问题内容: 我有一个脚本,该脚本将由使用SSH登录到服务器的人运行。 有没有一种方法可以自动找出用户连接的IP地址? 当然,我可以问用户(这是程序员的工具,所以没问题),但是如果我发现的话,它会更酷。 问题答案: 检查是否有一个环境变量称为: 要么 (或任何其他环境变量)在用户登录时设置。然后使用用户登录脚本对其进行处理。 提取IP:

    • 代码: 上传jar时出现以下异常 上传E:\livy\u old。jar到Spark上下文。。。线程“main”java中出现异常。util。同时发生的ExecutionException:java。木卫一。IOException:请求错误:“请求失败:无法将本地路径/root/.livy sessions/61a5e39c-d199-4bb8-967b-960b4e3e9ee3/livy_old

    • 我正在使用ActiveMQ客户端库将我的服务器应用程序连接到ActiveMQ。几个不同的消费者和生产者在单个线程中运行。、和之间的关系应该如何? 每个JVM一个连接工厂 每个JVM一个到代理的连接或n个连接,每个使用者一个 n个会话,每个消费者一个(Javadoc似乎强烈建议这样做)

    • 我使用Quarkus Rest客户端与一个外部服务通信,该服务使用两个cookies来验证所有请求。这两个cookies是从身份验证API和每个后续API调用中返回的。有没有办法自动处理这些cookies?目前,我从身份验证API的响应对象获取cookies,并使用@CookieParam在每个请求中手动发送它们。