Access-Control-Allow-Origin 的正确玩法

Access-Control-Allow-Origin 的正确玩法

  前端发起的跨域请求需要适当地响应 Access-Control-Allow-Origin 头。但是这个头目前并不支持部分通配符,无法匹配某个域名下的子域。直接使用星号又可能带来各种问题。更坑爹的是它还不支持设置多个值。那么如果一个后端程序用于多个域名的访问该怎么办呢?
  很多时候一套后端的程序都对应了多个调用方,它们使用的的域名不同,scheme 可能也不同。所以 Access-Control-Allow-Origin 的值没法写死一个域名。如果直接暴力地将其设置为「*」,可能导致一些未被授权的域名也能请求到资源。而且当 Access-Control-Allow-Credentials 的值为 true 时会导致Access-Control-Allow-Origin 无法被设置为「*」。
  正确的玩法应该是在后端程序中获取从 HTTP 请求头传过来的 Origin 字段,然后在程序中验证它的值是否合法,并且做出适当的响应。也就是说,可以不依赖前端的跨域限制,后端如果认为一个请求的 Origin 来自不正确的地方就直接毫不留情地 403 掉。其它情况如果没有 Origin 或者 Origin 正确则将 Origin 的值原原本本地放入 Access-Control-Allow-Origin 中响应回去。
  其实虽然这个问题可以完全通过后端解决,但我还是很费解规范中无法使用局部通配符,和无法配置多个值的设定。也许这么设计的目的就是希望后端直接 403,而不是让浏览器来拦截吧(反正让浏览器来拦截还需要额外的传输成本,有点浪费)?       

posted @ 2018-06-04 14:18  IT小工Joey  阅读(7599)  评论(0编辑  收藏  举报