인증

Auth.js 기반 인증 시스템의 설정 방법과 구조를 설명합니다.

개요

kindie는 Auth.js v5를 사용하여 인증을 처리합니다. 다음 4가지 방식을 지원합니다:

  • Credentials — 이메일/비밀번호
  • Google OAuth
  • 카카오 OAuth
  • 네이버 OAuth

각 프로바이더는 기능 토글로 개별적으로 활성화/비활성화할 수 있습니다.

OAuth 설정

Google

  1. Google Cloud Console에서 프로젝트 생성
  2. APIs & Services > Credentials > OAuth 2.0 Client ID 생성
  3. Authorized redirect URI: https://your-domain.com/api/auth/callback/google
  4. 클라이언트 ID와 시크릿을 환경변수에 설정:
AUTH_GOOGLE_ID="your-client-id"
AUTH_GOOGLE_SECRET="your-client-secret"

카카오

  1. Kakao Developers에서 앱 생성
  2. 카카오 로그인 활성화
  3. Redirect URI: https://your-domain.com/api/auth/callback/kakao
  4. 앱 키 > REST API 키보안 > Client Secret을 환경변수에 설정:
AUTH_KAKAO_ID="your-rest-api-key"
AUTH_KAKAO_SECRET="your-client-secret"

네이버

  1. Naver Developers에서 앱 등록
  2. 네아로(네이버 아이디로 로그인) 사용 API 추가
  3. Callback URL: https://your-domain.com/api/auth/callback/naver
  4. 클라이언트 ID와 시크릿을 환경변수에 설정:
AUTH_NAVER_ID="your-client-id"
AUTH_NAVER_SECRET="your-client-secret"

핵심 파일

lib/auth.ts

인증 설정의 핵심 파일입니다. 프로바이더는 features.auth.* 토글과 환경변수 존재 여부를 기준으로 동적으로 등록됩니다:

const providers: Provider[] = [];

if (features.auth.google && process.env.AUTH_GOOGLE_ID && process.env.AUTH_GOOGLE_SECRET) {
  providers.push(Google({ ... }));
}

if (features.auth.kakao && process.env.AUTH_KAKAO_ID && process.env.AUTH_KAKAO_SECRET) {
  providers.push({ id: "kakao", ... });
}

if (features.auth.naver && process.env.AUTH_NAVER_ID && process.env.AUTH_NAVER_SECRET) {
  providers.push({ id: "naver", ... });
}

providers.push(Credentials({ ... }));

components/auth/social-buttons.tsx

OAuth 소셜 로그인 버튼 컴포넌트입니다. 서버에서 활성화된 프로바이더 목록을 조회해 버튼을 표시합니다.

라우트 보호

Middleware

config.tsroutes 설정에 따라 프록시(proxy.ts)가 자동으로 라우트를 보호합니다:

// config.ts
export const routes = {
  public: ["/", "/pricing", "/blog", "/legal"],
  auth: ["/login", "/signup", "/verify"],
  protected: ["/dashboard", "/settings", "/admin"],
  admin: ["/admin"],
};
  • public — 누구나 접근 가능
  • auth — 인증 관련 페이지 그룹(현재는 별도 접근 제어 없음)
  • protected — 로그인 사용자만 접근
  • adminrole: "admin" 사용자만 접근

역할 기반 접근 제어

사용자 역할은 users 테이블의 role 필드로 관리됩니다:

  • user — 기본 역할
  • admin — 관리자 (관리자 페이지 접근 가능)

관리자 접근이 필요하면 DB에서 사용자 roleadmin으로 변경하세요.