为什么我应该让JSON Web Token有效负载不加密?

b0zn9rqh  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(104)

我正在阅读JWT,有这么多教程和这么多方法,这让人困惑。
我有几个关于正确使用JWT的问题:
1)我一直看到在服务器之间传输JWT的方法不一致。For example, here:一种传输方法用于检索令牌(通过POST主体中JSON编码的对象),另一种方法用于提交令牌(通过HTTP头)。为什么会出现这种不一致?当然,方法的选择取决于实现者,但至少保持一致,只使用header或只使用body不是一个好的实践吗?
2)JWT有效负载包含状态信息,因为服务器没有维护它。很明显,应该保持有效负载的大小尽可能小,因为JWT的大小被添加到每个请求和响应中。也许只是一个用户id和缓存的权限。当客户端需要任何信息时,它可以通过HTTP主体(通常是JSON编码的)接收信息,并将其存储在本地存储中,似乎不需要出于相同的目的访问只读JWT有效负载。那么,为什么要保持JWT有效负载不加密呢?为什么要混合使用两种将应用程序数据获取到客户机的方法,同时使用JWT有效负载和普通的响应体数据?最好的做法不应该是保持JWT始终加密吗?它只能在服务器端更新。

dhxwm5r4

dhxwm5r41#

1.我一直看到在服务器之间传输JWT的方法不一致。[...]至少要保持一致,只使用header或只使用body,难道不是一个很好的做法吗?
这可能取决于客户。虽然Web应用可以通过将JWT存储在cookie存储中获得更高的安全性,但原生应用可能更倾向于本地存储以访问JWT信息。[1]第一章

  1. JWT有效负载包含状态信息,因为服务器没有维护它。很明显,应该保持有效负载的大小尽可能小,因为JWT的大小被添加到每个请求和响应中。也许只是一个用户id和缓存的权限。当客户端需要任何信息时,它可以通过HTTP主体(通常是JSON编码的)接收信息,并将其存储在本地存储中,似乎不需要出于相同的目的访问只读JWT有效负载。
    JWT保持后端状态,而不是客户端状态。后端状态可以是User 128 is logged in as administrator。在我的示例中,它存储在JWT的字段SubjectScopes中。客户端不会发送包含此信息的后端会话的ID,而是直接在JWT中。因此,后端不必保持存储用户128的logged in state的会话。如果客户端请求User 2的信息,如果JWT告诉登录的用户具有ID 1,则BE可以决定该信息被禁止。
    那么,为什么要保持JWT有效负载不加密呢?
    状态通常对客户端不保密。重要的因素是JWT被保护以防止操作(签名)。客户端甚至可以利用JWT中的信息,比如根据状态调整GUI等。(比如是否显示管理GUI的按钮)如果使用公钥进行验证,它可以验证JWT,但通常没有必要这样做,因为客户端代码不可信。
    为什么要混合使用两种将应用程序数据获取到客户机的方法,同时使用JWT有效负载和普通的响应体数据?
    如上所述,JWT的主要目的是将信息保存在后端,而不是客户端。一旦用户登录,后端会问:“嘿,你能为我保存这个信息并将其附加到每个请求中吗?这样我就可以在此期间忘记你了。“就像你的经理要求你在裙子上贴上名字贴纸,这样他/她就不必记住你的名字。”(《古兰经》13:14)“你们应当知道,你们的行为是不可改变的。
    最好的做法不应该是保持JWT始终加密吗?它只能在服务器端更新。
    它并没有真正带来任何安全性,除非你在JWT中存储秘密信息,这可能是更好的服务器端。与只验证签名相比,解密要麻烦一些。
    [1][Local Storage vs Cookies](https://stackoverflow.com/questions/3220660/local-storage-vs-cookies)

相关问题