为什么使用子域来指定多租户Web应用程序中的租户?

Mat*_*kin 29 subdomain multi-tenant

问题

  1. 为什么有些多租户Web应用程序使用子域来指定租户而其他人不使用?
  2. 是否存在技术,隐私或安全原因?
  3. 它是否依赖于用于开发Web应用程序的语言或框架?
  4. 这只是风格或开发人员的选择吗?

使用子域指定租户的示例Web应用程序

示例Web应用程序不使用子域来指定租户

ger*_*tas 17

有几种方法可以在HTTP级别上确定租户:

  • 域 - 租户由整个Host标头决定
  • 子域 - Host头的子域部分,
  • 基于路径 - 路径段,通常由前缀 host.com/tenantId/...
  • 基于cookie - cookie值包含租户id(好框架加密这个!)
  • 基于用户 - 用户会话或服务器上的一些数据记录

以下是您的问题的答案:

  1. 如果您想让用户感受到完全孤立的租赁,那么(子)域多租户是很好的.客户可能需要自定义欢迎和登录页面,单独的用户群等.另一方面,基于路径的多租户适用于未固定到单租户命名空间的用户.它主要用于Facebook,GitHub等社交网络.

  2. (子)域可以为cookie提供更好的隔离和安全控制,跨域资源共享(CORS).它使交叉租户CSRF或XSS更难.此外,如果您可以控制DNS或负载均衡器,则可以将租户分配给不同的IP(想想地理路由)或不同版本的应用程序(例如beta租户).您可以为最重要的租户分配单独的应用实例或服务器.通过这种方式,您可以获得一种廉价的工具来控制单点故障的风险以及一篮子中的所有鸡蛋.

  3. 任何允许您访问HTTP头(Host)的Web框架都具有子域功能.任何严肃的MVC Web框架都应该直接或通过插件为您提供子域作为操作参数.

  4. 这绝对是一个设计选择.如果您想知道最佳方式,请考虑您希望租户的隔离级别.如果你决定但是你会发现方法不对,那么你可以借助HTTP 301重定向迁移到另一个级别.

  • 您提到了不同层次的多租户隔离--DB.我在每个表中使用带有tenant_id列的单个数据库模式. (2认同)