Skip to content

Next.js 原理与运行时

Next.js cookies 和 headers 为什么会影响动态渲染?

读取请求上下文意味着结果可能随用户和请求变化,高级回答要解释它如何改变缓存、渲染和权限边界。

适合阶段:资深前端 / 原理面核心能力:Request Context · Dynamic Rendering · Cache

面试官想考什么

  • 读取 cookie 后为什么可能不能静态化? 考察动态数据来源。
  • headers 中的 host 能直接决定租户吗? 考察代理信任。
  • cookies 是鉴权还是授权? 考察安全边界。
  • 如何避免动态读取让整棵树失去缓存? 考察组件拆分。

一句话回答

text
cookies 和 headers 是请求级输入,读取它们通常会让依赖它们的结果进入动态边界;它们只能提供身份线索,资源授权仍要在数据访问点完成,并通过拆分组件和显式缓存控制缩小影响范围。

面试回答详解

1. 请求上下文

text
request -> cookies/headers -> session/locale/tenant hint
-> dynamic render or protected data access

同一个 URL 在不同 cookie、语言或 Host 下可能得到不同结果,因此不能按公共内容处理。

2. 鉴权边界

读取 session cookie 后要验证签名、过期时间和服务端会话;Host、Forwarded 等头部可能经过代理,必须使用受信任的代理配置和域名绑定。cookie 存在不代表用户有资源权限。

3. 缓存影响

把读取 cookies 的整个页面变成动态渲染可能损失缓存收益。可以把公共 Shell 与个性化区域拆开,或者只在真正需要的服务端边界读取请求上下文,但不能为了缓存把用户数据错误放入共享缓存。

设置 cookie 通常属于响应 mutation 边界,如 Server Action 或 Route Handler。要设置 HttpOnly、Secure、SameSite、Path、过期时间,并考虑登录后 Router Cache 和页面刷新。

5. 观测和测试

测试无 cookie、过期 cookie、跨租户 cookie、代理头伪造、缓存命中和客户端导航。日志不要打印完整 cookie,记录脱敏 session id 和决策结果。

可直接背诵的 30 秒回答

text
cookies 和 headers 是请求级输入,读取后页面结果可能因用户、语言或 Host 不同,通常要进入动态边界。它们只能作为 session、locale 或租户线索,服务端还要做签名、成员关系和资源授权。性能上我会把公共 Shell 与个性化区域拆分,缓存安全优先于命中率。

扩展知识

身份、会话、授权

  • 身份:你是谁。
  • 会话:当前登录状态是否有效。
  • 授权:你能否访问这项资源和动作。

面试官追问链

  • 考察点:浏览器安全。
  • 回答方向:不能,应通过服务端组件或接口获取最小化状态,避免把敏感 cookie 暴露给 JavaScript。

追问二:headers 里的 x-forwarded-host 能信吗?

  • 考察点:代理边界。
  • 回答方向:只有在明确可信的反向代理链路下才使用,并做域名白名单和防伪造配置。
  • 考察点:影响范围。
  • 回答方向:不应简单扩大结论,要看依赖它的组件和缓存边界;设计上尽量局部化个性化逻辑。

推荐阅读

基于 MIT 协议开源