为什么在多租户 Web 应用程序中使用子域来指定租户?
问题
- 为什么某些多租户 Web 应用程序使用子域来指定租户,而其他应用程序则不然?
- 是否有技术、隐私或安全方面的原因?
- 它是否取决于用于开发 Web 应用程序的语言或框架?
- 这仅仅是风格或开发人员选择的问题吗?
使用子域指定租户的示例 Web 应用程序
不使用子域指定租户的 Web 应用程序示例
Questions
- Why do some multi-tenant web applications use subdomains to designate the tenant while others do not?
- Are there technical, privacy, or security reasons?
- Is it dependent on the language or framework used to develop the web application?
- Is it simply a matter of style or developer's choice?
Example Web Applications Using Subdomains to Designate Tenants
Example Web Applications Not Using Subdomains to Designate Tenants
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 HTTP 级别上确定租户的方法有多种:
Host
标头确定Host
标头的子域部分、host.com/tenantId/...
以下是问题的答案:
如果您想让用户感受到完全隔离的租户,那么(子)域多租户是很好的选择。客户可能需要自定义欢迎和登录页面、单独的用户群等。另一方面,基于路径的多租户对于不固定于单租户命名空间的用户来说是有好处的。它主要由 Facebook、GitHub 等社交网络使用。
(子)域可以为您提供更好的 cookie 隔离和安全控制、跨源资源共享 (CORS)。它使跨租户 CSRF 或 XSS 变得更加困难。此外,如果您可以控制 DNS 或负载均衡器,您可以将租户分配给不同的 IP(例如地理路由)或不同版本的应用程序(例如 beta 租户)。您可以为最重要的租户分配单独的应用程序实例或服务器。这样您就可以获得一个廉价的工具来控制单点故障的风险,并且所有鸡蛋都放在一个篮子里。
任何允许您访问 HTTP 标头 (
Host
) 的 Web 框架都支持子域。任何严肃的 MVC Web 框架都应该直接或通过插件为您提供子域作为操作参数。这绝对是一个设计选择。如果您想知道最好的方法,请考虑您希望为租户提供何种程度的隔离。如果你决定了,但你会发现方式不对,那么你可以借助 HTTP 301 重定向迁移到另一个级别。
There are several ways to determine tenant on HTTP level:
Host
headerHost
header,host.com/tenantId/...
Here are an answers to your questions:
(Sub-)domain multi-tenancy is good if you want to give an user a perception of fully isolated tenancy. The customer may want custom welcome and login page, separate user-base etc. On the other hand the path based multi-tenancy is good for the users who are not fixed to single tenant namespace. It is mostly used by social networks like Facebook, GitHub etc.
(Sub-)domains can give you better isolation and security control for cookies, cross-origin resources sharing (CORS). It makes cross-tenant CSRF or XSS a bit harder. Moreover if you have control over DNS or Load-balancer you can assign tenants to different IPs (think geo-routing) or to various versions of application (e.g. beta tenants). You can assign a separate app instance or server for your most important tenants. This way you get a cheap tool to control risk of single point of failure and all eggs in one basket.
Any web-framework which gives you an access to HTTP headers (
Host
) is sub-domains capable. Any serious MVC web-framework should give you sub-domain as action parameter directly or by plugin.It is definitely a design choice. If you want to know the best way think what level of isolation you want for your tenants. If you decide but you will find that the way is not right then you can migrate to another level with help of HTTP 301 redirection.