Community생산성 & 협업github.com

auth0/auth0-nextjs

Next.js 애플리케이션에 인증(로그인, 로그아웃, 보호된 페이지, 미들웨어, 서버 컴포넌트)을 추가할 때 사용하세요 - @auth0/nextjs-auth0 SDK를 사용하여 App Router와 Pages Router를 지원합니다.

auth0-nextjs란 무엇인가요?

이 스킬은 Next.js 애플리케이션에 Auth0 기반의 인증 시스템을 손쉽게 통합할 수 있도록 도와줍니다. @auth0/nextjs-auth0 SDK를 활용하여 사용자 로그인, 로그아웃, 페이지 접근 제어, 미들웨어를 통한 라우트 보호, 서버 컴포넌트와의 통합 등 다양한 인증 기능을 App Router와 Pages Router 모두에서 사용할 수 있습니다. Next.js 애플리케이션을 개발할 때 인증 관련 로직을 구현해야 하며, 보안이 중요한 페이지나 API 라우트를 보호하고 싶을 때 사용합니다. 이 스킬은 Auth0 대시보드에서 애플리케이션을 등록하고 필요한 환경 변수를 설정한 후, SDK를 설치하고 설정하는 전 과정을 안내하여 안전하고 확장 가능한 인증 솔루션을 제공합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/auth0/agent-skills/tree/main/skills/auth0-nextjs

Installed? Explore more 생산성 & 협업 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

auth0-nextjs은(는) 무엇을 하나요?

Next.js 애플리케이션에 인증(로그인, 로그아웃, 보호된 페이지, 미들웨어, 서버 컴포넌트)을 추가할 때 사용하세요 - @auth0/nextjs-auth0 SDK를 사용하여 App Router와 Pages Router를 지원합니다.

개요

@auth0/nextjs-auth0 SDK는 Next.js 애플리케이션에 Auth0 인증을 통합하는 공식 라이브러리입니다. 이 스킬은 App Router와 Pages Router를 모두 지원하며, 서버 사이드 렌더링, 정적 사이트 생성, 미들웨어 등 Next.js의 다양한 기능과 함께 작동하도록 설계되었습니다.

설정 방법

  1. Auth0 애플리케이션 등록

    • Auth0 대시보드에서 애플리케이션을 생성하고 도메인, 클라이언트 ID, 클라이언트 시크릿을 확인합니다.
  2. 환경 변수 설정 .env.local 파일에 다음 변수를 추가합니다:

AUTH0_SECRET='your-long-secret-key'
AUTH0_BASE_URL='http://localhost:3000'
AUTH0_ISSUER_BASE_URL='https://your-tenant.auth0.com'
AUTH0_CLIENT_ID='your-client-id'
AUTH0_CLIENT_SECRET='your-client-secret'
  1. SDK 설치
npm install @auth0/nextjs-auth0

사용 방법

App Router

app/layout.js (또는 app/layout.tsx)에 UserProvider를 추가합니다:

import { UserProvider } from '@auth0/nextjs-auth0/client';

export default function RootLayout({ children }) {
  return (
    <html lang="ko">
      <body>
        <UserProvider>{children}</UserProvider>
      </body>
    </html>
  );
}

로그인 페이지

app/api/auth/[auth0]/route.js 파일을 생성합니다:

import { handleAuth } from '@auth0/nextjs-auth0';

export const GET = handleAuth();

로그인/로그아웃 링크

import { useUser } from '@auth0/nextjs-auth0/client';

export default function Home() {
  const { user, error, isLoading } = useUser();

  if (isLoading) return <div>로딩 중...</div>;
  if (error) return <div>{error.message}</div>;

  return (
    <div>
      {user ? (
        <div>
          <p>환영합니다, {user.name}님!</p>
          <a href="/api/auth/logout">로그아웃</a>
        </div>
      ) : (
        <a href="/api/auth/login">로그인</a>
      )}
    </div>
  );
}

보호된 페이지

import { withPageAuthRequired } from '@auth0/nextjs-auth0/client';

export default withPageAuthRequired(function Profile() {
  const { user } = useUser();
  return <div>사용자 프로필: {JSON.stringify(user)}</div>;
});

Pages Router

pages/api/auth/[...auth0].js 파일을 생성합니다:

import { handleAuth } from '@auth0/nextjs-auth0';

export default handleAuth();

로그인/로그아웃 링크

import { useUser } from '@auth0/nextjs-auth0/client';

export default function Home() {
  const { user, error, isLoading } = useUser();

  if (isLoading) return <div>로딩 중...</div>;
  if (error) return <div>{error.message}</div>;

  return (
    <div>
      {user ? (
        <div>
          <p>환영합니다, {user.name}님!</p>
          <a href="/api/auth/logout">로그아웃</a>
        </div>
      ) : (
        <a href="/api/auth/login">로그인</a>
      )}
    </div>
  );
}

보호된 페이지 (getServerSideProps)

import { withPageAuthRequired } from '@auth0/nextjs-auth0';

export const getServerSideProps = withPageAuthRequired();

export default function ProtectedPage({ user }) {
  return <div>보호된 페이지입니다, {user.name}님!</div>;
}

미들웨어를 사용한 라우트 보호

middleware.js (또는 middleware.ts) 파일을 생성하여 특정 경로를 보호합니다:

import { withMiddlewareAuthRequired } from '@auth0/nextjs-auth0/middleware';

export default withMiddlewareAuthRequired();

export const config = {
  matcher: '/protected/:path*',
};

서버 컴포넌트에서의 인증

import { getSession } from '@auth0/nextjs-auth0';
import { redirect } from 'next/navigation';

export default async function ServerComponent() {
  const session = await getSession();
  if (!session) {
    redirect('/api/auth/login');
  }
  return <div>환영합니다, {session.user.name}님!</div>;
}

참고 사항

  • AUTH0_SECRET은 32자 이상의 무작위 문자열이어야 합니다.
  • 프로덕션 환경에서는 AUTH0_BASE_URL, AUTH0_ISSUER_BASE_URL, AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET을 환경 변수로 설정하세요.
  • 자세한 내용은 공식 문서를 참조하세요.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

관련 스킬