同源策略
同源就是两个URL的协议、端口和主机均相同。
例如http://www.hhh.com/test1
与http://www.hhh.com/test2
两者是同源的。
因为协议均为http,端口均为80,主机名均为www.hhh.com
。
http://www.hhh.com/test1
与https://www.hhh.com/test1
则不同源,协议不同。其他的情况以此类推。
现代浏览器都有同源策略,用来限制一个源的文档或者其加载的脚本如何与另一个源的资源进行交互。这是为了保证安全而必需的策略。
通常跨源写操作与跨源资源嵌入是允许的。而跨源读操作是被禁止的。
CORS跨域资源共享
CORS是一种基于HTTP头的机制,通过允许服务器标识除了它自己以外的源,使得浏览器可以允许这些源访问加载自己的资源。
支持CORS的浏览器在收到跨域请求时,会对请求做一些特殊处理,实现了CORS接口的服务端就可以接受请求并作响应。而客户端不需要对自己的请求作任何特殊处理。
对于简单请求,浏览器会自动在请求头中添加Origin
字段,用来表示请求源。
服务端收到该请求后,验证其中的Origin
字段,判断这个源是否是允许访问的源,如果是,那么会在返回信息的头中附加Access-Control-Allow-Origin
字段。
浏览器收到响应后会检测响应头中是否有这个字段,如果没有,那么就报错,否则就是正常通过。
对于非简单请求,会在正式通信之前增加一次预检操作。
浏览器先询问服务器,当前网页所在域名是否在服务器的许可名单之中,以及可使用哪些HTTP动词和头信息字段。只有得到答复后,浏览器才会发送正式的请求。
预检请求用的请求方法是OPTIONS
,里面会包含两个关键字段和Origin
:
Access-Control-Request-Method
:列出CORS请求会用到哪些方法。Access-Control-Request-Headers
:指定CORS请求会额外发送的头信息字段。
服务端收到请求后,检查Origin
、Access-Control-Request-Method
,Access-Control-Request-Headers
,确定可以接受后才会返回Access-Control-Allow-Origin
。如果否定,那么返回的响应头里不会有任何关于CORS的信息。此时浏览器就会报错。
简单请求和非简单请求的定义
简单请求:
- 请求方法是
HEAD
、GET
,POST
之一。 - HTTP的头信息不超过以下几个字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type
简单请求以外的请求为非简单请求。