Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 安全无状态JWT实现 背景_Json_Security_Http_Authentication_Jwt - Fatal编程技术网

Json 安全无状态JWT实现 背景

Json 安全无状态JWT实现 背景,json,security,http,authentication,jwt,Json,Security,Http,Authentication,Jwt,我正在尝试使用JSON web令牌通过我的web应用程序实现令牌身份验证 无论我最终使用什么策略,我都试图维护两件事:无状态性和安全性。然而,从这个网站上的答案和互联网上的博客文章来看,似乎有些人相信这两个属性是相互排斥的 在试图维持无国籍状态时,存在一些实际的细微差别。我可以想到以下清单: 在每个用户的基础上,在其到期日期之前使受损令牌失效 允许用户一次注销所有计算机上的所有“会话”,并立即生效 允许用户注销其当前计算机上的当前“会话”,并使其立即生效 对用户记录进行权限/角色更改将立即生效

我正在尝试使用JSON web令牌通过我的web应用程序实现令牌身份验证

无论我最终使用什么策略,我都试图维护两件事:无状态性和安全性。然而,从这个网站上的答案和互联网上的博客文章来看,似乎有些人相信这两个属性是相互排斥的

在试图维持无国籍状态时,存在一些实际的细微差别。我可以想到以下清单:

  • 在每个用户的基础上,在其到期日期之前使受损令牌失效
  • 允许用户一次注销所有计算机上的所有“会话”,并立即生效
  • 允许用户注销其当前计算机上的当前“会话”,并使其立即生效
  • 对用户记录进行权限/角色更改将立即生效

当前战略 如果您在JWT中使用一个“已发布时间”声明,并在数据库表中使用一个表示用户记录的“last modified”列,那么我相信上面的所有要点都可以得到很好的处理

当web令牌进入进行身份验证时,您可以查询数据库中的用户记录,并:

if (token.issued_at < user.last_modified) then token_valid = false;
if(token.issued\u at
如果您发现有人泄露了用户的帐户,则用户可以更改其密码,并且可以更新
last_modified
列,从而使以前发行的令牌无效。这也解决了权限/角色更改不能立即生效的问题

此外,如果用户请求立即注销所有设备,那么您可以猜到:更新
last\u modified

这留下的最后一个问题是每个设备的注销。但是,我相信这甚至不需要访问服务器,更不用说访问数据库了。注销操作不能仅仅触发一些客户端事件侦听器来删除保存JWT的安全cookie吗


问题 首先,您在上述方法中是否发现了任何安全缺陷?我缺少的一个可用性问题呢


一旦这个问题得到解决,我真的不喜欢每次有人向安全端点发出API请求时都要查询数据库,但这是我能想到的唯一策略。有谁有更好的主意吗

您已经很好地分析了一些常见需求是如何破坏JWT的状态的。我只能对你目前的战略提出一些改进

当前战略

我看到的缺点是总是需要对数据库进行查询。对用户数据的细微修改可能会改变上次修改的标记并使其失效

另一种方法是维护令牌黑名单。通常为每个令牌分配一个ID,但我认为您可以使用上次修改的
。由于令牌的撤销操作可能很少,您可以保留一个只有
userId
last\u modified
的轻度黑名单(甚至缓存在内存中)

您只需在更新用户的关键数据(密码、权限等)和
currentTime-maxExpiryTime
后设置一个条目。当
currentTime-maxExpiryTime>last_modified
(不再发送未过期的令牌)时,可以丢弃该条目

无法注销该操作,只是触发一些客户端事件侦听器来删除保存JWT的cookie安全吗

如果在同一浏览器中有多个打开的选项卡,则可以使用localStorage事件在选项卡之间同步信息,以构建注销机制(或登录/用户更改)。如果您指的是不同的浏览器或设备,那么您需要以某种方式将事件从服务器发送到客户端。但这意味着维护一个活动频道,例如WebSocket,或者向本地移动应用发送推送消息

您在上述方法中是否发现了任何安全缺陷

如果您使用的是cookie,请注意,您需要针对CSRF攻击设置额外的保护。另外,如果您不需要从客户端访问cookie,请将其标记为
HttpOnly

我缺少的一个可用性问题呢

您还需要处理即将到期的循环代币