NextAuth.js

nextauth.js는 next.js애플리케이션에서 인증을 쉽게 구현할 수 있도록 해주는 오픈소스 라이브러리이다. OAuth, 이메일, 자격증명(credentials)등을 통해 사용자를 인증할 수 있으며, 인증세션을 관리하는 기능을 제공한다. Next.js의 API Routes와 긴밀하게 통합되어 서버리스 환경에서도 원활하게 작동한다. 

NextAuth.js의 주요 구성 요소

  1. Providers (인증 제공자)
    NextAuth.js는 다양한 인증 제공자(OAuth 제공자)를 지원한다.
    • 예: Google, GitHub, Facebook, Twitter 등
    • 또한, 자체 자격 증명(Credentials Provider)을 설정하여 커스텀 로그인 방식을 구현할 수도 있다.
  2. Session (세션 관리)
    사용자가 로그인하면 세션이 생성된다. 이 세션은 쿠키를 통해 클라이언트와 서버 간에 유지되며, 사용자의 로그인 상태를 확인하는 데 사용된다.
  3. Callbacks (콜백)
    로그인, 세션, JWT 등과 관련된 다양한 작업을 커스터마이징할 수 있도록 콜백 함수를 제공한다.
  4. Adapters
    사용자의 데이터를 데이터베이스에 저장하거나 읽어오는 작업을 처리한다. 예를 들어, MongoDB, PostgreSQL, MySQL 등을 지원한다.

NextAuth.js를 이용한 로그인 인증 방식

NextAuth 설정 파일 생성 ([...nextauth].ts)
pages/api/auth/[...nextauth].ts 또는 app/api/auth/[...nextauth]/route.ts 파일에서 인증 설정을 정의합니다.
주요 설정은 다음과 같습니다.

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

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
    }),
  ],
  callbacks: {
    async jwt({ token, account }) {
      if (account) {
        token.accessToken = account.access_token;
      }
      return token;
    },
    async session({ session, token }) {
      session.accessToken = token.accessToken;
      return session;
    },
  },
});

 

인증 과정 (OAuth 예제)

  • 1단계: 인증 제공자와 연결
    사용자가 로그인 버튼을 클릭하면 NextAuth는 설정된 OAuth 제공자(예: Google)의 로그인 페이지로 리다이렉트합니다.
  • 2단계: 인증 제공자의 인증 확인
    사용자가 이메일/비밀번호를 입력하거나, Google 계정을 승인하면 인증 제공자가 사용자 정보를 NextAuth.js로 반환합니다.
  • 3단계: JWT 토큰 생성
    NextAuth.js는 사용자 정보를 기반으로 JWT(Json Web Token)를 생성하여 사용자의 세션을 관리합니다.
  • 4단계: 세션 관리
    생성된 JWT는 쿠키에 저장되어 클라이언트와 서버 간의 통신에서 인증 상태를 유지합니다.

Custom Provider를 통한 자격 증명 인증
자격 증명 기반 인증을 구현하려면 CredentialsProvider를 설정합니다.

import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';

export default NextAuth({
  providers: [
    CredentialsProvider({
      name: 'Credentials',
      credentials: {
        email: { label: "Email", type: "text" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        const user = await authenticateUser(credentials.email, credentials.password);
        if (user) {
          return user; // 사용자 정보 반환
        }
        return null; // 인증 실패
      },
    }),
  ],
});

 

인증 방식의 특징 및 동작

  1. 상태 기반 인증 (Session-based Authentication)
    세션 정보는 쿠키에 저장되며, 요청마다 클라이언트가 쿠키를 서버로 전달합니다.
    • 장점: 사용자의 인증 상태를 쉽게 유지할 수 있음.
    • 단점: 쿠키에 대한 보안 관리 필요.
  2. JWT 기반 인증 (Token-based Authentication)
    JWT를 사용하여 클라이언트와 서버 간의 인증 상태를 유지합니다.
    • 장점: 상태 비저장(Stateless) 방식으로 확장성이 높음.
    • 단점: 토큰 탈취 방지를 위한 보안 조치 필요.
  3. 콜백을 통한 데이터 처리
    인증 후 사용자 데이터를 가공하거나, 데이터베이스와 연동하는 등의 작업을 콜백에서 처리할 수 있습니다.
    예: 사용자 역할(Role) 추가, 접근 제어.

클라이언트에서 로그인/로그아웃 처리

로그인 버튼
next-auth/react의 signIn 함수 사용

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

const LoginButton = () => (
  <button onClick={() => signIn('google')}>Login with Google</button>
);

 

로그아웃 버튼
signOut 함수 사용

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

const LogoutButton = () => (
  <button onClick={() => signOut()}>Logout</button>
);

 

사용자 세션 확인
useSession 훅 사용

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

const Profile = () => {
  const { data: session } = useSession();

  if (session) {
    return <p>Welcome, {session.user?.name}</p>;
  }

  return <p>Please log in.</p>;
};

 

 

NextAuth.js는 빠르게 인증 시스템을 구축하고자 할 때 매우 유용한 도구이며, 확장성과 커스터마이징 가능성도 뛰어납니다. 🛠️

+ Recent posts