인수인계서 — 세션 86 (CMS Dashboard 회원 관리 체계 구현)
작성일: 2026-03-25 이전 세션: session85
작업 요약
cms-dashboard에 02-reusable-code/05-auth-rbac/ 패턴 기반 완전한 회원 관리 체계(인증/RBAC/관리자 UI) 구현. 35개 신규 + 4개 수정, 역할 체계 owner>admin>member>viewer.
수정 파일 (39개)
| # | 파일 | 변경 내용 |
|---|---|---|
| 1 | cms-dashboard/supabase/migrations/002_auth_members.sql | users+audit_logs 테이블, 트리거, RLS, RPC 마이그레이션 |
| 2 | cms-dashboard/src/lib/types/auth.ts | CmsRole, Member, AuditLog, MemberStats, ROLE_DISPLAY 타입 |
| 3 | cms-dashboard/src/lib/auth/types.ts | AuthUser, AuthSession, AuthState, AuthAction, AuthResult 타입 |
| 4 | cms-dashboard/src/lib/auth/config.ts | configureAuth() CMS 기본값 싱글톤 |
| 5 | cms-dashboard/src/lib/auth/messages.ts | 인증 메시지 (한/영) |
| 6 | cms-dashboard/src/lib/auth/adapter.ts | AuthAdapter 인터페이스 |
| 7 | cms-dashboard/src/lib/auth/adapters/supabase.ts | Supabase 어댑터 구현 |
| 8 | cms-dashboard/src/lib/auth/rbac.ts | CMS 권한 맵 15개 + 역할 계층 + 유틸 함수 |
| 9 | cms-dashboard/src/lib/auth/server.ts | getUser, requireAuth, requireRole 서버 함수 |
| 10 | cms-dashboard/src/lib/auth/api-guard.ts | withAuth(), withRole() API 래퍼 |
| 11 | cms-dashboard/src/lib/auth/middleware.ts | createAuthMiddleware() + matchRoute() |
| 12 | cms-dashboard/src/lib/auth/client/AuthProvider.tsx | React 인증 컨텍스트 + useReducer |
| 13 | cms-dashboard/src/lib/auth/client/useAuth.ts | signIn, signUp, signOut, resetPassword 훅 |
| 14 | cms-dashboard/src/lib/auth/client/useUser.ts | 프로필 조회/수정 훅 |
| 15 | cms-dashboard/src/lib/auth/client/usePermission.ts | can(), hasRole() 권한 체크 훅 |
| 16 | cms-dashboard/src/lib/auth/components/AuthGuard.tsx | 페이지 보호 컴포넌트 |
| 17 | cms-dashboard/src/lib/auth/components/PermissionGate.tsx | 조건부 렌더링 (Can 별칭) |
| 18 | cms-dashboard/src/lib/audit.ts | logAudit() 감사 로깅 유틸 |
| 19 | cms-dashboard/src/middleware.ts | Next.js 라우트 미들웨어 |
| 20 | cms-dashboard/src/app/login/page.tsx | 로그인 페이지 |
| 21 | cms-dashboard/src/app/signup/page.tsx | 회원가입 페이지 |
| 22 | cms-dashboard/src/app/auth/callback/route.ts | Supabase 인증 콜백 |
| 23 | cms-dashboard/src/app/auth/reset-password/page.tsx | 비밀번호 재설정 |
| 24 | cms-dashboard/src/app/profile/page.tsx | 프로필 조회/수정 |
| 25 | cms-dashboard/src/app/api/auth/me/route.ts | 내 프로필 API |
| 26 | cms-dashboard/src/app/api/admin/members/route.ts | 회원 목록 API |
| 27 | cms-dashboard/src/app/api/admin/members/[id]/route.ts | 회원 상세/수정 API |
| 28 | cms-dashboard/src/app/api/admin/audit/route.ts | 감사 로그 API |
| 29 | cms-dashboard/src/app/admin/layout.tsx | 관리자 레이아웃 (AuthGuard) |
| 30 | cms-dashboard/src/app/admin/page.tsx | 관리자 대시보드 |
| 31 | cms-dashboard/src/app/admin/members/page.tsx | 회원 목록 페이지 |
| 32 | cms-dashboard/src/app/admin/members/[id]/page.tsx | 회원 상세 페이지 |
| 33 | cms-dashboard/src/app/admin/audit/page.tsx | 감사 로그 뷰어 |
| 34 | cms-dashboard/src/components/providers.tsx | AuthProvider 래핑 |
| 35 | cms-dashboard/src/components/sidebar.tsx | 인증 인식 사이드바 |
| 36 | cms-dashboard/src/components/user-menu.tsx | 사용자 드롭다운 메뉴 |
| 37 | cms-dashboard/src/app/layout.tsx | Providers 래핑 + Sidebar 컴포넌트화 (수정) |
| 38 | cms-dashboard/src/app/api/documents/route.ts | POST에 withRole 추가 (수정) |
| 39 | cms-dashboard/src/app/api/documents/[id]/route.ts | PUT/DELETE에 withRole 추가 (수정) |
(folders/route.ts POST도 withRole 수정 — 총 4개 기존 파일 수정)
검증 결과
npx tsc --noEmit— 소스코드 에러 0개 (.next/dev/types 자동생성 에러는 dev 서버에서 자동 해소)
터치하지 않은 영역
- Supabase DB 마이그레이션 미적용 (002_auth_members.sql 실행 필요)
- 이메일 인증 흐름 (Supabase Auth 이메일 설정 필요)
- MFA (비활성 상태, 추후 활성화 가능)
- 문서 에디터 (/doc/[id]/edit — 세션 85에서도 미구현)
알려진 이슈
- 첫 사용자 승격 필요:
UPDATE users SET role = 'owner' WHERE email = '...'(SQL Editor) - Supabase Auth 이메일 발송 설정 필요 (회원가입 확인, 비밀번호 재설정)
다음 작업 제안
- Supabase에 002_auth_members.sql 마이그레이션 적용 — MCP 또는 SQL Editor
- 로컬 E2E 테스트 — 회원가입→로그인→문서 생성→관리자 역할 변경 흐름
- Supabase Auth 이메일 설정 — SMTP 또는 Supabase 기본 이메일 활성화
- 문서 에디터 구현 — /doc/[id]/edit 페이지 완성