令牌authentication与Cookie
令牌authentication和使用cookie的authentication有什么区别?
我试图实施Ember Auth Rails演示,但是我不明白在Ember Auth常见问题解答中对“为什么使用令牌authentication?”中所述使用令牌authentication背后的原因。
一个典型的wep应用程序大多是无状态的 ,因为它的请求/响应性质。 HTTP协议是无状态协议的最好例子。 但是由于大多数networking应用程序都需要状态 ,为了保持服务器和客户端之间的状态 ,使用了cookie,服务器可以将每个响应发送回客户端。 这意味着从客户端发出的下一个请求将包含这个cookie,并因此被服务器识别。 通过这种方式,服务器可以维护与无状态客户端的会话 ,主要了解应用程序状态的所有内容,但存储在服务器中。 在这种情况下,客户端暂时保持状态 ,这不是Ember.js的工作方式。
在Ember.js的事情是不同的。 Ember.js使得程序员的工作变得更加简单,因为它在客户端拥有确实的状态 ,无需向服务器请求状态数据就可以随时了解状态 。
但是,在客户端持有状态有时也会引入并发问题,这些问题在无状态情况下根本不存在。 然而,Ember.js也会为你处理这个问题,尤其是用这个方法构build的烬数据。 总之,Ember.js是一个为有状态客户devise的框架。
Ember.js不像一个典型的无状态 web应用程序,其中会话 , 状态和相应的cookie几乎完全由服务器处理。 Ember.js认为它完全在javascript中(在客户端的内存中,而不像其他框架那样在DOM中),并且不需要服务器来pipe理会话。 这会导致Ember.js在许多情况下更具多function性,例如当您的应用程序处于离线模式时。
显然,出于安全原因,每次请求进行身份validation时 ,都需要某种令牌或唯一密钥发送给服务器,这样服务器就可以查找发送令牌(最初由服务器发出)以及在将响应发送回客户端之前validation它是否有效。
在我看来,如Ember Auth FAQ中所述,使用身份validation令牌而不是cookies的主要原因主要是由于Ember.js框架的本质,也因为它更符合有状态的 Web应用程序范例。 因此,在构buildEmber.js应用程序时,Cookie机制不是最好的方法。
我希望我的回答能给你的问题更多的意义。
Http是无状态的,为了授权你,你必须“签名”你发送给服务器的每个请求。
令牌authentication
-
对服务器的请求是通过“token”来签名的 – 通常这意味着设置特定的http头,然而它们可以发送到http请求的任何部分(POST body等)
-
优点:
- 您只能授权您希望授权的请求(cookie – 即使是每个请求都会发送授权cookie)
- 免疫XSRF(XSRF的简短例子 – 我会给你发一封电子邮件的链接,看起来像
<img src="http://bank.com?withdraw=1000&to=myself" />
,如果你已经login通过cookieauthenticationbank.com和bank.com没有任何XSRF保护手段我会从您的帐户提款,只是由于您的浏览器将触发授权的请求到该url)。 请注意,您可以使用基于cookie的身份validation进行防伪措施,但必须实施这些措施。 - Cookie被绑定到单个域。 域foo.com上创build的Cookie不能被域bar.com读取,而您可以将令牌发送到您喜欢的任何域。 这对消耗多个需要授权的服务的单页应用程序特别有用 – 所以我可以在域myapp.com上有可以向myservice1.com和myservice2.com授权的客户端请求的web应用程序。
- 缺点:
- 您必须在某处存储令牌; 虽然cookie是“开箱即用”存储的,但是想到的位置是localStorage(con:即使在closures浏览器窗口后仍然存在该标记),sessionStorage(pro:closures浏览器窗口后标记被丢弃,con:打开新的标签(按Ctrl +单击)将呈现该选项卡匿名)和cookies(亲:在closures浏览器窗口后(即如果您将使用会话cookie)放弃令牌,您将通过ctrl +点击,你不受XSRF的限制,因为你忽略了cookie来进行身份validation,你只是把它当作标记存储来使用,con:如果这个cookie没有被标记为https,中间人攻击)
- 对基于令牌的身份validation进行XSS攻击会稍微容易一些(即,如果我能够在您的站点上运行注入的脚本,我可以偷走您的令牌;但是,基于Cookie的身份validation不是一个silverlight的子弹 – 而Cookie标记为仅限http不能被客户读取,客户仍然可以代表你的请求,自动包括授权cookie)
- 请求下载一个文件,这应该只适用于授权用户需要您使用File API,相同的请求开箱即用的基于cookie的身份validation
Cookieauthentication
- 对服务器的请求始终由授权cookielogin
- 优点:
- Cookie可以被标记为“http-only”,这使得它们在客户端不可能被读取,这对于XSS攻击保护
- 开箱即用 – 您不必在客户端执行任何代码
- 缺点:
- 绑定到单个域(所以如果你有一个单一的页面应用程序,请求多个服务,你可以做最后的疯狂的东西,如反向代理)
- 易受XSRF影响,您必须采取额外的措施,使您的网站免受跨网站请求伪造
- 发送每一个请求(即使对于不需要authentication的请求)
总体而言,我会说令牌给你更好的灵活性(你不必绑定到单个域),缺点是你必须自己做一些编码。
-
令牌需要存储在某个地方(本地/会话存储或cookie)
-
令牌可以像Cookie一样过期,但是您拥有更多的控制权
-
本地/会话存储不能跨域使用,使用标记cookie
-
预检请求将在每个CORS请求上发送
-
当您需要stream式传输某些内容时,请使用该令牌来获取已签名的请求
-
处理XSS比XSRF更容易
-
令牌会在每个请求中发送,请注意其大小
-
如果您存储机密信息,请encryption令牌
-
JSON Web令牌可以在OAuth中使用
-
标记不是银弹,仔细想想你的授权用例
http://blog.auth0.com/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/
http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/
我相信这里有一些困惑。 基于cookie的身份validation与HTML5 Web存储现在可以实现的显着区别在于,浏览器只要从设置域的设备上请求资源,就可以发送cookie数据。 你不能阻止,而不关掉cookies。 除非页面中的代码发送,否则浏览器不会从Web存储发送数据 。 页面只能访问他们存储的数据,而不能访问其他页面存储的数据。
因此,用户担心Google或Facebook可能会使用Cookie数据的方式可能会closuresCookie。 但是,他们没有理由closuresnetworking存储(直到广告客户也想用这种方式)。
所以,这是基于cookie和基于令牌的区别,后者使用Web存储。
基于令牌的authentication是无状态的,服务器不需要在会话中存储用户信息。 这样可以扩展应用程序,而不必担心用户login的位置。Web服务器框架具有基于cookie的亲和力,而基于令牌的问题则不是这样。 因此,同样的标记可以用来从除了我们login的域之外的域中获取安全资源,这避免了另一个uid / pwdauthentication。
非常好的文章在这里:
- validation从移动(iPhone)应用程序到ASP.Net Web API的请求(请在我的devise中提供反馈)
- Sinatra – API – 身份validation
- 通过在Java中使用filtervalidation用户名和密码(与数据库联系)
- Google OAuth 2授权 – 错误:redirect_uri_mismatch
- 什么是基于令牌的authentication?
- Android Firebase DynamiteModule:无法加载模块描述符
- AllowAnonymous不能使用Custom AuthorizationAttribute
- RoRdevise:用用户名或电子邮件login
- jenkins – j_acegi_security_check