在微服务中建立身份验证有几种方法,但最流行的是使用JWT令牌和OAuth协议以及OpenID Connect身份层。
在this tutorial中解释了如何实现这一点,其中有一个提示:
当令牌必须离开你的网络时,通过引用传递,然后当它们进入你的空间时,将它们转换为按值令牌。
但是,我不清楚这背后的原因。我怀疑这可能是由于一些安全优势(不给予客户端读取任何特定信息的可能性)。因为在JWT令牌本身中,它可能是关于角色/权限的信息。但出于此目的,令牌也可以加密。
另一个原因可能是JWT标记太大,为了避免每次使用这种方法时都携带此标记(或者如果JWT标记存储在cookie中,则它有大小限制)。
我还没有看到任何信息表明JWT令牌身份验证受到了损害,将其保留在客户端(浏览器中)是一种不好的做法。
另一方面,我看到Ping Identity也在使用通过引用传递的方法。您能帮助我理解这背后的原因吗?
2条答案
按热度按时间lmvvr0a81#
它们都是有效的选项,而且总是在您希望应用它们的确切情况下才能决定最合适的选项。通常情况下,每个选项都有其优缺点,您已经提到了一些,所以我将尽我所能在讨论中添加一些新的内容。
主要的区别在于内容,by-value将包含实际值,而reference只是一个随机的位序列。如果你想在令牌中表示敏感信息,这可能会使天平倾向于reference令牌。
如果您使用JWT,确实可以对它们进行加密以确保机密性,但是这会增加一个显著的复杂性层,并且在可用库中对JWT加密的支持很可能不如对签名的支持,因为加密没有类似的广泛使用。
关于大小,我不认为这应该是一个决定性因素。是的,如果你使用按值令牌,你需要保持它们足够小,以免在通道上造成显著的开销,但你不应该仅仅因为这个约束而选择一个或另一个。
有一点你没有提到,但我相信很重要的一点是,引用令牌似乎更适合授权服务器和资源服务器属于同一个实体的情况,确实已经有一个standard to cover token introspection,这样外部资源服务器就可以通过互操作的方式查询引用令牌的信息,但仍然是这样,当两个参与者都在同一安全边界内时,引用令牌应该更容易缩放和实现。
这篇文章中的建议也很有趣,您可以减少外部网络的开销,并且不会出现信息泄露问题,然后在一个中心位置升级到按值令牌,这意味着它后面的所有其他服务仍然可以从令牌本身中已经具有所需信息的简单性中获益。
总之,如果信息泄露对您来说是个问题,您可能会选择引用令牌,以便不承担JWT加密的成本;否则,您还不如让生活变得简单,使用值令牌。
xmjla07d2#
我相信使用引用令牌(不透明令牌)优于按值(JWT)的主要好处(本文想要传达的--除了信息披露之外)是当访问令牌在网络外部分发时能够控制它。
换句话说,如果我们在网络外部发布访问令牌作为JWT,那么在紧急情况下(当用户被停用/终止、丢失移动的电话等)很难撤销访问。但引用令牌可以很容易地撤销,因为它是AS边界内的指针。
here提供了对此的更详细说明。