You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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路由:
    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 }));
    }
    
    Server Component:
    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;
    

核心差异总结

对比维度useSessiongetSessiongetServerSession
运行环境仅客户端(React组件/Hook)客户端/服务器端(兼容旧版)仅服务器端
自动更新会话是(实时监听)否(需手动刷新)否(按需获取)
安全性客户端暴露会话数据服务器端调用安全,客户端同useSession最高(仅服务器端处理)
推荐场景优先级客户端UI渲染首选仅兼容旧逻辑或客户端一次性获取服务器端场景首选

适用场景

  • useSession:客户端页面/组件需要根据登录状态动态渲染UI(比如显示登录按钮或用户信息)、需要实时响应会话变化的场景
  • getSession:客户端非组件逻辑(比如工具函数、事件回调)中一次性获取会话、维护旧版NextAuth代码的服务器端场景
  • getServerSession:API路由中做权限校验返回敏感数据、Server Components中预渲染用户专属内容、getServerSideProps中做页面权限拦截

内容的提问来源于stack exchange,提问作者in43sh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:25:25