【问题标题】:Hiding internal user ID from JWT token从 JWT 令牌中隐藏内部用户 ID
【发布时间】:2016-11-17 03:45:00
【问题描述】:

有一个 REST API 服务正在开发中,它为发出请求的用户提供了对内部 SQL 数据库的不同搜索方法。 数据库包含几张表,每张表都有user_id列,即User表中id列的引用键(唯一整数,主键)。这很重要。

当用户从客户端应用程序登录时,他会获得 JWT 令牌,其中包含带有用户 ID 值的“子”部分。 然后当用户调用其中一种 API 方法时,他只提供 JWT 令牌,因此 API 从“子”获取用户 ID,并向相应的表发出搜索请求。 因为每个表都有user_id列,SQL查询中不需要对User表进行join(如果我们不需要响应中的用户信息)。

问题在于,公开内部用户 ID 是一种不好的做法,可能会导致安全/业务问题。 所以我正在寻找隐藏它。现在我看到以下选项:

  • 将用户 ID 更改为字符串列(使用顺序 GUID),但这对我们的系统来说是一个巨大的突破性变化

  • 具有附加 ext_user_id 列 (GUID) 的现存用户表,并在 JWT 令牌中使用此值。缺点是之后每个 SQL 查询都会“加入”到 User 表以获取用户 id 值。

  • 保持数据库不变,但使用 JWE 令牌而不是 JWT。缺点是每次API请求都会做token解密,可能会影响性能。

也许还有其他选择?还是其中一种方法比其他方法更具优势(实际上除了第一种)?

【问题讨论】:

    标签: database rest security jwt


    【解决方案1】:

    基本上我认为这些是你的选择。

    您专注于表现。使用解决方案 2 和 3,您必须比较 SQL 查询/加入的开销 以获取用户 ID 和 JWE 令牌的解密

    JWE 解密时间将始终基本相同,使用对称密钥可能需要几毫秒的处理器时间。但是,数据库查询需要磁盘访问,并且取决于其他因素:记录数、连接数、磁盘访问时间等。如果不详细了解问题,不可能给您一个绝对的衡量标准。我建议您凭经验衡量每个案例的开销并评估它是否对您有问题

    除了性能,我建议通过隐藏 ID 来评估附带问题

    您是否需要客户端知道您的 REST API 中的 ID?

    例如,如果您有一个使用这样的 ID 的资源

    /user/{userId}/getSomeData
    

    JWE 不会有用,因为您需要以任何方式提供标识符

    您需要客户端解码 JWT 吗?

    如果你使用JWE,客户端无法解码,因为它没有解密密钥

    您需要将 GUID 转换为 ID 的服务器中的多少个位置?

    您将需要对每个查询进行查询,或者在入口点的过滤器中进行一般转换查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 2021-07-05
      • 2021-11-26
      • 2018-09-26
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多