微服务鉴权放在网关还是每个服务内更合理?核心结论是:绝大多数场景下,把鉴权主体放在网关,服务内只保留必要的二次校验,这是当前行业共识的最优解。
但这里有个容易让人纠结的点:网关鉴权后,服务内部是否还需要管权限?如果每个服务都做一遍,性能损耗大;如果全交给网关,又担心网关成为单点,接下来我们从实际落地角度拆开聊。
网关鉴权与服务内鉴权,到底在争什么
先看两者的本质区别,网关鉴权,指的是在请求进入业务服务之前,由API网关统一完成身份认证和基础权限校验,服务内鉴权,则是每个微服务自己解析Token、校验权限,甚至自己对接用户体系。
网关鉴权的优势非常直观:
- 集中管控,认证逻辑只维护一份代码
- 流量入口统一拦截,非法请求根本到不了业务层
- 对下游服务透明,业务团队不用关心认证细节
服务内鉴权的合理性也存在:
- 某些服务可能暴露给非网关来源(如内部消息队列触发)
- 细粒度权限(如数据行级权限)网关难以覆盖
- 服务自治原则下,每个服务对自己的安全边界负责
但行业共识认为,网关必须做鉴权,服务内做不做、做到什么程度,取决于业务场景,不是非黑即白。
网关做鉴权的核心价值:统一入口才能控制风险
如果你的系统有几十个微服务,每个服务都自己写一遍Token校验逻辑,会发生什么?三个服务用JWT,五个服务用OAuth2,还有两个服务直接用Session……维护起来就是灾难,更麻烦的是,如果某个服务漏写了校验,那它就成了整个系统的短板。
网关把这道防线收拢到一个点上,据行业公开资料,多数互联网公司的微服务架构中,网关承担了约80%的认证和基础鉴权职责,这样一来,安全团队只需要盯住网关一个组件,就能挡住大多数未授权访问。
在实际操作中,网关层面通常做这几件事:
- 校验Token的合法性和有效期
- 解析用户身份,把用户ID、角色等信息写入请求头
- 对敏感接口做粗粒度权限判断(如是否登录、是否管理员)
- 对异常IP或设备做黑名单过滤
服务内二次鉴权的真实场景:不是重复,是补位
网关做完了基础校验,服务内还需要做什么?这里要区分两个概念:
身份认证和业务授权。
身份认证是“你是谁”,业务授权是“你能干什么”,网关负责前者,后者往往与具体业务强相关,举个例子,订单服务里有个接口允许用户查询订单详情,网关校验了Token没问题,用户是登录状态,但订单数据属于谁?用户A能不能查用户B的订单?这种数据归属校验,网关根本没法做,因为网关不感知订单表的归属逻辑。
所以服务内的鉴权,重点在于业务级授权,你需要验证的是“当前用户对这个资源有没有操作权限”,而不是“当前用户是否登录”,这层校验必须靠近数据,放在服务内才合理。
另外还有一种情况:服务间调用,比如订单服务调用库存服务,这个内部请求可能不会经过网关,如果库存服务完全信任内部网络,那一旦因为配置错误或代码漏洞导致内部请求泄漏,风险就很大。关键服务内部需要有轻量级认证机制,比如服务间共享密钥或mTLS。
网关鉴权vs服务内鉴权,怎么选才不踩坑
很多团队在选型时容易走极端:要么全部堆在网关,导致网关逻辑臃肿;要么全部下放到服务,结果每个服务都重复造轮子,正确的做法是分层设计。
网关负责全局性、通用性鉴权
适合放在网关的鉴权逻辑,通常具有无业务属性或跨服务通用的特点:
- 用户登录态校验(JWT、OAuth2 Token)
- 应用级API Key校验
- 基础黑白名单控制
- 接口访问频率限制
- 客户端类型识别(移动端、Web端、第三方开放平台)
这些逻辑不关心订单、商品、用户等具体业务对象,只关注“请求是否来自合法调用方”。
服务内负责业务性、资源级授权
每个服务自己需要管理的是当前用户对特定资源的操作权,常见做法包括:
- 校验用户是否拥有某条数据的操作权限
- 基于角色的菜单和按钮权限
- 数据范围控制(如只能看自己公司的数据)
- 操作审计和风控策略
在实现上,服务内可以引入轻量级权限框架(如Spring Security、Casbin),通过注解或代码方式在业务方法上挂载权限校验,这些校验不应依赖网关,而是独立存在。
混合模式:网关校验身份,服务内校验业务权限
最合理的架构,是把两者结合成一条完整的链路:
- 请求到达网关,网关完成身份认证,并把用户上下文(ID、角色、租户信息)放入请求头
- 网关对全局性权限做过滤,比如是否允许访问该服务
- 请求进入具体服务,服务从请求头获取用户上下文
- 服务内再做业务授权,判断是否允许该用户操作这个资源
这种模式下,网关和服务各司其职,既避免了重复代码,又保证了细粒度安全。
微服务鉴权放网关还是服务内的实操建议
如果你是中小团队,系统规模不超过二十个服务,那么优先把鉴权全部放到网关是省力且安全的选择,服务内只需要信任网关传过来的用户信息,业务授权可以用简单的数据归属判断代替,等到业务复杂度上升,出现多租户、复杂角色体系或开放API时,再在服务内引入权限框架。
如果你是大团队,服务划分很细,各团队独立负责服务生命周期,那么建议采用网关+服务内双保险,网关负责统一认证,服务内负责自定义授权,两者之间通过标准协议传递上下文(如自定义请求头或内部Token)。
无论哪种方式,有两条实操经验值得参考:
- 网关鉴权逻辑要克制,别把业务权限规则堆在网关,否则网关会变成巨型业务组件,难以维护。
- 服务内鉴权逻辑要可配置,用注解或规则引擎,别写在代码硬编码里,否则权限调整就得发版。
常见问题:网关鉴权后,服务内还要不要校验Token?
很多开发会问:既然网关已经解析了Token,服务内为什么还要再解析一次?理论上确实不用,但前提是你完全信任网关,如果存在内部服务直接对外暴露的可能(比如调试时绕过网关),或者有兄弟团队的服务没经过网关,那就必须各自校验。
行业共识建议:面向公网的服务必须自身具备Token解析能力,不能默认上游一定安全,你可以通过配置开关控制,但在关键服务上,保留独立校验逻辑能防患于未然。
微服务鉴权架构的常见误区与避坑指南
这里有几个容易犯的错,也是搜索“微服务鉴权放在网关还是每个服务内更合理”时大家最常踩的坑。
把网关当万能药
有人觉得只要网关做了鉴权,服务内部就可以裸奔,结果某天网关宕机或者被绕过了,服务就完全暴露,网关是防线之一,不是唯一防线,内部服务之间的调用,至少要有基本的信任校验。
重复鉴权导致性能下降
有些团队因为担心安全问题,网关做一遍、服务内又做一遍完整的密码校验或Token解析,导致每个请求多出几十毫秒延迟,其实服务内只需校验网关传过来的用户ID是否合法,没必要重复解析原始Token,你可以把Token解析结果缓存到请求上下文,服务内直接读取即可。
权限模型混乱
网关用角色判断,服务内用权限点判断,两者对不上,就会出现权限漏洞,建议统一用权限点(如“order:update”)作为最小粒度,网关做粗粒度角色拦截,服务内做细粒度权限点校验,两者通过配置中心同步。
微服务鉴权放网关还是服务内的2026年趋势
到2026年,服务网格(Service Mesh)的普及会让这个问题有新的解法,像Istio这类服务网格,可以在Sidecar层统一做认证和鉴权,相当于把网关的能力下沉到每个服务旁边,但即便如此,业务级权限仍然需要服务内处理,因为Sidecar不懂你的业务数据。
另一个趋势是零信任架构,零信任要求所有请求无论来自内外,都必须经过认证和授权,这种理念下,服务内鉴权的重要性会进一步提升,网关不再是信任边界,而是第一道检查点,每个服务自身的安全能力才是最后一道防线。
关于微服务鉴权位置的相关问答
微服务鉴权必须放在网关吗?
不是必须,但推荐放在网关,网关做统一认证能降低重复代码,提高安全一致性,如果你的服务不通过网关暴露,或者需要处理业务级资源权限,那就必须在服务内做二次授权。
网关鉴权和JWT在微服务中如何配合?
网关负责生成和校验JWT,把用户信息解析后塞入内部请求头,服务内从请求头获取用户ID,然后做业务权限判断,JWT本身不依赖网关,服务内也可以只校验签名完整性,但推荐由网关统一处理,减少各服务的计算开销。
内部服务间调用需要每次都鉴权吗?
需要,但不必走完整用户认证流程,内部调用可以用服务身份凭证,比如mTLS证书或共享密钥,对敏感服务,建议在入口加一层白名单校验,确保只有特定服务能调用。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/621041.html





