我正在阅读有关 JWT Web 令牌作为发送给用户的访问令牌的文章。其中一些提到网络令牌应该能够被用户解码。
这是否意味着解密整个网络令牌是不好的做法?例如,假设我返回以下 JWT Web 令牌,可以在其中解码该信息。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
但是,我觉得我不想让用户能够解码他/她的访问令牌,因此我使用另一种加密算法将所有内容加密为另一种形式,如下所示并传回给用户。
因此,当我在服务器中获取访问令牌并对其进行解码时,我会解密这个新文本。
如果我不想向用户公开声明中的一些可用值(例如用户 ID),是否建议这样做?如果没有,有什么替代方案?
JWT 是“签名的”,因此其内容受到保护以防止篡改:您无法更改其内容而不使其无效。
您可以选择“加密”内容,从而使它们仅对发行者(创建令牌的实体)和消费者(在验证后注定要使用其内容的实体)可见。
有一个标准:JWE
令牌包含用户数据并充当临时存储。在令牌中存储敏感数据是不好的。
在第一级,您应该存储用户名,也许还有角色或类似的东西。您不应包含密码,因此不需要加密。 不过,如果您愿意,您可以对其进行加密。
是的,最佳实践是使用 JSON Web 加密(JWE)RFC,解码后 JWT 中的声明是纯文本形式,因此如果用户丢失令牌,敏感信息如电子邮件、用户名、访问权限可见,可以作为任何攻击的初始信息。
JSON Web Token 最佳当前实践、RFC 8725 强调了如何从头开始正确构建 JWT 实现,但 IEEE、W3C 或 IETF 等权威机构没有就 是否应该这样做提出建议 加密 JWT 有效负载。
注意:如果您遵循 Google 和 Bing 的网络建议,那么您就是通过安全传输(例如 HTTPS)进行响应。
关于将有状态信息(例如访问令牌)固定到无状态 HTTP 协议,请参阅 cookie:限制对 cookie 的访问。
只要您正确实现了 JWT,您签署的 JWT将被认为是铁定的,即,从物理角度来看,伪造返回到服务器的有效负载实际上是不可能的。