在以下假设下,OAuth 与基于 cookie 的会话(通过用户名/密码建立)有什么优势吗?
- 该服务只有一个合法客户端
- OAuth 客户端密码已泄露(因此任何人都可以发出有效请求)
- OAuth 令牌和会话具有相同的生命周期
- 两者都允许以相同的权限访问同一组资源
- 任一方案下的所有客户端-服务器通信都通过相同的协议(为了参数,HTTPS)
- 客户端和服务器由同一方控制
在以下假设下,OAuth 与基于 cookie 的会话(通过用户名/密码建立)有什么优势吗?
这要看情况...
OAuth 是一种用于创建会话的协议。OAuth 不记名令牌由客户端使用Authentication: Bearer
HTTP 标头传输。这只是一个通过 http 标头元素传输的加密随机数,实际上(几乎)与cookie
http 标头元素相同。
它有什么不同?好吧,cookie 的规则与其他标题元素略有不同。cookie 由浏览器维护,并附加到 cookie 所属的每个请求。这就是跨站点请求伪造或会话骑乘攻击起作用的原因。浏览器不关心请求来自哪里,它会根据请求的目的地附加cookie。
OAuth Bearer 令牌有点不同。这些令牌通常由客户端(JavaScript、Flash 甚至一些中间件应用程序)管理。如果您的应用程序使用 JavaScript 来管理身份验证承载令牌,那么该值将不会被浏览器自动应用,因此可以兼作 CSRF 令牌,这很整洁。
但是,如果您将 OAuth 用于中间件,则 CSRF 不会发挥作用,因此它在标头中的显示位置无关紧要。
CSRF 已经受到所有现代浏览器的保护,如果不是简单地基于目标附加 cookie,如果在将其发送到服务器之前验证允许源策略,那么在做了一些研究之后对我来说,oauth2 和基于会话的身份验证都具有相同的安全性风险,唯一的区别是正在使用的标题