Web applications web应用程序中子域的优缺点

Web applications web应用程序中子域的优缺点,web-applications,Web Applications,越来越多的web应用程序(尤其是37Signals的Basecamp)为每个用户/帐户分配一个子域。我想知道这种方法的利弊是什么。这样做有什么特别的原因吗?或者这仅仅是一个装饰性的特征?例如,这是否允许更好/更容易的可扩展性和更高的安全性?我认为这可能与同源策略有关。如果两个用户的成员页面位于不同的子域上,浏览器将阻止来自一个子域的脚本访问另一个子域中的文档。因此,如果Mallory注册一个站点(Mallory.example.org)并在其上放置恶意脚本,该脚本将无法修改Alice站点(Ali

越来越多的web应用程序(尤其是37Signals的Basecamp)为每个用户/帐户分配一个子域。我想知道这种方法的利弊是什么。这样做有什么特别的原因吗?或者这仅仅是一个装饰性的特征?例如,这是否允许更好/更容易的可扩展性和更高的安全性?

我认为这可能与同源策略有关。如果两个用户的成员页面位于不同的子域上,浏览器将阻止来自一个子域的脚本访问另一个子域中的文档。因此,如果Mallory注册一个站点(Mallory.example.org)并在其上放置恶意脚本,该脚本将无法修改Alice站点(Alice.example.org)的DOM。如果他们改用路径(example.org/mallory和example.org/alice),SOP将无法工作,而mallory的脚本可能会在alice的页面上做各种各样的坏事,比如伪造登录屏幕并将密码发回mallory


这种SOP保护甚至在两个子域解析为同一IP时也能起作用-只要URL的主机部分不同,现代浏览器就会阻止跨域脚本尝试(以及其他一些潜在的危险行为)。

我们这样做的唯一原因是人们喜欢看到他们的品牌。客户可以为其控制面板的品牌选择子域,然后使用其徽标和颜色对其进行自定义

安全性不是一个因素,因为没有人可以设置脚本。这更像是一种美学特征

我想提到的是,如果两个页面都将document.domain JavaScript属性设置为域,则两个子域可以通信。例如:

 document.domain = 'example.com';  

这意味着只要所有子域都设置了属性,a.example.com和b.example.com到n.example.com的同源策略将被禁用。

为每个应用程序使用子域可以解决知道要使用哪个应用程序的基本问题。这允许用户在同一浏览器中同时打开多个应用程序

另外一个好处是,通过将登录绑定到子域,用户可以在不同的应用程序中以不同的用户身份登录。无需退出应用程序A即可登录应用程序B。他可以使用不同的登录名同时登录这两个应用程序

可伸缩性的好处取决于您的体系结构。应用程序的共享资源(单个数据库)越多,分离应用程序就越困难。另一方面,如果每个应用程序都有一个数据库,那么数据库的版本控制就麻烦多了。我认为大多数应用程序使用单一数据库和虚拟子域。单个基地更容易维护(但更难扩展)


使用子域的一个缺点是,对于SSL,您需要一个通配符证书,它比单个域证书要贵。

这可能很有用:谢谢Harry。但是,您提到的链接更多地讨论了子域的(更)传统用法,而不是专门讨论在web应用程序中动态创建子域。谢谢您的回复。如果这只是一个装饰性的功能,那么使用mod_rewrite给用户留下一个单独子域的印象不是更容易吗?@bare_nature-如果你使用Apache,我想你可以。但假设你使用的是码头?Jetty确实有一个重写引擎,但它嵌入了301重定向的应用程序级别。在我的例子中,Spring过滤器或拦截器完美地完成了这项工作,并允许我们基于子域以编程方式执行不同的操作。另外,重写涉及更多的处理,没有业务逻辑。另外,它们不是动态的,您必须对它们进行硬编码。如果*.example.com立即解析到你的应用程序,你的应用程序会快多少?a、 example.com,b.example.com,无需额外处理。感谢您的输入。换句话说,你认为它有一定的安全优势。谢谢你的回复,Stefaan。我想你误解了我的问题(或者我不够清楚),但我想为不同的用户使用子域,而不是不同的应用程序。无论如何,你的大部分推理都适用于任何情况。了解您提到的关于SSL证书的内容也很有趣。我不知道。