令牌身份验证和使用 cookie 进行身份验证有什么区别?
我正在努力实施Ember Auth Rails 演示但我不明白使用令牌身份验证背后的原因,如Ember 验证常见问题解答关于“为什么令牌身份验证?”的问题
HTTP 是无状态的。为了授权您,您必须“签署”您发送到服务器的每个请求。
令牌认证
-
对服务器的请求由“令牌”签名 - 通常这意味着设置特定的 HTTP 标头,但是,它们可以在 HTTP 请求的任何部分(POST 正文等)中发送
-
Pros:
-
您只能授权您希望授权的请求。 (Cookie - 甚至为每个请求发送授权 Cookie。)
-
不受 XSRF 影响(XSRF 的简短示例 - 我会在电子邮件中向您发送一个链接,如下所示<img src="http://bank.example?withdraw=1000&to=myself" />
,如果您通过 cookie 身份验证登录bank.example
, and bank.example
没有任何 XSRF 保护手段,我会通过您的浏览器触发对该 URL 的授权 GET 请求来从您的帐户中提取资金。)请注意,您可以使用基于 cookie 的身份验证来执行防伪造措施- 但你必须实施这些。
-
Cookie 绑定到单个域。在域上创建的 cookiefoo.example
域无法读取bar.example
,同时您可以将令牌发送到您喜欢的任何域。这对于使用需要授权的多个服务的单页应用程序特别有用 - 这样我就可以在域上拥有一个 Web 应用程序myapp.example
可以发出授权的客户端请求myservice1.example
and to myservice2.example
.
-
Cons:
- 你必须将令牌存储在某个地方;而 cookie 则是“开箱即用”存储的。我想到的位置是 localStorage (缺点:即使关闭浏览器窗口后令牌也会保留)、sessionStorage (优点:关闭浏览器窗口后令牌将被丢弃,缺点:在新选项卡中打开链接将呈现该选项卡匿名)和 cookie(优点:关闭浏览器窗口后,令牌将被丢弃。如果您使用会话 cookie,您将在新选项卡中打开链接时进行身份验证,并且您不会受到 XSRF 的影响,因为您忽略了cookie 用于身份验证,您只是将其用作令牌存储。缺点:每次请求都会发送 cookie。如果此 cookie 未标记为仅限 https,则您很容易受到中间人攻击。)
-
针对基于令牌的身份验证进行 XSS 攻击稍微容易一些(即,如果我能够在您的网站上运行注入的脚本,我就可以窃取您的令牌;但是,基于 cookie 的身份验证也不是灵丹妙药 - 而 cookie 标记为http-only 客户端无法读取,客户端仍然可以代表您发出请求,该请求将自动包含授权 cookie。)
-
下载文件的请求(该文件应该仅适用于授权用户)需要您使用文件 API。对于基于 cookie 的身份验证,相同的请求开箱即用。
Cookie认证
- 对服务器的请求始终通过授权 cookie 进行签名。
- Pros:
- Cookie 可以标记为“仅 http”,这使得它们无法在客户端读取。这对于 XSS 攻击防护效果更好。
- 开箱即用 - 您无需在客户端实现任何代码。
- Cons:
- 绑定到单个域。 (因此,如果您有一个向多个服务发出请求的单页应用程序,您最终可能会做一些疯狂的事情,例如反向代理。)
- 容易受到 XSRF 的影响。您必须实施额外的措施来保护您的站点免受跨站点请求伪造。
- 针对每个请求发送(即使对于不需要身份验证的请求)。
总的来说,我认为令牌可以为您提供更好的灵活性(因为您不受单个域的约束)。缺点是你必须自己做一些编码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)