2016-08-11 49 views
0

我一直在试图理解会话和令牌认证之间的真正差异。会话认证是否比基于令牌的认证更安全?

我迄今收集:

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

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

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

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

我有一种感觉,我并没有真正理解令牌和会话身份验证是如何工作的。上面的陈述中肯定有错误。

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

回答

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?

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

2

你的问题还没有一个绝对的答案YES/NO。例如,会话cookie容易受到CSRF的影响,令牌可能会在XSS注入时被盗用。如果您不使用HTTPS,这两种机制也都容易受到ManInTheMiddle的影响。因此,通常每种解决方案都需要额外的安全措施。取决于你的用例。

我猜是因为你说的

在令牌认证,没有任何东西存储在服务器端你谈论像JWT令牌机制,是自包含和保护,以改变。

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

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

令牌由服务器(非客户端)发出,要求用户出示其凭据并使用服务器私钥进行数字签名。令牌包括sub索赔中的委托人标识符以及其他感兴趣的领域,例如到期时间或发行人。切勿将密码

当客户端发送到令牌身份验证,服务器验证签名,以确定真伪的没有改变

如果令牌包括用户名和密码,那么如何才能令牌每次还是不一样?

令牌不包含密码。由于某些变体索赔,如到期时间exp或发布在iat,令牌会有所不同。此外计算签名将不同

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

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

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

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

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

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

+0

“令牌由服务器(非客户端)发出,要求用户出示其凭据并使用服务器私钥进行数字签名”。是否使用相应的公钥验证签名?所以如果有人拥有私钥,如果他使用该私钥生成了令牌,他可以被认证? –

+0

如果服务器用户使用不对称密钥对(RSA),则客户端可以使用公钥来验证签名。通过简单密钥(HMAC),只有服务器可以执行验证。私钥必须保密,因为它允许生成新的有效令牌 – pedrofb