隐藏JWT令牌

时间:2016-07-14 09:31:11

标签: database rest security jwt

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

JWE解密时间总是基本相同,对称密钥可能只有几毫秒的处理器时间。但是,数据库查询需要磁盘访问,并取决于其他因素:记录数,连接数,磁盘访问时间等。如果不详细了解问题,则无法给出绝对度量。我建议你凭经验衡量每个案例的开销,并评估它是否适合你

除了表现之外,我建议通过隐藏ID来评估附属问题

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

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

/user/{userId}/getSomeData

JWE没用,因为你需要以任何方式提供标识符

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

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

您需要将GUID转换为ID所需的服务器位数

您需要查询每个查询,或在入口点过滤器中的常规转化查询