[英]Is session authentication more secure than token-based authentication?
我一直在尝试了解会话身份验证和令牌身份验证之间的真正区别。
到目前为止,我收集了以下内容:
在令牌认证中,服务器端不存储任何内容。 这意味着实际的令牌包括密码和用户名以及其他可能的信息。 然后服务器仅解密令牌,然后检查用户名和密码是否正确。 我对吗? 如果令牌包含密码和用户名,那么令牌又如何每次都不同?
在基于会话的身份验证中,会话令牌只是一个随机(时间上唯一)的id,它映射到服务器端的用户。 这样,当服务器收到session_id(例如,在cookie中)时,它将检查它是否映射到任何用户,如果是,则对用户进行身份验证。 因此,session_id不包含任何与用户相关的信息,可以解密吗?
在会话身份验证中,服务器将不加密地发送回用户相关信息(不是密码)(除非使用https)。
在令牌身份验证中,服务器将不会发送直接的用户信息,而仅将包含用户信息的令牌解密后发送回去?
我觉得我还不太了解令牌和会话身份验证的工作原理。 上面的陈述中肯定有错误。
但是,让我们继续进行下去,使这些陈述是正确的。 那么基于会话的身份验证会更安全吗? 因为在基于会话的身份验证中,您不会显示用户密码(例如在浏览器中)。 由于它只是一个随机ID,因此无法从中获取信息。 但这不是令牌认证的情况。 由于令牌身份验证包含密码,因此如果有人设法对其进行解密,他将获得您的密码。 那么,会话身份验证实际上不比令牌身份验证更安全,因为它不显示密码或用户名信息吗?
您的问题不是绝对答案是/否。 例如,会话cookie容易受到CSRF的攻击,并且令牌可能会因XSS注入而被盗。 如果您不使用HTTPS,则这两种机制也容易受到ManInTheMiddle的攻击。 因此,通常每个解决方案都需要采取额外的安全措施。 取决于您的用例。
我猜您在谈论一种像JWT这样的令牌机制,该机制是独立的,可以进行更改,因为您说过
在令牌认证中,服务器端不存储任何内容。
但是您会混淆一些概念。 我将尝试使用JWT令牌作为参考来回答您的其他问题。 如果没有,大多数概念也可以应用于不透明令牌
在令牌认证中,服务器端不存储任何内容。 这意味着实际的令牌包括密码和用户名以及其他可能的信息。 然后服务器仅解密令牌,然后检查用户名和密码是否正确。 我对吗?
令牌是由服务器(不是客户端)发行的,要求用户出示其凭据并用服务器私钥进行数字签名。 令牌包括sub
权利要求中的主体的标识符以及其他感兴趣的字段,例如到期时间或发行者。 永远不要输入密码
当客户端发送给令牌进行身份验证时,服务器会验证签名以确定真实性是否已更改
如果令牌包含密码和用户名,那么令牌又如何每次都不同?
令牌不包含密码。 由于一些不同的声明(例如到期时间exp
或在iat
发行),令牌将有所不同。 此外,计算出的签名将有所不同
因此,session_id不包含任何与用户相关的信息,可以解密吗?
是的,这是一个随机的序列。 与用户服务器的关系存储在服务器上
在令牌身份验证中,服务器将不会发送直接的用户信息,而仅将包含用户信息的令牌解密后发送回去?
JWT令牌包含一些用户信息,但未加密,已签名。 如果需要隐藏有效载荷,JWT还允许使用JWE加密
但是,让我们继续进行下去,使这些陈述是正确的。 那么基于会话的身份验证会更安全吗? 因为在基于会话的身份验证中,您不会显示用户密码(例如在浏览器中)。 由于它只是一个随机ID,因此无法从中获取信息。 但这不是令牌认证的情况。 由于令牌身份验证包含密码,因此如果有人设法对其进行解密,他将获得您的密码。 那么,会话身份验证实际上不比令牌身份验证更安全,因为它不显示密码或用户名信息吗?
基本方法是错误的。 密码永远不会包含在令牌中 。 如果您不想泄露用户数据,则可以使用不透明令牌或通过JWT进行JWE加密。 正确的解决方案取决于您的用例。 见我的第一段
诸如密码之类的敏感信息或诸如社会安全号码之类的项目不应存储在令牌中。
令牌签名的典型示例是
function createToken(user) { return jwt.sign(_.omit(user, 'password'), config.secret, { expiresIn: 60*60*5 }); }
在这里,我们将使用用户的详细信息创建一个已签名的令牌,但是我们省略了密码。
我在此线程中对此提供了非常详细的信息。JSON Web令牌比cookie /会话更安全吗?
看看这个。 我希望这个信息帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.