我正在尝试为我的RESTful API使用JWT实现无状态身份验证。
AFAIK,JWT基本上是在REST调用期间作为HTTP标头传递的加密字符串。
但是,如果有一个窃听者看到请求并窃取令牌,该怎么办?那他就能伪造我的身份要求吗?
实际上,这种担忧适用于所有基于令牌的身份验证。
如何预防呢?像HTTPS这样的安全通道?
trade-off
间having finer control of token expiration
和having better scalability
。
我正在尝试为我的RESTful API使用JWT实现无状态身份验证。
AFAIK,JWT基本上是在REST调用期间作为HTTP标头传递的加密字符串。
但是,如果有一个窃听者看到请求并窃取令牌,该怎么办?那他就能伪造我的身份要求吗?
实际上,这种担忧适用于所有基于令牌的身份验证。
如何预防呢?像HTTPS这样的安全通道?
trade-off
间having finer control of token expiration
和having better scalability
。
Answers:
我是一个节点库的作者,该库在相当深度的地方处理身份验证express-stormpath,因此在这里我将介绍一些信息。
首先,JWT通常不加密。尽管有一种加密JWT的方法(请参阅:JWEs),但实际上由于很多原因,这种方法并不常见。
接下来,任何形式的身份验证(是否使用JWT)都将受到MitM攻击(中间人)攻击。当您通过Internet发出请求时,攻击者可以查看您的网络流量时,就会发生这些攻击。这就是您的ISP可以看到的NSA等。
SSL可以防止此情况的发生:通过对计算机中的网络流量进行加密->身份验证时使用某些服务器,监视您网络流量的第三方无法看到您的令牌,密码或类似内容,除非它们能够以某种方式获取服务器的私有SSL密钥的副本(不太可能)。这就是SSL对于所有形式的身份验证都是强制性的原因。
但是,假设有人能够利用您的SSL并能够查看您的令牌:问题的答案是YES,攻击者将能够使用该令牌模拟您并向您的服务器发出请求。
现在,这就是协议的来源。
JWT只是身份验证令牌的一种标准。它们几乎可以用于任何用途。JWT之所以很酷,是因为您可以在其中嵌入额外的信息,并且可以验证没有人将其弄乱(签名)。
但是,JWT本身与“安全性”无关。出于所有目的和目的,JWT或多或少与API密钥相同:只是用于在某处对某些服务器进行身份验证的随机字符串。
使您的问题更有趣的是所使用的协议(很可能是OAuth2)。
OAuth2的工作方式是,它旨在为客户端提供TEMPORARY令牌(如JWTs!),仅在短时间内进行身份验证!
这个想法是,如果您的令牌被盗,攻击者只能在短时间内使用它。
使用OAuth2,您必须经常通过提供用户名/密码或API凭据,然后通过交换令牌来重新认证自己。
因为此过程不时发生,所以您的令牌会经常更改,这使得攻击者更难不断地冒充您,而不会遇到麻烦。
希望这可以帮助^^
我知道这是一个老问题,但我认为我可以在这里降低$ 0.50,也许有人可以改善或提出理由完全拒绝我的方法。我正在通过HTTPS(ofc)在RESTful API中使用JWT。
为此,您应该始终发布短期令牌(取决于大多数情况,在我的应用中,我实际上将exp
声明设置为30分钟和ttl
3天,因此您可以刷新此令牌,只要它ttl
仍然存在有效,令牌尚未列入黑名单)
对于authentication service
,为了使令牌无效,我喜欢使用内存中的缓存层(在我的情况下为redis)作为JWT blacklist
/ ban-list
,具体取决于一些标准:(我知道这违反了RESTful理念,但是存储的文档是确实是短暂的,因为我将其剩余的生存时间列入黑名单-声明- ttl
)
注意:列入黑名单的令牌无法自动刷新
user.password
或user.email
已更新(需要密码确认),则身份验证服务将返回刷新的令牌并使先前的令牌无效(黑名单),因此,如果您的客户端检测到用户身份已以某种方式受到破坏,则可以要求该用户更改其密码。 。如果您不想使用黑名单,则可以(但我不鼓励您iat
)针对user.updated_at
字段验证(发出于)索赔(如果jwt.iat < user.updated_at
JWT无效)。最后,您像每个人一样正常地验证令牌。
注意2:建议不要为令牌声明生成并使用UUID令牌,而不要使用令牌本身(这确实很长)作为缓存的键jti
。这样做很好,而且我认为(不确定,因为它只是在我脑海中浮现出来),您还可以使用与CSRF令牌相同的UUID,方法是返回一个secure
/ non-http-only
cookie并X-XSRF-TOKEN
使用js 正确实现标头。这样,您就避免了为CSRF检查创建另一个令牌的计算工作。
我们是否可以仅添加请求生成此JWT令牌的初始主机的ip作为声明的一部分?现在,当JWT被盗并从另一台机器上使用时,当服务器验证此令牌时,我们可以验证请求的机器ip是否与该机器ip匹配,作为声明的一部分。这将不匹配,因此令牌可以被拒绝。同样,如果用户尝试通过将自己的ip设置为令牌来操纵令牌,则令牌会随着令牌的更改而被拒绝。