NextAuth中useSession、getSession与getServerSession的区别及适用场景
NextAuth.js 中 useSession、getSession、getServerSession 的差异与适用场景
1. useSession
这是客户端专属的React Hook,只能在React组件或者自定义Hook里调用。
- 运行在浏览器端,会自动监听会话状态变化,用户登录/登出后组件会自动重新渲染更新状态
- 自带
status状态(loading/authenticated/unauthenticated),方便处理加载态和登录态切换 - 用法示例:
import { useSession } from "next-auth/react"; function UserProfile() { const { data: session, status } = useSession(); if (status === "loading") return <div>加载中...</div>; if (status === "unauthenticated") return <a href="/api/auth/signin">登录</a>; return <div>欢迎,{session.user.name}</div>; }
2. getSession
这是个通用异步方法,客户端和服务器端都能调用,但现在服务器端更推荐用getServerSession。
- 客户端调用时,本质是发请求到
/api/auth/session接口拿会话数据,不会自动监听变化,需要手动刷新才会更新 - 服务器端调用时需要传入
req和res对象,直接从服务器的会话存储里读取数据 - 用法示例:
客户端:
服务器端(旧版写法):import { getSession } from "next-auth/react"; async function fetchUserPosts() { const session = await getSession(); if (!session) return []; const res = await fetch(`/api/posts?userId=${session.user.id}`); return res.json(); }import { getSession } from "next-auth/react"; export default async function handler(req, res) { const session = await getSession({ req, res }); if (!session) return res.status(401).json({ message: "未授权" }); // 处理业务逻辑 }
3. getServerSession
这是专门给服务器端设计的方法,只能在服务器环境用(API路由、Server Components、getServerSideProps等),是现在服务器端获取会话的首选。
- 不需要手动传
req/res(新版NextAuth会自动从上下文提取),写法更简洁 - 直接从服务器会话存储读取数据,不会触发客户端请求,性能更好,也避免了会话数据在客户端暴露的风险
- 支持Next.js App Router的Server Components,适配最新的Next.js特性
- 用法示例:
API路由:
Server Component:import { getServerSession } from "next-auth/next"; import { authOptions } from "../auth/[...nextauth]"; export async function GET(request) { const session = await getServerSession(authOptions); if (!session) return new Response(JSON.stringify({ message: "未授权" }), { status: 401 }); return new Response(JSON.stringify({ user: session.user })); }import { getServerSession } from "next-auth/next"; import { authOptions } from "../auth/[...nextauth]"; async function DashboardPage() { const session = await getServerSession(authOptions); if (!session) return <div>请先登录</div>; return <div>仪表盘:{session.user.email}</div>; } export default DashboardPage;
核心差异总结
| 对比维度 | useSession | getSession | getServerSession |
|---|---|---|---|
| 运行环境 | 仅客户端(React组件/Hook) | 客户端/服务器端(兼容旧版) | 仅服务器端 |
| 自动更新会话 | 是(实时监听) | 否(需手动刷新) | 否(按需获取) |
| 安全性 | 客户端暴露会话数据 | 服务器端调用安全,客户端同useSession | 最高(仅服务器端处理) |
| 推荐场景优先级 | 客户端UI渲染首选 | 仅兼容旧逻辑或客户端一次性获取 | 服务器端场景首选 |
适用场景
- useSession:客户端页面/组件需要根据登录状态动态渲染UI(比如显示登录按钮或用户信息)、需要实时响应会话变化的场景
- getSession:客户端非组件逻辑(比如工具函数、事件回调)中一次性获取会话、维护旧版NextAuth代码的服务器端场景
- getServerSession:API路由中做权限校验返回敏感数据、Server Components中预渲染用户专属内容、
getServerSideProps中做页面权限拦截
内容的提问来源于stack exchange,提问作者in43sh
相关产品推荐
相关产品推荐

