我一直试图了解会话和令牌身份验证之间的真正区别。
到目前为止我收集了什么:
在令牌认证中,服务器端没有任何内容。这意味着,实际令牌包括密码和用户名,以及其他可能的信息。并且服务器只是解密令牌,然后检查用户名和密码是否正确。我对吗?如果令牌包含密码和用户名,那么每次令牌如何仍然不同?
在基于会话的身份验证中,会话令牌只是一个随机(唯一的时间)ID,映射到服务器端的用户。因此,当服务器收到session_id时(例如在cookie中),它将检查它是否映射到任何用户,如果是,则用户进行身份验证。所以session_id不包含任何可以解密的用户相关信息吗?
在会话身份验证中,服务器将在不加密的情况下发回用户相关信息(而不是密码)(除非使用https)。
在令牌身份验证中,服务器一旦解密,就不会发回直接用户信息,只会发送包含用户信息的令牌?
我感觉我还没有真正了解令牌和会话身份验证的工作原理。在上面的陈述中肯定是错的。
但是,让我们发挥这些陈述是正确的。那么基于会话的身份验证会更安全吗?因为在基于会话的身份验证中,您不会泄露用户密码(例如在浏览器中)。由于它只是一个随机ID,因此无法从中获取信息。但令牌认证不是这种情况。由于令牌认证包含密码,如果有人设法解密,他将获得您的密码。因此,会话身份验证实际上不比令牌身份验证更安全,因为它不会泄露密码或用户名信息吗?
答案 0 :(得分:3)
你的问题没有绝对答案是/否。例如,会话cookie容易受到CSRF攻击,并且可以使用XSS注入来窃取令牌。如果您不使用HTTPS,这两种机制也容易受到ManInTheMiddle的攻击。因此,每种解决方案通常都需要额外的安全措施。取决于您的用例。
我想你是在谈论像JWT这样的令牌机制,它是自包含的并且受到保护,因为你说
在令牌身份验证中,服务器端不存储任何内容。
但是你混淆了一些概念。我将尝试使用JWT令牌作为参考来回答您的其他问题。如果没有,大多数概念也可以应用于不透明的标记
在令牌身份验证中,服务器端不存储任何内容。这意味着,实际令牌包括密码和用户名,以及其他可能的信息。并且服务器只是解密令牌,然后检查用户名和密码是否正确。我对吗?
令牌由服务器(非客户端)发出,要求用户提供其凭据并使用服务器私钥进行数字签名。令牌包括sub
索赔中的委托人的标识符以及其他感兴趣的字段,如到期时间或发行者。从来没有密码
当客户端发送到令牌进行身份验证时,服务器会验证签名以确定未经更改的真实性
如果令牌包含密码和用户名,那么每次令牌如何仍然不同?
令牌不包含密码。由于某些变体声明(如过期时间exp
或iat
发出),令牌会有所不同。计算的签名也是不同的
所以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?
中提供了非常详细的信息检查出来。我希望这个信息帮助!