我应该在客户端使用身份验证 JWT 中包含的数据吗?
Should I use data contained in an authentication JWT on the client-side?
服务器在身份验证期间向客户端提供 JWT。该 JWT 包含稍后由服务器使用的信息。例如,JWT 可能包含 permissions
数组,其中列出了授予特定用户的所有权限。
如果客户端解析 JWT 并使用其中包含的权限信息,这是否被视为不良做法?客户端对服务器进行额外调用(例如 GET /permissions
)并根据该响应进行操作是否更好?
这在很大程度上取决于很多小细节;我会尽量不忘记任何事情,但理论上这样做应该没问题,如果满足某些条件,我不会认为这是一种不好的做法。
OAuth2 声明访问令牌对客户端应该是不透明的,但 JWT 只是一种令牌格式 (Learn JSON Web Tokens),它在其他情况下的使用并不意味着与 OAuth2 相同的规则。
另请注意,从额外的请求中获取信息具有相同的最终结果,但会增加一次调用的额外开销。如果权限非常不稳定,因为您可以重复调用,这会有一点好处。
但是,重要的部分更侧重于您所说的客户的意思以及客户将如何使用该信息,因此我将对此进行详细说明。
假设:
- 您提到的客户端可以部署为基于浏览器的应用程序 (SPA)、本机应用程序或充当客户端的某些服务器端组件。
- 服务器和客户端都由同一个实体控制。
- 客户端和服务器组件可以看作是一个单一的应用程序,也就是说,对于最终用户来说,客户端和服务器组件的存在没有区别;他们将它们作为一个整体使用。
说明
在这种情况下,服务器颁发的令牌只是客户端稍后访问受保护资源的一种方式,无需再次进行显式用户身份验证;它是一种在两个组件之间维持会话的机制。
鉴于同一实体控制客户端和服务器,将接收到的令牌视为白盒而不是黑盒是可以接受的。然后客户端可以解释令牌中的信息并利用它为最终用户提供更好的体验。但是,这意味着服务器将需要继续验证令牌及其相应的权限;客户对数据的任何解释纯粹是为了提供可选功能。
此外,对于部署到恶劣环境中的客户端,就像 SPA 应用程序的情况一样 ,通过查看数据做出的决定只能导致纯粹的审美决定,因为用户可能会伪造权限数据。例如,您可以使用它来有条件地 hide/disable 某些用户界面,这样用户就不必单击它就可以发现不允许这样做。
一个很好的类比是 Javascript 基于网络表单的输入验证;你应该这样做以获得更好的用户体验,但服务器将需要再次这样做,因为用户可以绕过 Javascript 验证。
服务器在身份验证期间向客户端提供 JWT。该 JWT 包含稍后由服务器使用的信息。例如,JWT 可能包含 permissions
数组,其中列出了授予特定用户的所有权限。
如果客户端解析 JWT 并使用其中包含的权限信息,这是否被视为不良做法?客户端对服务器进行额外调用(例如 GET /permissions
)并根据该响应进行操作是否更好?
这在很大程度上取决于很多小细节;我会尽量不忘记任何事情,但理论上这样做应该没问题,如果满足某些条件,我不会认为这是一种不好的做法。
OAuth2 声明访问令牌对客户端应该是不透明的,但 JWT 只是一种令牌格式 (Learn JSON Web Tokens),它在其他情况下的使用并不意味着与 OAuth2 相同的规则。
另请注意,从额外的请求中获取信息具有相同的最终结果,但会增加一次调用的额外开销。如果权限非常不稳定,因为您可以重复调用,这会有一点好处。
但是,重要的部分更侧重于您所说的客户的意思以及客户将如何使用该信息,因此我将对此进行详细说明。
假设:
- 您提到的客户端可以部署为基于浏览器的应用程序 (SPA)、本机应用程序或充当客户端的某些服务器端组件。
- 服务器和客户端都由同一个实体控制。
- 客户端和服务器组件可以看作是一个单一的应用程序,也就是说,对于最终用户来说,客户端和服务器组件的存在没有区别;他们将它们作为一个整体使用。
说明
在这种情况下,服务器颁发的令牌只是客户端稍后访问受保护资源的一种方式,无需再次进行显式用户身份验证;它是一种在两个组件之间维持会话的机制。
鉴于同一实体控制客户端和服务器,将接收到的令牌视为白盒而不是黑盒是可以接受的。然后客户端可以解释令牌中的信息并利用它为最终用户提供更好的体验。但是,这意味着服务器将需要继续验证令牌及其相应的权限;客户对数据的任何解释纯粹是为了提供可选功能。
此外,对于部署到恶劣环境中的客户端,就像 SPA 应用程序的情况一样 ,通过查看数据做出的决定只能导致纯粹的审美决定,因为用户可能会伪造权限数据。例如,您可以使用它来有条件地 hide/disable 某些用户界面,这样用户就不必单击它就可以发现不允许这样做。
一个很好的类比是 Javascript 基于网络表单的输入验证;你应该这样做以获得更好的用户体验,但服务器将需要再次这样做,因为用户可以绕过 Javascript 验证。