面向多用户的JWT体系结构?

面向多用户的JWT体系结构?,jwt,Jwt,在JWT/Flask教程中,大多数示例始终只考虑使用系统的一个用户。我想在多用户级别上理解这一点,但找不到正确的资源 假设我们拥有以下密钥: app.config['SECRET\u KEY']='randomkey' 两个问题: 每个用户的密钥是否相同?如果是这样的话,这难道不会带来安全风险吗?因为如果钥匙被偷了,任何人都可以做任何他们想做的事情 如果不一样,那么密钥如何存储在服务器端,以便在请求信息时对其进行身份验证?它是否会存储在用户表中的当前令牌或其他项下 在这种情况下,该密钥是JWT

在JWT/Flask教程中,大多数示例始终只考虑使用系统的一个用户。我想在多用户级别上理解这一点,但找不到正确的资源

假设我们拥有以下密钥:

app.config['SECRET\u KEY']='randomkey'

两个问题:

  • 每个用户的密钥是否相同?如果是这样的话,这难道不会带来安全风险吗?因为如果钥匙被偷了,任何人都可以做任何他们想做的事情
  • 如果不一样,那么密钥如何存储在服务器端,以便在请求信息时对其进行身份验证?它是否会存储在用户表中的当前令牌或其他项下

在这种情况下,该密钥是JWT签名密钥,它也可能不同于flask的密钥设置(请参阅)。它不用于加密,所以不打算成为服务器和用户之间的共享秘密。它的作用是向服务器提供JWT内容是由服务器本身生成的证明:它是完整性的证明

知道该密钥意味着有权代表应用程序发布JWT,攻击者可以模拟服务器或使用一些修改的声明发出请求,例如假装是其他用户。这意味着,从安全角度来看,这些密钥非常合理

结果是1个应用程序:1个键,还有一些备注

  • 从理论上讲,这个密钥永远不会改变:如果在T1 key=x时,用户可以登录并接收一个用key=x签名的JWT。在t2key=y时,用户将使用前面的JWT调用一些API,服务器将尝试验证(签名(有效负载,x),y)。因此,每个用户都将自动注销

  • 尽管1。旋转钥匙会很好。在这种情况下,身份验证系统应该保存旧密钥的缓冲区,并使用它们来验证最旧的JWT。因为JWT应该是短期的,所以设置一个比JWT过期时间更大的旋转时间,并且只保留最后使用的键和当前键是很有用的

  • 此密钥是一个机密,应与其他机密一样进行管理。除了像在代码/配置中留下明文这样糟糕的方法外,还有来自云提供商的秘密管理器,或者如果使用后者,还有来自配置管理工具(salt、ansible)的秘密管理器,或者是用于敏感数据的专用存储引擎。不管怎么说,如果你在一个结构化的组织中,这是基础设施/安全团队更关心的问题