2

我在写我的单身汉,我需要弄清楚哪种身份验证/授权方法最适合我正在合作的公司。

所以我一直在比较基于会话和令牌的身份验证方法,但是关于令牌如何工作以及它们如何比会话身份验证更好,我还不清楚几点:

对我来说 100% 清楚的唯一好处是令牌可以从没有 cookie 存储的客户端使用,并且它们可以用于不同的子域和完全独立的域,因为它不会阻止浏览器的 CORS 策略。

  • 我读到所有 cookie 都会随每个请求一起发送到原始域(除非将 cookie 设置为仅在安全连接上发送),这意味着令牌将在请求中出现两次,除非您当然进行身份验证来自另一个域的用户。这是一个正确的假设吗?
  • 令牌如何验证服务器端?解密后,是根据用户名、密码和密钥/私钥进行检查,还是只是这里使用的密钥/私钥?
  • 如果我在为服务器上的某个资源授权它们时需要用户名/用户 ID,我没有对其进行身份验证,如果我没有原始用户数据要检查,我可以盲目地信任这些凭据吗?

最后,许多文章声称令牌可以防止 CSRF。

从这篇文章:

CSRF:我们还将提供针对跨站点请求伪造 (CSRF) 的保护。用户很容易受到 CSRF 攻击,因为他们已经可以通过银行网站进行身份验证,并且可以在访问其他网站时利用这一点。”

这对我来说完全没有意义。似乎他是在说类似 OAuth 的系统会阻止 CSRF?我不太了解CSFR的工作原理,所以这里可能只是我的空白,但据我所知,会话或令牌都不能防止这种情况,因为每个请求都不是唯一的。

编辑: 我刚刚意识到令牌可能会阻止CSFR的原因是,如果另一个站点设法从您的浏览器向您的服务器提交表单,它不会由浏览器自动发送。但这意味着如果从服务器上的 cookie 标头中提取令牌可能会受到影响,如果您使用 JWT,这应该不是问题,因为它使用它自己的“授权”标头,您必须使用 JS 设置它。但这仍然让 scotch.io 文章声称对我来说听起来像是胡说八道。

4

1 回答 1

4

检查Cookies vs Tokens: The Definitive Guide以获得关于传统的基于 cookie 的身份验证系统和更新的基于令牌的系统的特征的一个很好的总结。

TL;DR 基于令牌的身份验证比以往任何时候都更加重要。我们检查 cookie 和基于令牌的身份验证之间的差异和相似之处、使用令牌的优势,并解决开发人员对基于令牌的身份验证的常见问题和顾虑。

我不是这个确切术语的忠实拥护者,因为您实际放置在 cookie 中的内容也可以被视为令牌;大多数情况下,它是映射到某些服务器端数据的按引用令牌,而所谓的基于令牌的身份验证偏向于在令牌本身内携带数据的按值令牌(JWT -学习 JSON Web 令牌)。

JSON Web Token (JWT) 是一个开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。此信息可以验证和信任,因为它是数字签名的。

这些按值令牌的验证是通过签名来完成的,签名确保令牌是由持有在签名期间使用的关联密钥的实体创建的,并且内容不能被任何其他人在不知道密钥的情况下篡改。这个前提是信任收到的代币的基础。

关于 CSRF,基于令牌的系统确实会缓解这种情况,因为与 cookie 发生的情况相反,浏览器不会自动发送这些令牌凭据(假设令牌不作为 cookie 包含在请求中)。

Imagine the following, application CK exposes resources protected with session cookies and application TK exposes resources protected with tokens.

User X authenticates in both applications and as such will be issued a session cookie for application CK and a token for application TK. If an attacker creates an evil site EV and tricks user X into visit it, it can perform automatic requests to both application CK and TK from within the user's browser.

However, for application CK the browser of user X will automatically include the session cookie and as such evil site EV just accessed a protected resource, while for the request to application TK the browser will not include the token automatically.

于 2016-11-29T10:23:02.073 回答