会话认证比基于令牌的认证更安全吗?

时间:2016-08-11 12:09:24

标签: security session authentication login token

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

到目前为止我收集了什么:

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

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

  3. 在会话身份验证中,服务器将在不加密的情况下发回用户相关信息(而不是密码)(除非使用https)。

  4. 在令牌身份验证中,服务器一旦解密,就不会发回直接用户信息,只会发送包含用户信息的令牌?

  5. 我感觉我还没有真正了解令牌和会话身份验证的工作原理。在上面的陈述中肯定是错的。

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

2 个答案:

答案 0 :(得分:3)

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

我想你是在谈论像JWT这样的令牌机制,它是自包含的并且受到保护,因为你说

  

在令牌身份验证中,服务器端不存储任何内容。

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

  

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

令牌由服务器(非客户端)发出,要求用户提供其凭据并使用服务器私钥进行数字签名。令牌包括sub索赔中的委托人的标识符以及其他感兴趣的字段,如到期时间或发行者。从来没有密码

当客户端发送到令牌进行身份验证时,服务器会验证签名以确定未经更改的真实性

  

如果令牌包含密码和用户名,那么每次令牌如何仍然不同?

令牌不包含密码。由于某些变体声明(如过期时间expiat发出),令牌会有所不同。计算的签名也是不同的

  

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

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

  

在令牌身份验证中,服务器一旦解密,就不会发回直接用户信息,只会发送包含用户信息的令牌?

JWT令牌包含一些用户信息,但它未加密,已签名。如果您需要隐藏有效负载,JWT还允许使用JWE加密

  

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

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

答案 1 :(得分:1)

敏感信息(如密码或社会保险号等项目)不应存储在令牌中。

令牌签名的典型示例是


function createToken(user) {
  return jwt.sign(_.omit(user, 'password'), config.secret, { expiresIn: 60*60*5 });
}

在这里,我们正在创建一个包含用户详细信息的签名令牌,但我们要忘记密码。

我在这个帖子How is JSON Web Token more secure than cookie/session?

中提供了非常详细的信息

检查出来。我希望这个信息帮助!