pugWoo's Life   All-Posts  About

跨域的安全性设计

开发网站时,最好的设计是前端和后台在同一个域名下,这样在调用时不用涉及跨域问题,在开发、测试、预发、线上环境中切换也方便。

按照这种设计,一般会这样划分域名和URL:

m.abc.com 线上域名、预发环境域名
dev.m.abc.com 开发环境域名
test.m.abc.com 测试环境域名
/api/    所有/api开头的,转发给后台
/     其它所有链接,转发给前端静态文件目录

但是实际开发中,还是难免会出现跨域的问题。例如集团下两家独立子公司合作,共享登录态。于是就会涉及到跨域的设计。

  1. 首先跨域调用,服务器端必须设置Access-Control-Allow-Origin头部。一般偷懒的做法会设置上Access-Control-Allow-Origin: *,这样是不安全的,现代浏览器已经为这种不安全做了一定的防范:当服务器端设置的Access-Control-Allow-Origin*时,跨域的cookie不会发送给服务器。也即,这种方式只适合于不需要登录态的跨域调用。因此,现代浏览器的这种做法可以阻挡大部分的钓鱼冒牌网站。

    正常的跨域调用,显然是需要带上跨域站点的cookie的。此时就必须让服务器设置上Access-Control-Allow-Origin值为明确某个域名,这个可以交给浏览器根据不同的跨域请求设置不同的域名。同时javascript XHR也需要设置允许带上跨域cookie。

  2. 为了使域名cookie在开发测试线上环境中同时可用(主要是登录态,例如微信登录就只能指定一个域名),一般我们会把cookie打在顶级域名下。但要注意外部存储平台如七牛,当七牛绑定到我们域名的某个二级域名时,请求图片就会带上顶级域名下的cookie,导致理论上七牛可以获得我们用户的登录态。解决方式是,为七牛绑定上另外一个顶级域名,例如google的所有静态资源就放在gstatic.com下,就可以从逻辑上完全杜绝google.com的cookie泄漏给CDN服务器的问题。