인증
Auth.js 기반 인증 시스템의 설정 방법과 구조를 설명합니다.
개요
kindie는 Auth.js v5를 사용하여 인증을 처리합니다. 다음 4가지 방식을 지원합니다:
- Credentials — 이메일/비밀번호
- Google OAuth
- 카카오 OAuth
- 네이버 OAuth
각 프로바이더는 기능 토글로 개별적으로 활성화/비활성화할 수 있습니다.
OAuth 설정
- Google Cloud Console에서 프로젝트 생성
- APIs & Services > Credentials > OAuth 2.0 Client ID 생성
- Authorized redirect URI:
https://your-domain.com/api/auth/callback/google - 클라이언트 ID와 시크릿을 환경변수에 설정:
AUTH_GOOGLE_ID="your-client-id"
AUTH_GOOGLE_SECRET="your-client-secret"카카오
- Kakao Developers에서 앱 생성
- 카카오 로그인 활성화
- Redirect URI:
https://your-domain.com/api/auth/callback/kakao - 앱 키 > REST API 키와 보안 > Client Secret을 환경변수에 설정:
AUTH_KAKAO_ID="your-rest-api-key"
AUTH_KAKAO_SECRET="your-client-secret"네이버
- Naver Developers에서 앱 등록
- 네아로(네이버 아이디로 로그인) 사용 API 추가
- Callback URL:
https://your-domain.com/api/auth/callback/naver - 클라이언트 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.ts의 routes 설정에 따라 프록시(proxy.ts)가 자동으로 라우트를 보호합니다:
// config.ts
export const routes = {
public: ["/", "/pricing", "/blog", "/legal"],
auth: ["/login", "/signup", "/verify"],
protected: ["/dashboard", "/settings", "/admin"],
admin: ["/admin"],
};public— 누구나 접근 가능auth— 인증 관련 페이지 그룹(현재는 별도 접근 제어 없음)protected— 로그인 사용자만 접근admin—role: "admin"사용자만 접근
역할 기반 접근 제어
사용자 역할은 users 테이블의 role 필드로 관리됩니다:
user— 기본 역할admin— 관리자 (관리자 페이지 접근 가능)
관리자 접근이 필요하면 DB에서 사용자 role을 admin으로 변경하세요.