据我了解JWT验证它基本上是这样的:当攻击者获得用于生成JWT的秘密时会发生什么?
- 用户发送的登录凭据到服务器
- 如果登录凭据是正确的,服务器发出包含的用户ID和用户名一智威汤逊(或任何你想要的在有效载荷,以确定
- 是使用应用程序范围内的秘密,这应该被存储在环境变量
- JWT是由用户存储生成此JWT用户),例如在localStorage的和与每一个请求发送到标头 012中的服务器
- 使用应用程序范围的秘密验证auth头中的JWT。如果验证成功,我们知道谁发送了请求,并且请求是否被授权。
但是如果攻击者获得访问用于生成智威汤逊秘密的信息会发生什么?是不是像主密码?随着秘密和用户ID /用户名,任何人都可以为任何用户发布JWT,并基本上接管任何帐户。这不是一个巨大的缺陷,因为一小部分信息会危及整个系统(而不仅仅是一个用户帐户)?还是我误会了?
此页面指示最佳实践:https://stormpath.com/blog/jwt-the-right-way/“保护用于计算和验证签名的秘密签名密钥。秘密签名密钥只能由发行人和消费者,它们不应该在这两方之外访问。“jwt示例代码有一个硬编码的密钥,很多人都会对他们的代码做同样的事情,从不评估实践,然后一部分人将这些代码存储在公共存储库中。危险,顺便说一句 –
是的,当然它不应该被硬编码,它不应该在你的回购(或在Github上为上帝着想)......但是让我说我有几个应用程序的实例,通过启动新实例因此我需要将秘密传递给我的应用程序的每个实例,这意味着我必须将秘密存储在我的服务器上的某个地方,因为我不打算手动启动实例,输入只存在于我的应用程序中的秘密现在我的问题是:如果有人能够访问这个秘密怎么办?整个应用程序基本上都是公开的,对吧? –
正如我刚才想到的那样,让攻击者更难以为每个用户添加一个随机的,唯一的,串到存储在用户信息中的JWT。任何攻击者都可以轻松读取,但只能用于当前登录的帐户。这样服务器就会立即知道服务器上是否生成了JWT。不利的一面是,每一个保护API端点的请求都会影响数据库,查询用户表来验证字符串。 –