令牌认证和使用cookie的认证有什么区别?
我正在尝试实现Ember Auth Rails演示,但我不理解使用Ember Auth FAQ中关于“为什么token身份验证?”的问题所描述的令牌身份验证背后的原因。
令牌认证和使用cookie的认证有什么区别?
我正在尝试实现Ember Auth Rails演示,但我不理解使用Ember Auth FAQ中关于“为什么token身份验证?”的问题所描述的令牌身份验证背后的原因。
当前回答
Tokens need to be stored somewhere (local/session storage or cookies) Tokens can expire like cookies, but you have more control Local/session storage won't work across domains, use a marker cookie Preflight requests will be sent on each CORS request When you need to stream something, use the token to get a signed request It's easier to deal with XSS than XSRF The token gets sent on every request, watch out its size If you store confidential info, encrypt the token JSON Web Tokens can be used in OAuth Tokens are not silver bullets, think about your authorization use cases carefully
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依赖于您与另一端存储您已登录事实的数据库共享的个人秘密。这里没有什么特别的东西,只是一个密码短语来识别您的会话,尽管细节可能有所不同。
认证令牌使用奇特的加密技术来消除对存储登录状态的数据库的需求,方法是通过给定提供者的签名发布一个文档,其中包含允许您在哪个日期之前做什么。
打个比方,cookie就像一张会员卡,检查它的前台必须打电话或查询数据库来检查你是否是会员。而认证令牌就像一张有签名和到期日期的支票。然后,安全性来自于基于难以伪造的假设的签名,而无需直接询问发行者。
在这两种情况下,它们都处理授权,而不是身份验证。任何持有会员卡或支票的人都可以获得访问权,它们不能证明你是谁,只是证明你有权使用你要求的资源。正因为如此,它们必须小心防范盗窃,这对于更难撤销的认证令牌来说尤其如此。
一个主要的区别是cookie服从同源策略,而令牌则不是。这就产生了各种各样的下游效应。
由于cookie只发送给特定的主机,该主机必须承担验证用户身份的责任,用户必须在该主机上创建一个具有安全数据的帐户,以便进行验证。
Tokens on the other hand are issued and are not subject to same origin policy. The issuer can be literally anybody and it is up to the host to decide which issuers to trust. An issuer like Google and Facebook is typically well trusted so a host can shift the burden of authenticating the user (including storing all user security data) to another party and the user can consolidate their personal data under a specific issuer and not have to remember a bunch of different passwords for each host they interact with.
这允许单点登录场景,从而减少用户体验中的整体摩擦。从理论上讲,网络也变得更加安全,因为专门的身份提供者出现了,提供认证服务,而不是每个ma和pa网站都有自己的,可能不成熟的认证系统。随着这些提供商的出现,为非常基本的资源提供安全网络资源的成本也趋向于零。
因此,总的来说,令牌减少了与提供身份验证相关的摩擦和成本,并将安全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) |
基于令牌的认证是无状态的,服务器不需要在会话中存储用户信息。这样就可以扩展应用程序,而不用担心用户已经登录到哪里。有web服务器框架的亲缘性基于cookie,而这不是一个问题,基于令牌。因此,可以使用相同的令牌从我们登录的域以外的域获取安全资源,从而避免了另一个uid/pwd身份验证。
非常好的文章:
http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs
HTTP无状态。为了授权你,你必须“签署”你发送到服务器的每一个请求。
令牌验证
A request to the server is signed by a "token" - usually it means setting specific HTTP headers, however, they can be sent in any part of the HTTP request (POST body, etc.) Pros: You can authorize only the requests you wish to authorize. (Cookies - even the authorization cookie are sent for every single request.) Immune to XSRF (Short example of XSRF - I'll send you a link in email that will look like <img src="http://bank.example?withdraw=1000&to=myself" />, and if you're logged in via cookie authentication to bank.example, and bank.example doesn't have any means of XSRF protection, I'll withdraw money from your account simply by the fact that your browser will trigger an authorized GET request to that url.) Note there are anti forgery measure you can do with cookie-based authentication - but you have to implement those. Cookies are bound to a single domain. A cookie created on the domain foo.example can't be read by the domain bar.example, while you can send tokens to any domain you like. This is especially useful for single page applications that are consuming multiple services that are requiring authorization - so I can have a web app on the domain myapp.example that can make authorized client-side requests to myservice1.example and to myservice2.example. Cons: You have to store the token somewhere; while cookies are stored "out of the box". The locations that comes to mind are localStorage (con: the token is persisted even after you close browser window), sessionStorage (pro: the token is discarded after you close browser window, con: opening a link in a new tab will render that tab anonymous) and cookies (Pro: the token is discarded after you close the browser window. If you use a session cookie you will be authenticated when opening a link in a new tab, and you're immune to XSRF since you're ignoring the cookie for authentication, you're just using it as token storage. Con: cookies are sent out for every single request. If this cookie is not marked as https only, you're open to man in the middle attacks.) It is slightly easier to do XSS attack against token based authentication (i.e. if I'm able to run an injected script on your site, I can steal your token; however, cookie based authentication is not a silver bullet either - while cookies marked as http-only can't be read by the client, the client can still make requests on your behalf that will automatically include the authorization cookie.) Requests to download a file, which is supposed to work only for authorized users, requires you to use File API. The same request works out of the box for cookie-based authentication.
Cookie验证
A request to the server is always signed in by authorization cookie. Pros: Cookies can be marked as "http-only" which makes them impossible to be read on the client side. This is better for XSS-attack protection. Comes out of the box - you don't have to implement any code on the client side. Cons: Bound to a single domain. (So if you have a single page application that makes requests to multiple services, you can end up doing crazy stuff like a reverse proxy.) Vulnerable to XSRF. You have to implement extra measures to make your site protected against cross site request forgery. Are sent out for every single request, (even for requests that don't require authentication).
总的来说,我认为令牌给了您更好的灵活性(因为您不局限于单个域)。缺点是你必须自己编写一些代码。