浏览器会禁止下面的类似操作
a.com
中的 js 向b.com/api
发送了请求,根据同源策略,这样的跨域请求会向b.com
发送一个 OPTIONS 预检请求,如果服务器返回的 Access-Allow-Origins 中不包含a.com
,那么此次请求会被浏览器拒绝,a.com
中的 js 拿不到请求返回的数据。
这样的行为如果发生在本地应用程序例如 postman 中时,是可以拿到正常的请求数据的,因为 postman 没有同源策略,不会限制发送任何请求,那么为什么浏览器要对此做出限制?
网上的大部分解释是,浏览器在向某个域名发起请求时,会携带上对应的网站 cookie ,如果用户登录了b.com
,又打开了a.com
,a.com
向b.com/api
发送的请求会带上b.com
的 cookie ,会让b.com
服务器认为是用户本人在操作,导致恶意攻击的发生。
那么为什么浏览器不能分辨是哪个网站发起的请求呢?为什么浏览器不能在检测到是a.com
发出的请求时,不携带b.com
网站保存的 cookie 呢?这样不就能同样规避此类攻击吗?就如同在浏览器直接输入 api 网址那样拿到返回结果不行吗?
我的理解是,浏览器厂商不能这样做,因为许多广告厂商需要在网站中嵌入第三方 cookie ,这样才能通过第三方 cookie 来确定同一用户,方便广告投放,但是这个说法也显然站不住脚,因为如今许多浏览器厂商都在主动禁止第三方 cookie ,那么这个同源策略到底保护的是什么呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.