网关层统一校验会话有效性并透传用户信息:通过拦截请求校验cookie或jwt,查redis或本地验签,成功后注入x-user-id等可信头至下游,js仅安全透传凭证。

JavaScript 本身不直接管理 Session,Session 是服务端概念。微服务架构中,Session 校验和用户信息透传必须在网关层(如 Nginx、Kong、Spring Cloud Gateway、Envoy 或自研网关)统一处理,前端 JS 只负责携带凭证(如 Cookie 或 Token)。
网关层如何集中校验会话有效性
网关不依赖 JS,而是拦截请求,检查客户端传来的会话标识(如 session_id Cookie 或 JWT Token),再调用认证服务(Auth Service)验证其有效性:
- 若使用传统 Session:网关需连接共享 Session 存储(如 Redis),根据 Cookie 中的 session_id 查 Redis,确认未过期、未注销、IP/UA 未异常变更
- 若使用 JWT:网关本地校验签名、过期时间、issuer 等(无需远程调用),必要时可加黑名单或白名单缓存(如 Redis 存已登出的 jti)
- 推荐统一走 OAuth2/OIDC 流程,网关作为 Resource Server,用公钥或 JWKS 端点校验 Access Token
校验通过后如何安全转发用户信息
网关在校验成功后,应剥离原始敏感凭证,注入标准化、最小化用户上下文到下游服务的请求头中:
- 添加可信头字段,例如:
X-User-ID、X-User-Role、X-User-Permissions(值来自认证服务返回,非客户端传入) - 避免透传原始 Cookie 或 Token 给业务服务,防止越权解析或重放
- 可选:对用户信息做轻量加密或签名(如 HMAC),供下游服务二次校验来源可信
前端 JavaScript 的配合方式
JS 不参与校验逻辑,只确保正确携带凭证:
- 登录成功后,后端设 HttpOnly Cookie(含 session_id),JS 无需读取,浏览器自动携带
- 若用 Token 方案,JS 将 Token 存 localStorage/sessionStorage,并在请求头设置
Authorization: Bearer xxx - 注意:AJAX 请求需配置
credentials: 'include'(fetch)或withCredentials = true(XMLHttpRequest),才能发送 Cookie
常见落地组件参考
不同技术栈下典型实现:
- Spring Cloud Gateway:用 GlobalFilter + ReactiveRedisTemplate 校验 session_id;或集成 Spring Security OAuth2 Resource Server 自动解析 JWT
-
Kong:启用
key-auth、jwt或自定义 Plugin(Lua)调用 Auth 服务,用proxy-rewrite注入头 -
Nginx + Lua:用
lua-resty-jwt或lua-resty-session实现校验与透传 - Envoy:通过 ext_authz 过滤器对接外部鉴权服务,用 metadata exchange 传递用户字段
关键原则:校验逻辑下沉到网关,业务服务只信任网关注入的头,不自行解析 Cookie/Token。JS 只是凭证搬运工,不参与信任决策。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











