session 和基于令牌的身份验证之间的技术差异
Technical difference between session and token based auth
我正在写我的单身汉,我需要弄清楚哪种 authentication/authorization 方法最适合我正在合作的公司。
所以我一直在比较 session 和基于令牌的身份验证方法,但是关于令牌如何工作以及它们如何优于 session 身份验证,有几点我不清楚:
我 100% 清楚的唯一好处是令牌可以从没有 cookie 存储的客户端使用,并且它们可以用于不同的子域和完全独立的域,因为它不会阻止浏览器 CORS 策略。
- 我读到所有 cookie 都随每个请求发送到原始域(除非 cookie 设置为仅在安全连接上发送),这意味着令牌将在请求中出现两次,当然,除非您对来自另一个域的用户进行身份验证。这是一个正确的假设吗?
- 服务器端如何验证令牌?解密后,是否根据用户名、密码和 secret/private 密钥进行检查,还是只检查此处使用的 secret/private 密钥?
- 如果我需要 username/userID 在授权他们使用服务器上的某个资源时我没有对他们进行身份验证,如果我没有要检查的原始用户数据,我是否可以盲目信任这些凭据?
最后,许多文章声称令牌可以防止 CSRF。
CSRF: We will also have protection against cross-site request forgery (CSRF). Users are susceptible to CSRF attacks since they can already be authenticated with say a banking site and this could be taken advantage of when visiting other sites."
这对我来说完全没有意义。好像他在说类似 OAuth 的系统可以防止 CSRF?我不太了解 CSFR 的工作原理,所以这里可能只有我一个人是空白的,但据我所知,sessions 或令牌都不能防止这种情况发生,因为每个请求都不是唯一的。
编辑:
我刚刚意识到令牌可能阻止 CSFR 的原因是,如果另一个站点设法从您的浏览器向您的服务器提交表单,它不会由浏览器自动发送。但这意味着如果从服务器上的 cookie header 中提取令牌可能会受到影响,如果您使用 JWT 应该不会有问题,因为它使用它自己的“授权”header,您必须使用JS。
但这仍然让 scotch.io 文章声称对我来说听起来像是胡说八道。
检查 Cookies vs Tokens: The Definitive Guide 以获得关于传统基于 cookie 的身份验证系统和更新的基于令牌的系统的特征的良好总结。
TL;DR Tokens-based authentication is more relevant than ever. We examine the differences and similarities between cookie and token-based authentication, advantages of using tokens, and address common questions and concerns developers have regarding token-based auth.
我不太喜欢这个确切的术语,因为您实际放置在 cookie 中的内容也可以被视为令牌;大多数时候,它是一个映射到某些服务器端数据的引用令牌,而所谓的基于令牌的身份验证则支持在令牌本身内携带数据的按值令牌(JWT - Learn JSON Web Tokens)。
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed.
这些按值令牌的验证是通过签名完成的,签名确保令牌是由持有签名期间使用的关联密钥的实体创建的,并且内容不能被不知道密钥的任何其他人篡改。这个前提是信任收到的代币的基础。
关于 CSRF,基于令牌的系统确实会缓解这种情况,因为与 cookie 发生的情况相反,浏览器不会自动发送这些令牌凭据 (假设令牌不作为 cookie 包含在请求中)。
想象一下,应用程序 CK
公开受会话 cookie 保护的资源,应用程序 TK
公开受令牌保护的资源。
用户 X
在两个应用程序中进行身份验证,因此将获得应用程序 CK
的会话 cookie 和应用程序 TK
的令牌。如果攻击者创建了一个恶意站点 EV
并诱使用户 X
访问它,它可以从用户的浏览器中对应用程序 CK
和 TK
执行自动请求。
然而,对于应用程序 CK
,用户 X
的浏览器将自动包含会话 cookie,因此邪恶站点 EV
只是访问受保护的资源,而对于请求应用程序 TK
浏览器不会自动包含令牌。
我正在写我的单身汉,我需要弄清楚哪种 authentication/authorization 方法最适合我正在合作的公司。
所以我一直在比较 session 和基于令牌的身份验证方法,但是关于令牌如何工作以及它们如何优于 session 身份验证,有几点我不清楚:
我 100% 清楚的唯一好处是令牌可以从没有 cookie 存储的客户端使用,并且它们可以用于不同的子域和完全独立的域,因为它不会阻止浏览器 CORS 策略。
- 我读到所有 cookie 都随每个请求发送到原始域(除非 cookie 设置为仅在安全连接上发送),这意味着令牌将在请求中出现两次,当然,除非您对来自另一个域的用户进行身份验证。这是一个正确的假设吗?
- 服务器端如何验证令牌?解密后,是否根据用户名、密码和 secret/private 密钥进行检查,还是只检查此处使用的 secret/private 密钥?
- 如果我需要 username/userID 在授权他们使用服务器上的某个资源时我没有对他们进行身份验证,如果我没有要检查的原始用户数据,我是否可以盲目信任这些凭据?
最后,许多文章声称令牌可以防止 CSRF。
CSRF: We will also have protection against cross-site request forgery (CSRF). Users are susceptible to CSRF attacks since they can already be authenticated with say a banking site and this could be taken advantage of when visiting other sites."
这对我来说完全没有意义。好像他在说类似 OAuth 的系统可以防止 CSRF?我不太了解 CSFR 的工作原理,所以这里可能只有我一个人是空白的,但据我所知,sessions 或令牌都不能防止这种情况发生,因为每个请求都不是唯一的。
编辑: 我刚刚意识到令牌可能阻止 CSFR 的原因是,如果另一个站点设法从您的浏览器向您的服务器提交表单,它不会由浏览器自动发送。但这意味着如果从服务器上的 cookie header 中提取令牌可能会受到影响,如果您使用 JWT 应该不会有问题,因为它使用它自己的“授权”header,您必须使用JS。 但这仍然让 scotch.io 文章声称对我来说听起来像是胡说八道。
检查 Cookies vs Tokens: The Definitive Guide 以获得关于传统基于 cookie 的身份验证系统和更新的基于令牌的系统的特征的良好总结。
TL;DR Tokens-based authentication is more relevant than ever. We examine the differences and similarities between cookie and token-based authentication, advantages of using tokens, and address common questions and concerns developers have regarding token-based auth.
我不太喜欢这个确切的术语,因为您实际放置在 cookie 中的内容也可以被视为令牌;大多数时候,它是一个映射到某些服务器端数据的引用令牌,而所谓的基于令牌的身份验证则支持在令牌本身内携带数据的按值令牌(JWT - Learn JSON Web Tokens)。
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed.
这些按值令牌的验证是通过签名完成的,签名确保令牌是由持有签名期间使用的关联密钥的实体创建的,并且内容不能被不知道密钥的任何其他人篡改。这个前提是信任收到的代币的基础。
关于 CSRF,基于令牌的系统确实会缓解这种情况,因为与 cookie 发生的情况相反,浏览器不会自动发送这些令牌凭据 (假设令牌不作为 cookie 包含在请求中)。
想象一下,应用程序 CK
公开受会话 cookie 保护的资源,应用程序 TK
公开受令牌保护的资源。
用户 X
在两个应用程序中进行身份验证,因此将获得应用程序 CK
的会话 cookie 和应用程序 TK
的令牌。如果攻击者创建了一个恶意站点 EV
并诱使用户 X
访问它,它可以从用户的浏览器中对应用程序 CK
和 TK
执行自动请求。
然而,对于应用程序 CK
,用户 X
的浏览器将自动包含会话 cookie,因此邪恶站点 EV
只是访问受保护的资源,而对于请求应用程序 TK
浏览器不会自动包含令牌。