CDN虽不能直接识别租户,但通过路径、Header、签名和缓存Key的组合设计,SaaS平台完全可以实现安全、灵活、低成本的资源隔离。
为什么SaaS多租户要用CDN做资源隔离
先看一个真实场景,你的SaaS产品给几百家企业客户使用,每家上传的Logo、报表模板、产品说明书都放在同一个对象存储桶里,为了加速,你接入了CDN,结果A客户刚修改了品牌色,B客户刷新页面时拿到的还是老版CSS,甚至更糟A客户上传的客户清单PDF,被B客户用猜URL的方式直接访问,这种尴尬,本质上是CDN的缓存和鉴权没有感知“租户”这个概念。
多租户隔离的核心诉求有两个:不能串数据和不能越权访问,应用层做一次鉴权不难,难的是静态资源已经被CDN缓存到了边缘节点,CDN回源时根本不知道请求来自哪个租户,如果你不管,所有租户共享同一个缓存Key,那谁先访问,缓存里就是谁的版本。
行业共识认为,让CDN参与资源隔离的最大价值在于:把“静态资源分发”和“访问控制”下沉到边缘节点,回源压力小,用户访问也更快,关键是你得想清楚“用什么标识区分租户”。
SaaS多租户CDN资源隔离方案:从路径到签名
CDN多租户隔离怎么做?先看路径分区
最直接的办法是给每个租户分配独立URL前缀。
- 租户A的静态资源放在
/tenant-a/assets/下 - 租户B的静态资源放在
/tenant-b/assets/下
CDN只缓存对应路径下的内容,回源时通过路径自然隔离开,这种方式的优点非常朴素:配置简单,日志排查也方便,你在CDN控制台里设置缓存策略时,可以按目录分别设置,比如租户A需要秒级刷新,租户B可以容忍10分钟缓存,那就对两个目录设置不同的缓存过期时间。
它的问题也很明显:路径是公开的,只要别人猜到 /tenant-b/report.pdf 这种URL,就能直接访问,所以路径分区只适合做“软隔离”,必须配合签名或Referer防盗链才能用。
用Header区分租户:适合API接口和小程序
如果你的SaaS资源不是走静态域名,而是通过API动态返回,比如小程序里的banner图、App端的配置文件,那更适合用Header来区分,前端请求时带上 X-Tenant-ID: tenant_b,CDN回源时读取这个Header,并将它加入缓存Key。
好处是URL非常干净,不暴露租户信息,坏处是CDN厂商对Header的处理逻辑差异较大,有些CDN默认会忽略自定义Header,有些则直接透传,配置前你要先确认控制台里有没有“回源Header”或“缓存Key包含Header”的开关,一旦源站对Header大小有限制(比如Nginx默认取前几十字节),你还要保证租户ID足够短。
签名鉴权:隔离和防刷一起解决
路径分区防不住猜测,Header区分又太依赖厂商能力,对付敏感资源,还是得上签名。
做法是:给每个URL加上时间戳和签名参数,/assets/common.css?tenant_id=tenant_b&expire=1699999999&sign=ABC123,CDN收到请求后,先用你配置的密钥计算签名,合法才放行,同时把 tenant_id 加入缓存Key,这样每个租户拿到的是自己专属的加密URL,既隔离了内容,又防止别人用普通URL刷资源。
业内专家指出,签名鉴权是目前多租户场景下最稳妥的做法,特别适合付费SaaS产品,它能做到同一份资源、不同租户看到不同版本,同时防止恶意抓取,缺点是前端每个URL都要走一次签名生成逻辑,增加了一些开发量,但同一份资源只需要在拿到URL时签一次,后续缓存命中就无所谓了。
缓存Key改造:隔离的核心是“不串”
不管用路径还是Header,最终都要落到CDN的缓存Key上,CDN默认的缓存Key就是完整的请求URL,你想让CDN区分租户,就得告诉它:“除了URL,还要看这个参数。” 在简米云、酷番云、又拍云等国内CDN的控制台里,都有“缓存Key”或“缓存键”的配置项。
比如你选择了路径方案,/tenant-a/ 和 /tenant-b/ 本来就不是同一个URL,天然不串,但如果你用了Header方案,URL是一样的,就必须把 X-Tenant-ID 的值附加到缓存Key中,否则CDN看到两个请求URL相同,直接返回第一个租户的缓存内容,隔离就失败了。
验证方法很简单:用两个租户的ID各请求一次同一个资源,看CDN回源日志里是不是出现了两次源站请求,如果只出现一次,说明缓存Key没生效。
国内CDN多租户隔离配置要点
这里以国内主流CDN的控制台操作逻辑为参考,具体名称可能不同,但思路通用。
第一步:规划租户标识规则
先决定用路径还是Header,如果你是从零开始的新项目,推荐路径前缀,原因有两条:第一,日志里能直接看到租户ID,排查问题快;第二,缓存策略能按目录单独下发,不用写复杂规则,如果你已经有现成的URL结构,不想改动太大,就用Header。
第二步:在CDN控制台配置缓存Key
进入CDN控制台的“缓存配置”或“缓存键”页面,找到“自定义缓存Key”功能,把
tenant_id 参数加入缓存Key,如果你用Header,就需要在“回源HTTP头”里添加 X-Tenant-ID,同时告诉CDN这个Header参与缓存标识。
注意:有些CDN默认会忽略所有请求参数作为缓存Key,必须手动开启“保留参数”,这一步漏掉,你后面所有隔离规则都白搭。
第三步:设置鉴权与回源协议
在“访问控制”里开启URL鉴权,使用类型B或C(具体看厂商),填写密钥,然后把回源协议改成HTTPS,防止请求头里的租户信息在传输中被劫持,如果你用了Header方案,更要确保回源协议是HTTPS,因为Header里带租户ID,明文HTTP容易被中间人篡改。
验证配置是否生效
配置好后,做一次完整的隔离测试:
- 用租户A的签名URL访问
logo.png,记录响应头里的X-Cache: HIT - 再用租户B的签名URL访问同一个文件,记录响应头
- 如果两次都是HIT但内容分别是各自租户的版本,说明缓存Key正确
- 如果第二次显示MISS,说明CDN没有把租户ID加入缓存Key,需要回头检查
隔离效果与成本对比:路径隔离 vs 签名隔离
| 方案 | 安全级别 | 配置复杂度 | 推荐场景 |
|---|---|---|---|
| 路径分区 | 低 | 低 | 展示型SaaS、官网、非敏感资源 |
| Header区分 | 中 | 中 | API网关、小程序后台、动态渲染资源 |
| 签名鉴权 | 高 | 高 | 付费SaaS、私密文档、企业客户专属内容 |
实际项目中,多数SaaS会选择路径+签名的组合:路径负责逻辑分区,签名负责访问控制,这个组合的配置成本只比单纯路径方案多一些签名生成逻辑,但安全收益高一个数量级。
CDN资源隔离价格贵不贵?成本拆解
CDN计费主要由流量和请求数构成,隔离方式本身不单独收费,但有两个隐性成本值得注意:
- 签名鉴权涉及边缘节点计算,部分厂商会把带签名参数的请求归类为“动态请求”,按次计费或单价更高。
- Header区分导致缓存命中率下降,因为每个租户的缓存副本是独立的,回源带宽可能增加。
多数情况下,只要缓存策略合理,隔离带来的额外费用变化不大。真正的大头是“拆缓存”带来的回源成本比如你过去100个租户共用一份缓存,现在拆成100份,总缓存空间变大,冷启动回源次数变多,但CDN节点覆盖广,回源流量通常远低于边缘流量,账单不会失控。
容易被忽略的回源缓存问题
很多SaaS团队配置好CDN后发现,某些租户的图片老是更新不及时,或者干脆缓存不了,这时候问题往往不在CDN,而在源站返回的响应头。
源站如果对所有租户返回同一个 Set-Cookie,CDN会认为响应带变化头,默认不缓存,导致每次请求都回源,源站如果对租户A返回了 Cache-Control: private,CDN自然不会缓存,更隐蔽的是,源站如果返回了 Vary: X-Tenant-ID,老版本CDN可能直接跳过缓存,性能反而变差。
解决方法:在源站增加一个租户识别中间件,对每个租户的请求生成独立的缓存标签,或者在CDN控制台里忽略源站的Set-Cookie和Vary头,强制按缓存Key来缓存,具体操作是在“回源HTTP头”中删除或覆盖源站的缓存控制字段。
CDN做多租户资源隔离,本质上是一种“边缘层的租户路由”思路,只要缓存Key、鉴权方式和回源策略配合到位,SaaS平台既能享受CDN的加速能力,又能守住租户边界。最稳妥的组合是路径前缀加签名鉴权,成本可控且运维清晰。
常见问题:SaaS CDN资源隔离与安全
问题1:CDN能完全替代应用层鉴权吗?
不能,CDN隔离解决的是静态资源的缓存边界,应用层的用户权限判断(比如角色、部门、配额)依然需要你的后端逻辑,CDN只能保证“拿到的URL是合法的”,不能判断“这个用户是否属于这个租户”,即使CDN校验签名通过,你仍需要在应用层对关键接口做二次鉴权。
问题2:多租户CDN缓存过期时间怎么设置才合理?
需要根据资源类型区分,对经常更新的JS/CSS,建议设置10分钟到1小时的缓存时间,同时用带版本号的URL主动刷新,对图片等稳定资源,可以设置7天以上,注意租户配置变更时,要调用CDN刷新接口,按租户路径精准清理,别刷整个域名,否则会拖垮回源。
问题3:海外租户用CDN隔离要注意什么?
主要看CDN节点是否覆盖租户所在区域,以及当地数据合规要求,如果你的SaaS有欧洲租户,且需要处理敏感数据,建议选择支持区域回源的CDN产品,将欧洲租户的请求强制回源到欧洲节点,签名鉴权的时钟偏移问题在跨境场景下更突出,需要把时间戳容忍范围放宽到5分钟,避免因网络延迟导致签名提前过期。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/645227.html





