【问题标题】:Is session authentication more secure than token-based authentication?会话身份验证是否比基于令牌的身份验证更安全?
【发布时间】:2016-12-18 04:07:03
【问题描述】:

我一直试图了解会话和令牌身份验证之间的真正区别。

到目前为止我收集的内容:

  1. 在令牌认证中,服务器端没有存储任何内容。这意味着,实际的令牌包括密码和用户名,以及其他可能的信息。并且服务器只是解密令牌,然后检查用户名和密码是否正确。我说得对吗?如果令牌包含密码和用户名,那么令牌如何每次仍然不同?

  2. 在基于会话的身份验证中,会话令牌只是一个随机(在时间上唯一)id,它映射到服务器端的用户。这样当服务器接收到 session_id(例如在 cookie 中)时,它会检查它是否映射到任何用户,如果是,则用户通过身份验证。所以 session_id 不包含任何可以解密的用户相关信息?

  3. 在会话认证中,服务器将不加密(除非使用https)发回用户相关信息(不是密码)。

  4. 在token认证中,一旦解密,服务器不会直接发回用户信息,只会发回包含用户信息的token?

我感觉我还没有真正理解令牌和会话身份验证的工作原理。上面的陈述肯定有问题。

但是,让我们一起来看看这些陈述是正确的。那么基于会话的身份验证不是更安全吗?因为在基于会话的身份验证中,您不会泄露用户密码(例如在浏览器中)。由于它只是一个随机 ID,因此无法从中获取信息。但 Token 身份验证并非如此。由于令牌认证包含密码,如果有人设法解密它,他会得到你的密码。那么会话身份验证实际上是否比令牌身份验证更安全,因为它不会泄露密码或用户名信息?

【问题讨论】:

    标签: security session authentication login token


    【解决方案1】:

    不应将密码等敏感信息或社会安全号码等项目存储在令牌中。

    令牌签名的一个典型例子是这样的

    功能创建令牌(用户){ return jwt.sign(_.omit(user, 'password'), config.secret, { expiresIn: 60*60*5 }); }

    在这里,我们正在使用用户的详细信息创建一个签名令牌,但我们忽略了密码。

    我在这个帖子How is JSON Web Token more secure than cookie/session?中提供了非常详细的信息

    检查一下。我希望这个信息帮助!

    【讨论】:

      【解决方案2】:

      您的问题没有绝对答案是/否。例如,会话 cookie 容易受到 CSRF 的攻击,并且令牌可以通过 XSS 注入窃取。如果您不使用 HTTPS,这两种机制也容易受到 ManInTheMiddle 的攻击。因此,每个解决方案通常都需要额外的安全措施。取决于您的用例。

      我猜你说的是像 JWT 这样的令牌机制,它是自包含的并且可以防止更改,因为你说过

      在令牌认证中,服务器端没有存储任何内容。

      但是你混淆了一些概念。我将尝试使用 JWT 令牌作为参考来回答您的其他问题。如果不是,大多数概念也可以应用于不透明令牌

      在令牌认证中,服务器端没有存储任何内容。这意味着,实际的令牌包括密码和用户名,以及其他可能的信息。并且服务器只是解密令牌,然后检查用户名和密码是否正确。我是对的吗?

      令牌由服务器(而非客户端)颁发,要求用户出示其凭据并使用服务器私钥进行数字签名。令牌包括sub 声明中的委托人标识符和其他感兴趣的字段,如到期时间或发行人。永远不要密码

      当客户端发送token进行身份验证时,服务器验证签名以确定真实性并没有被更改

      如果令牌包含密码和用户名,那么令牌怎么可能每次都不一样?

      令牌不包含密码。由于某些变体声明,例如到期时间exp 或在iat 发布,令牌会有所不同。计算的签名也会不同

      所以 session_id 不包含任何可以解密的用户相关信息?

      是的,这是一个随机序列。与用户服务器的关系存储在服务器上

      在token认证中,服务器不会直接发回用户信息,而只会发回包含用户信息的token,一旦解密?

      JWT 令牌包含一些用户信息,但它没有加密,它是经过签名的。如果需要隐藏有效载荷,JWT 还允许使用 JWE 加密

      但是,让我们一起来看看这些陈述是正确的。那么基于会话的身份验证不是更安全吗?因为在基于会话的身份验证中,您不会泄露用户密码(例如在浏览器中)。由于它只是一个随机 ID,因此无法从中获取信息。但 Token 身份验证并非如此。由于令牌认证包含密码,如果有人设法解密它,他会得到你的密码。那么会话身份验证实际上是否比令牌身份验证更安全,因为它不会泄露密码或用户名信息?

      基本方法是错误的。 密码永远不会包含在令牌中。如果您不想泄露用户数据,可以使用不透明令牌或 JWE 加密与 JWT。正确的解决方案取决于您的用例。看我的第一段

      【讨论】:

      • “令牌由服务器(而非客户端)颁发,要求用户出示其凭据并使用服务器私钥进行数字签名”。然后使用相应的公钥来验证签名吗?那么如果某人拥有私钥,如果他已经使用该私钥生成了一个令牌,那么他就可以通过身份验证?
      • 如果服务器用户使用非对称密钥对 (RSA),则客户端可以使用公钥来验证签名。使用 simmetric keys (HMAC) 只有服务器可以执行验证。私钥必须保密,因为它允许生成新的有效令牌
      猜你喜欢
      • 1970-01-01
      • 2013-01-20
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 2017-02-23
      • 2015-12-24
      • 2011-06-08
      相关资源
      最近更新 更多