코딩 공부

Next.js에서 OAuth + RBAC(역할 기반 접근 제어) 구현하기

새혀니 2025. 3. 9. 17:51

 

  • OAuth(Open Authorization)를 활용한 로그인 처리
  • NextAuth.js와 RBAC(역할 기반 접근 제어)를 결합하여 사용자 권한 관리
  • Google, GitHub 등의 OAuth 제공자와 사용자 역할 설정 방법

npm install next-auth

 

pages/api/auth/[...nextauth].js (OAuth + RBAC 설정)

import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';
import GitHubProvider from 'next-auth/providers/github';

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
    GitHubProvider({
      clientId: process.env.GITHUB_CLIENT_ID,
      clientSecret: process.env.GITHUB_CLIENT_SECRET,
    }),
  ],
  callbacks: {
    async session({ session, token }) {
      session.user.role = token.role || 'user';
      return session;
    },
    async jwt({ token, user }) {
      if (user) {
        token.role = user.email === 'admin@example.com' ? 'admin' : 'user';
      }
      return token;
    },
  },
  secret: process.env.NEXTAUTH_SECRET,
});

 

pages/index.js (OAuth 로그인 UI)

import { signIn, signOut, useSession } from 'next-auth/react';

export default function Home() {
  const { data: session } = useSession();

  if (session) {
    return (
      <div>
        <h1>환영합니다, {session.user.name}!</h1>
        <p>이메일: {session.user.email}</p>
        <p>역할: {session.user.role}</p>
        <button onClick={() => signOut()}>로그아웃</button>
        {session.user.role === 'admin' && <p>관리자 전용 콘텐츠</p>}
      </div>
    );
  }

  return (
    <div>
      <h1>OAuth 로그인</h1>
      <button onClick={() => signIn('google')}>Google 로그인</button>
      <button onClick={() => signIn('github')}>GitHub 로그인</button>
    </div>
  );
}

 

환경 변수 설정 파일: .env.local

GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
NEXTAUTH_SECRET=your-random-secret

 

NextAuth.js를 활용하면 OAuth 로그인과 RBAC를 간편하게 구현 가능