越来越多的网络应用程序(最着名的是37Signals'Basecamp)为每个用户/帐户分配一个子域。我想知道这种方法的优点和缺点是什么。这样做有什么特别的原因还是仅仅是一个美容特征?例如,这是否允许更好/更容易的可扩展性和更高的安全性?
答案 0 :(得分:6)
我认为这可能与同源政策有关。如果两个用户的成员页面位于不同的子域中,则浏览器将阻止来自一个子域的脚本访问另一个子域中的文档。因此,如果Mallory注册了一个站点(mallory.example.org)并在其上放置了恶意脚本,那么该脚本将无法修改Alice站点的DOM(alice.example.org)。如果他们使用路径(example.org/mallory和example.org/alice),那么SOP将无法工作,并且Mallory的脚本可以在Alice的页面上做各种各样的坏事,比如伪造登录屏幕并发布密码回到马洛里。
当两个子域解析为同一个IP时,这个SOP保护甚至可以工作 - 只要URL的主机部分不同,现代浏览器就会阻止跨域脚本尝试(以及其他一些有潜在危险的事情)。 p>
答案 1 :(得分:3)
为每个应用程序使用子域解决了解使用哪个应用程序的基本问题。这允许用户在同一浏览器中一次打开多个应用程序。
另一个好处是,通过将登录绑定到子域,用户可以作为不同应用程序中的不同用户登录。无需注销应用程序A即可登录应用程序B.他可以使用其他登录方式登录。
可扩展性的好处取决于您的架构。应用程序拥有的共享资源(单个数据库)越多,分离应用程序就越困难。另一方面,如果每个应用程序都有一个数据库,则数据库的版本控制会更加麻烦。我认为大多数应用程序使用单个数据库和虚拟子域。单个基础更容易维护(但更难以扩展)。
使用子域的一个负面因素是,对于SSL,您需要一个通配符证书,该证书的成本高于单域证书。
答案 2 :(得分:2)
我们这样做的唯一原因是人们喜欢看他们的品牌。 Conversion Support客户可以为其控制面板的品牌选择一个子域,然后使用其徽标和颜色对其进行自定义。
安全性不是一个因素,因为没有人可以提供脚本。这更像是一种审美特征。
我想提一下,如果两个页面都将document.domain JavaScript属性设置为域,则两个子域可以通信。例如:
document.domain = 'example.com';
这意味着只要所有子域都设置了属性,就会对a.example.com和b.example.com禁用相同的原始策略。