主题
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 与个性化区域拆开,或者只在真正需要的服务端边界读取请求上下文,但不能为了缓存把用户数据错误放入共享缓存。
4. 写 cookie
设置 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 与个性化区域拆分,缓存安全优先于命中率。扩展知识
身份、会话、授权
- 身份:你是谁。
- 会话:当前登录状态是否有效。
- 授权:你能否访问这项资源和动作。
面试官追问链
追问一:能否在 Client Component 直接读 HttpOnly cookie?
- 考察点:浏览器安全。
- 回答方向:不能,应通过服务端组件或接口获取最小化状态,避免把敏感 cookie 暴露给 JavaScript。
追问二:headers 里的 x-forwarded-host 能信吗?
- 考察点:代理边界。
- 回答方向:只有在明确可信的反向代理链路下才使用,并做域名白名单和防伪造配置。
追问三:读取 cookie 一定让整站动态吗?
- 考察点:影响范围。
- 回答方向:不应简单扩大结论,要看依赖它的组件和缓存边界;设计上尽量局部化个性化逻辑。