繁体   English   中英

隐藏来自JWT令牌的内部用户ID

[英]Hiding internal user ID from JWT token

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

当用户从客户端应用程序登录时,他获得JWT令牌,该令牌包含具有用户ID值的“子”部分。 然后,当用户调用API方法之一时,他仅提供JWT令牌,因此API从“子”获取用户ID,并向适当的表发出搜索请求。 因为每个表都有user_id列,所以在SQL查询中不需要在User表上进行联接(如果响应中不需要用户信息)。

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

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

  • 具有附加ext_user_id列(GUID)的现存用户表,并在JWT令牌中使用此值。 不利之处在于,每个SQL查询都将“联接”到User表以获得用户ID值。

  • 保留数据库不变,但使用JWE令牌而不是JWT。 缺点是每个API请求都会进行令牌解密,这可能会影响性能。

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

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

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

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

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

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

例如,如果您有使用该ID的资源,例如

/user/{userId}/getSomeData

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

您是否需要客户端解码JWT?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM