我认为这里有些混乱。基于cookie的身份验证与现在使用HTML5 Web Storage所能实现的身份验证之间的显著区别在于,浏览器构建为在向设置它们的域请求资源时发送cookie数据。如果不关闭cookie,就无法阻止这种情况。浏览器不会从Web存储发送数据,除非页面中的代码发送数据。并且页面只能访问它们存储的数据,而不能访问其他页面存储的数据。 因此,用户担心他们的cookie数据可能被谷歌或Facebook使用,可能会关闭cookie。但是,他们没有太多理由关闭Web存储(除非广告商也想出了使用它的方法)。 因此,这就是基于cookie和基于令牌的区别,后者使用Web存储。
JWT vs Cookie Auth
| | Cookie | JWT |
| Stateless | No | Yes |
| Cross domain usage | No | Yes |
| Mobile ready | No | Yes |
| Performance | Low | High (no need in request to DB) |
| Add to request | Automatically | Manually (if not in cookie) |
9条答案
按热度按时间ztigrdn81#
HTTP是无状态的。为了授权您,您必须对发送给服务器的每个请求进行“签名”。
令牌身份验证
<img src="http://bank.example?withdraw=1000&to=myself" />
的链接,如果您通过cookie身份验证登录到e1d1e,而bank.example
没有任何XSRF保护手段,我将从您的帐户中取款,只需您的浏览器将触发对该url的授权GET请求即可。)请注意,基于cookie的身份验证可以采取一些防伪措施,但必须实现这些措施。foo.example
上创建的cookie不能被域e1d 4d1e读取,而您可以向任何您喜欢的域发送令牌。这对于使用多个需要授权的服务的单页应用程序特别有用,因此我可以在域myapp.example
上拥有一个web应用程序,它可以向myservice1.example
和myservice2.example
发出授权的客户端请求。Cookie身份验证
总的来说,我认为令牌给了您更好的灵活性(因为您不必绑定到单个域)。缺点是你必须自己编写一些代码。
x6h2sr282#
对于谷歌用户:
状态FULNESS
*有状态=在服务器端保存授权信息,这是传统方式
*无状态=在客户端保存授权信息,以及签名以确保完整性
机制
*Cookie=浏览器具有特殊处理(访问、存储、过期、安全、自动传输)的特殊头
*自定义头=例如
Authorization
,只是没有任何特殊处理的头,客户必须管理传输的所有方面*其他。可以使用其他传输机制,例如,查询字符串暂时是传输身份验证ID的选择,但由于其不安全性而被放弃
状态模糊度比较
hash(data + secret key)
生成的签名一起存储,其中密钥只有服务器知道,因此可以验证令牌数据的完整性机制比较
httpOnly
,从而阻止客户端JavaScript访问总和
ugmeyewa3#
典型的web应用程序大多是无状态,因为它的请求/响应性质。HTTP协议是无状态协议的最佳示例。但是,由于大多数web应用程序需要状态,为了在服务器和客户端之间保持状态,使用了cookie,以便服务器可以在每次响应中向客户端发送cookie。这意味着客户端发出的下一个请求将包含此cookie,因此服务器将识别它。这样,服务器可以与无状态客户端维护会话**,了解应用程序状态的所有信息,但存储在服务器中。在这个场景中,客户端在任何时候都不会持有状态,这不是Ember.js的工作方式。
在Ember。js的东西是不同的。ember.js使程序员的工作更容易,因为它确实为您保存了客户端中的状态,随时了解其状态,而无需向服务器请求状态数据。
然而,在客户机中保持状态有时也会带来无状态情况下根本不存在的并发问题。ember然而,js也为您处理这些问题;特别是ember数据是基于这一点构建的。总之,Ember。js是为有状态客户机设计的框架。
ember.js不像典型的无状态web应用程序那样工作,在这种应用程序中,会话、状态和相应的cookie几乎完全由服务器处理。ember.js将其状态完全保存在Javascript中(在客户端内存中,而不像其他一些框架那样保存在DOM中),并且不需要服务器来管理会话。这会产生Ember。js在许多情况下都更加通用,例如当你的应用程序处于离线模式时。
显然,出于安全原因,每次发出请求时,都需要向服务器发送某种令牌或唯一密钥,以便进行身份验证。这样,服务器可以查找发送令牌(最初由服务器发出),并在向客户端发送响应之前验证它是否有效。
在我看来,使用身份验证令牌而不是Ember Auth FAQ中所述的cookie的主要原因主要是因为Ember的性质。js框架,也因为它更适合有状态的web应用范例。因此,在构建Ember时,cookie机制并不是最好的方法。js应用程序。
我希望我的回答能使你的问题更有意义。
u0sqgete4#
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/
tv6aics15#
我认为这里有些混乱。基于cookie的身份验证与现在使用HTML5 Web Storage所能实现的身份验证之间的显著区别在于,浏览器构建为在向设置它们的域请求资源时发送cookie数据。如果不关闭cookie,就无法阻止这种情况。浏览器不会从Web存储发送数据,除非页面中的代码发送数据。并且页面只能访问它们存储的数据,而不能访问其他页面存储的数据。
因此,用户担心他们的cookie数据可能被谷歌或Facebook使用,可能会关闭cookie。但是,他们没有太多理由关闭Web存储(除非广告商也想出了使用它的方法)。
因此,这就是基于cookie和基于令牌的区别,后者使用Web存储。
57hvy0tb6#
基于令牌的身份验证是无状态的,服务器不需要在会话中存储用户信息。这使得能够扩展应用程序,而不必担心用户登录的位置。基于cookie的web Server Framework具有亲和力,而基于令牌的则没有这个问题。因此,可以使用相同的令牌从我们登录的域以外的域中获取安全资源,这样可以避免另一个uid/pwd身份验证。
这里有一篇很好的文章:
http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs
bqf10yzr7#
在以下情况下使用令牌。。。
需要联合。例如,您希望使用一个提供者(Token Dispensor)作为令牌颁发者,然后使用您的api服务器作为令牌验证器。应用程序可以向令牌分发器进行身份验证,接收令牌,然后将该令牌提供给您的api服务器进行验证。(同样适用于Google Sign-In.或Paypal.或Salesforce.com等)
需要异步。例如,您希望客户机发送一个请求,然后将该请求存储在某个地方,以便“稍后”由单独的系统执行。该单独的系统将不会与客户端同步连接,也可能不会与中央代币药房直接连接。异步处理系统可以读取JWT,以确定工作项是否可以并且应该在稍后的时间完成。这在某种程度上与上面的联邦思想有关。不过,这里要小心:JWT过期。如果持有工作项的队列在JWT的生命周期内没有得到处理,那么声明就不再可信。
需要Cient Signed请求。这里,请求由客户机使用其私钥签名,服务器将使用客户机已注册的公钥进行验证。
wn9m85ua8#
主要区别之一是cookie受同源策略的约束,而令牌则不受此约束。这会产生各种下游效果。
由于cookie仅发送到特定主机或从特定主机发送,因此主机必须承担对用户进行身份验证的责任,并且用户必须使用该主机的安全数据创建帐户,以便进行验证。
另一方面,代币是发行的,不受同源政策的约束。发行人可以是任何人,由主办方决定信任哪些发行人。像谷歌和Facebook这样的发行人通常都很受信任,因此主机可以将用户身份验证的负担(包括存储所有用户安全数据)转移给另一方,用户可以将其个人数据整合到特定的发行人下,而无需记住与之交互的每个主机的一系列不同密码。
这允许单点登录场景,以减少用户体验中的总体摩擦。理论上,随着专业身份提供者的出现,网络也变得更加安全,他们提供身份验证服务,而不是让每个ma和pa网站都建立自己的身份验证系统(可能还不够成熟)。随着这些提供商的出现,为甚至是非常基本的资源提供安全网络资源的成本也趋于零。
因此,一般来说,令牌减少了与提供身份验证相关的摩擦和成本,并将安全web各个方面的负担转移给了能够更好地实施和维护安全系统的集中方。
7gs2gvoe9#
简而言之: