什么是CORS?
CORS(Cross-Origin Resource Sharing ) 全称“跨域资源共享”,它允许浏览器向跨站服务器发送XHR请求。CORS的出现,使得网站开发者可对受信任的站点(域名)绕过浏览器同源策略的限制,提供了极大的灵活性。
什么是同源策略
出于安全的考虑,浏览器通过XHR向服务器发送请求时,必须遵循同源策略。所谓“同源”,是指【域名】,【协议】,【端口】相同。
如果没有同源策略
在解释同源策略为什么很重要之前,我们先讨论另外一个问题:为什么前端使用cookie校验登录态,而客户端使用URL中的token?
我见过最多的回答是:浏览器已经实现了cookie的整一套机制,没必要再用token那一套,而客户端要自己实现一套cookie机制太麻烦了。
上面的回答对吗?我认为太表象了,只回答了果,而非因。为什么浏览器要采用cookie机制实现登陆校验,才是问题的关键。
我认为造成两者差异的其中一个关键点在于:客户端的url,是不可见的,而浏览器是可见的。cookie(token)是用户登录的生命线,试想下http://www.jianshu.com/index.php?token={secret_token}
是多么美丽的画面。
如果我们继续深入思考下去,能找到更多的原因,只是本篇重点不在此,不再赘述。
通过上面的说明,我们明白了cookie是网站登录的前提,是时候回答【如果没有同源策略】的危害了。
假如你的浏览器同时开了两个tab: A 和 B。A登录了qq.com
,如果浏览器没有同源策略限制,B此时就可以不断向qq的服务器发送跨域请求(获取用户资料、消费Q币、发表QQ空间、删除好友等等)。你说B没有qq.com
的登陆信息,不能做到?那我建议你再好好复习一遍cookie机制。
同源策略也带来不便
假设你有3个域名:a.example.com
| b.example.com
| c.example.com
, 三个都是你的服务,但彼此间无法跨域请求,作为网站管理端,怎一个“蛋疼”了得?
讲到这里,又要插一句题外话了,在CORS出现之前,站点间是怎样跨域通信的?没错,就是大名鼎鼎的JSONP。JSONP你听过,但使用该技术需要防范CSRF攻击你了解过吗?这个话题我们下次再聊。
篇幅太长,就此打住,下一篇我们再具体讲解服务端CORS怎样配置。