跨域问题的理解


什么是跨域问题?

跨域问题指的是,在一个域名下向另一个域名发起请求试图获取数据或者页面DOM元素,浏览器是不允许的,因为你跨了不同的域名。但确确实实我们又想要向另一个域名发送请求获取数据,这时候我们就遇到了所谓的跨域问题。

为什么会有跨域问题?

跨域问题的出现是因为浏览器的同源策略,同源策略限制了不同域名之间是不允许访问的。注意这个限制是浏览器限制的,或者说是浏览器的内核限制的,脱离的这个限定是不会出现跨域问题的,因为不受同源策略的限制。这也就是为什么后端服务可以使用Http工具发起http请求而不会遇到所谓的跨域问题的原因。

为什么会有同源策略?

浏览器一开始并没有对不用域名之间的相会调用有任何限制,直到有人利用这个漏洞发明了跨站请求伪造获取了大量的用户信息。各大浏览器厂商才开始关注,所以 Netspace公司最先提出并应用了同源策略到浏览器上,至此之后所有的浏览器都不允许不同域名之间的相互调用了。

什么是跨站请求伪造?

在没有同源策略限制的时代,在一个域名下想另一个域名发送请求的时候会带上目标域名的cookie并返回结果,这样在当前域名下就可以获取到另一个域名请求的所有数据,包括该域名下的cookie,返回结果,页面DOM等等。你会说这样不是挺好的么,但是试想一下如果别有用心之人利用这个漏洞获取了你登录银行的cookie,你就该后悔了。

跨站请求伪造是怎么做的?

我们知道一般浏览器会保留一个叫做cookie的东西,cookie的发明是源于http协议无状态的特性发明的。cookie这个东西有一个特点,就是存储在浏览器当前所在电脑本地,并且每次访问当前cookie对应的域名的时候都会携带过去。因此当你在一个域名下向另一个域名发送请求的时候,浏览器会自动携带上另一个域名的cookie然后发送到对应的服务器。这样当你登陆你的银行页面之后然后还没有登出,当你在访问另一个页面的时候,它就可以在后台偷偷访问你的银行页面,然后干一些不为人知的事情。

http为什么是无状态的?

因为当时发明http的时候需求没有那么复杂,只是需要简单的浏览文本即可,根本没有什么长连接啊之类的需求,因此当时就为了简单起见所以http就设计成了无状态的了。

跨域问题如何解决?

同源策略其实是限制不同域名之间的访问,它是出于安全的目的。但安全和方便本就是对立的,安全了使用起来就麻烦。尤其是在现在前后端分离的场景下、在现在微服务大行其道的今天,一个服务一个域名或服务器也是很常见的。最常见的解决方法就是jsonp的方式,最正统的解决方案就是 cros

cros 跨站资源共享

跨站资源共享是解决跨域问题的首选,需要前后端配合。其本质上就是后端限制什么样的域名允许跨站访问我而已。用到了http的header中设置一些默认的参数。


评论