服务器声明哪些来源可以读取响应

浏览器可在请求中携带Origin,响应通过Access-Control-Allow-Origin等字段声明是否向该来源共享。它控制脚本取得响应的能力,不是把两边变成同源,也不是由客户端随意在请求里填写一个同名响应字段就能解除限制。

CORS结果还与HTTP状态码分开。一个403响应也可以按规则共享给脚本,反之一个服务器已生成的200响应可能因共享字段不匹配而不可读;“网络操作结果”和“浏览器是否交出响应”是两个判断。

参考:[1]

预检确认方法和请求头支持

对于需要预检的请求,浏览器先用OPTIONS说明后续拟用方法,以及必要的请求头名称。服务器用相应允许字段回答,成功后浏览器才继续相关请求;并非每一次跨源GET或每一种请求都必须先走这一步。

预检许可可在规定时间内缓存,以减少额外往返。它确认的是CORS请求条件,不替代业务端逐次授权;某些无需预检的请求本来就能到达服务器,因此不能靠不返回共享头来保证所有跨站副作用都不会发生。

参考:[1]

带凭据的共享须更明确许可

credentials模式为include时,共享响应不能用Access-Control-Allow-Origin的星号代替目标来源,还须有相应的Access-Control-Allow-Credentials: true。这个要求按请求模式生效,不应只因某次请求碰巧没有Cookie字节就忽略它。

规范中的跨源预检本身不带凭据,不能把它当作已经完成的用户认证。服务器仍须处理令牌、会话与资源权限;CORS是浏览器执行的共享协议,也不能用来阻止不遵循浏览器规则的直接HTTP客户端请求服务。

参考:[1]