我正在写我的单身汉,我需要弄清楚哪种认证/授权方法最适合我与之合作的公司。
所以我一直在比较会话和基于令牌的身份验证方法,但有几点我不清楚如何使用令牌以及它们如何比会话身份验证更好:
对我来说100%明确的唯一好处是,令牌可以从没有cookie存储的客户端使用,并且可以与不同的子域和完全独立的域一起使用,因为它可以使用。没有阻止浏览器CORS策略。
最后,许多文章声称令牌可以防止CSRF。
CSRF:我们还将提供针对跨站点请求伪造(CSRF)的保护。用户容易受到CSRF攻击,因为他们已经可以通过银行网站进行身份验证,这可以在访问其他网站时利用。"
这对我来说毫无意义。他似乎在说OAuth系统会阻止CSRF吗?我不太了解CSFR的工作方式,所以可能只是我这里空白,但据我所知,会话或令牌都不能防止这种情况,因为每个请求都不是唯一的。
修改 我刚刚意识到令牌可能阻止CSFR的原因是,如果另一个站点设法通过浏览器向您的服务器提交表单,则浏览器不会自动发送它。但这意味着如果从服务器上的cookie标头中提取令牌,那么令牌很容易受到影响,如果您使用JWT,那么它应该不会成为一个问题,因为它使用它自己的授权"标头,您必须使用JS设置。 但这仍然让scotch.io文章声称对我来说听起来像废话。
答案 0 :(得分:4)
检查Cookies vs Tokens: The Definitive Guide以获取有关传统基于cookie的身份验证系统和更新的基于令牌的系统的特性的完整摘要。
TL; DR基于令牌的身份验证比以往更加重要。我们检查了cookie和基于令牌的身份验证之间的差异和相似之处,使用令牌的优势,以及解决开发人员关于基于令牌的身份验证的常见问题和疑虑。
我不是这个确切术语的忠实粉丝,因为你实际放在cookie中的东西也可以被认为是一个标记;大多数情况下,它是一个映射到某些服务器端数据的引用令牌,而所谓的基于令牌的身份验证则支持在令牌本身内携带数据的按值令牌(JWT - Learn JSON Web Tokens)。 / p>
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。
这些按值标记的验证是通过签名来完成的,该签名确保令牌是由持有签名期间使用的关联密钥的实体创建的,并且在不知道密钥的情况下内容不能被其他任何人篡改。这个前提是信任收到的令牌的基础。
关于CSRF,基于令牌的系统确实会减轻这种情况,因为与cookie相反,浏览器不会自动发送这些令牌凭证(假设令牌不是作为cookie包含在请求中。)
想象一下,应用程序CK
公开受会话cookie保护的资源,而应用程序TK
公开受令牌保护的资源。
用户X
在两个应用程序中进行身份验证,因此将为应用程序CK
和应用程序TK
的令牌发出一个会话cookie。如果攻击者创建了恶意网站EV
并诱骗用户X
访问它,则可以从用户的浏览器中对应用CK
和TK
执行自动请求。< / p>
但是,对于应用程序CK
,用户X
的浏览器将自动包含会话cookie,因此恶意网站EV
刚刚访问受保护资源,而对于应用程序请求{ {1}}浏览器不会自动包含令牌。