会话身份验证是否比基于令牌的身份验证更安全



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

我收集到的信息:

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

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

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

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

我有一种感觉,我还没有真正理解令牌和会话认证是如何工作的。上面的陈述肯定有问题。

但是,让我们假设语句是正确的。那么基于会话的身份验证不是更安全吗?因为在基于会话的身份验证中,您不会显示用户密码(例如在浏览器中)。因为它只是一个随机的id,所以不能从中获取信息。但令牌身份验证不是这种情况。由于令牌认证包含密码,如果有人设法解密它,他将获得您的密码。那么,会话身份验证是否比令牌身份验证更安全,因为它不会泄露密码或用户名信息?

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

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

在令牌身份验证中,没有任何东西存储在服务器端。

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

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

令牌由服务器(而不是客户端)发出,要求用户提供凭据并使用服务器私钥进行数字签名。令牌包括sub声明中主体的标识符和其他感兴趣的字段,如过期时间或发行者。永远不要输入密码

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

如果令牌包含了密码和用户名,那么为什么每次令牌都不一样呢?

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

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

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

在令牌认证中,一旦解密,服务器将不返回直接的用户信息,而只返回包含用户信息的令牌。

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

但是,让我们假设语句是正确的。那么基于会话的身份验证不是更安全吗?因为在基于会话的身份验证中,您不会显示用户密码(例如在浏览器中)。因为它只是一个随机的id,所以不能从中获取信息。但令牌身份验证不是这种情况。由于令牌认证包含密码,如果有人设法解密它,他将获得您的密码。那么,会话身份验证是否比令牌身份验证更安全,因为它不会泄露密码或用户名信息?

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

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

令牌签名的典型示例如下

<>之前createToken(用户){返回jwt.sign(_。省略(user, 'password'), config。{expiresIn: 60*60*5});}之前

在这里,我们创建了一个带有用户详细信息的签名令牌,但是我们省略了密码。

我在这个线程中给出了一个非常详细的信息,JSON Web令牌如何比cookie/session更安全?

看看。我希望这些信息对你有帮助!

最新更新