authentication - 为什么在CORS/跨域场景下基于token的认证优于基于cookie的认证?

标签 authentication cookies cors token jwt

我看过in many places token-based authentication 的好处之一在 cookie-based authentication它是否更适合 CORS/跨域场景。

但为什么呢?

这里是 a CORS scenario :

An HTML page served from http://domain-a.com makes an <img> src request for http://domain-b.com/image.jpg.

即使我的机器上有一个 token ,仅仅 <img> 怎么可能?标签知道在哪里找到并发送它?

并根据here ,建议把JWT存储为cookie,那怎么能在CORS/跨域场景下存活呢?

添加 1

基于 token 的身份验证比 session cookie 身份验证更容易扩展。在此处查看相关主题:Stateless web application, an urban legend?

最佳答案

澄清一下:对您拥有的任何子域的请求也被视为跨源请求(例如,您从 www.example.com 向 api.example.com 发出请求)。

一个简单的<img>对另一个源的 GET 请求实际上也是跨源请求,但是如果您仅使用 GET、HEAD、POST 请求,并且您的 Content-Type header 是以下之一,则浏览器不会使用预检 (OPTION) 请求:

  • 应用程序/x-www-form-urlencoded
  • 多部分/表单数据
  • 文本/纯文本

因此很简单 <img>对另一个来源的请求不会有问题(无论是子域还是完全另一个域),因为它不会通过预检,除非它需要凭据,因为当您添加 Authorization header 时,请求需要通过预检。

关于存储在 localstorage 和 cookie 中:Localstorage 具有单源策略,这意味着您无法访问您从子域存储的数据,即 example.com 无法访问 api.example.com 的 localstorage 中的数据。另一方面,使用 cookie,您可以定义哪些子域可以访问 cookie。因此,您可以访问存储在 cookie 中的 token ,并将其与您的请求一起发送到服务器。 Cookie 也不允许跨域访问数据。

希望这对您有所帮助。

关于authentication - 为什么在CORS/跨域场景下基于token的认证优于基于cookie的认证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34650198/

相关文章:

android - 如何让 Rails 告诉移动应用程序用户是否登录?

laravel - 从其他 Laravel 自动登录/验证 Laravel

authentication - 带有 Google 身份验证的 Keycloak - 无效的用户名或密码

node.js - API 不会使用 MSAL 从 SPA 传递的 token 针对 AAD 进行身份验证

python-3.x - 如何使用 python 和 selenium 从检查 session 和 cookie 的 URL 下载 PDF?

php - 如果 cookie 设置为同一域上的所有子域,则删​​除 cookie 不起作用

javascript - 当网页存储在计算机上时,cookie 是否有效?

jquery - 仅限 Chrome 中的超慢预检选项

javascript - Yii2:如何在非 restful API 上允许 CORS

vue.js - 从源访问 XMLHttpRequest 已被 CORS 策略阻止(Vue.JS 应用程序调用 Lumen 应用程序)