오프테이블 Wiki

결정 기록 · 결정 기록

ADR-0027: 최소 관리자 사용자 관리와 환경 분리

별도 관리자 앱에서 사용자 조회·검색·정지·해제만 제공하고 개발·운영 도메인과 Supabase를 격리한다.

상태
확정
신뢰도
높음
근거
3개
업데이트

맥락#

사용자 운영을 시작하려면 제품 화면과 분리된 내부 관리 표면이 필요하다. 첫 단계에서는 운영 기능을 넓히지 않고 사용자 상태 확인과 이용정지만 다룬다. [1]

결정#

  • 관리자 앱은 apps/admin/의 별도 Next.js 앱과 Vercel offtable-admin 프로젝트로 운영한다.
  • 개발은 admin-dev.offtable.krofftable-dev, 운영은 admin.offtable.krofftable-prod만 연결한다.
  • 로그인은 기존 Supabase 사용자에게 보내는 6자리 이메일 OTP이며 새 사용자를 만들지 않는다.
  • 관리자 권한은 비공개 DB grant로 판정한다. 앱에는 service role key를 두지 않는다.
  • 최소 기능은 사용자 목록, 이메일·표시 이름 검색, 상세 조회, 이용정지와 재활성화다.
  • 삭제, 대리 로그인, 비밀번호 조작, 관리자 역할 편집, 일괄 작업, 메시지 열람과 운영 지표는 제외한다.
  • 이용정지 상태는 비공개 테이블에 두고 일반 사용자에게 노출하지 않는다. 제품 DB의 RLS와 보호 화면은 정지 사용자를 함께 차단한다. [2]
  • 관리자 페이지는 공개 URL에서 접근할 수 있지만 noindex와 제품 로그인을 적용한다. Vercel Deployment Protection은 사용하지 않는다.

환경과 주소#

표는 좌우로 이동할 수 있습니다.
환경 관리자 주소 Supabase 브랜치
Development https://admin-dev.offtable.kr offtable-dev develop
Production https://admin.offtable.kr offtable-prod main

두 환경의 Auth 사용자, 관리자 grant, DB, 키와 쿠키는 공유하지 않는다. [3]

권한과 데이터 경계#

  • 일반 사용자는 관리자 grant와 이용정지 원본 테이블을 읽거나 수정할 수 없다.
  • 사용자 이메일과 최근 로그인 시각은 관리자 RPC가 권한을 확인한 뒤 필요한 필드만 반환한다.
  • 이용정지·해제는 관리자 RPC만 수행하고 자기 계정 정지는 거부한다.
  • 최초 관리자 부여는 저장소 밖의 일회성 운영 절차로 실행하며 이메일·UUID를 코드와 Wiki에 남기지 않는다.
  • 정지는 Supabase Auth 사용자를 삭제하거나 auth.users를 직접 수정하지 않는 애플리케이션 접근 차단이다.

재검토 조건#

  • 신고·제재 사유, 관리자 감사 로그와 복수 관리자 역할이 필요해진다.
  • 고객 지원에서 계정 삭제·복구 또는 법적 보존 절차가 필요해진다.
  • 관리자 수가 늘어 MFA, SSO, IP 제한 또는 별도 접근 게이트가 필요해진다.
  • 운영 데이터 접근 범위가 사용자 기본 정보보다 넓어진다.

관련 문서: Supabase 환경 격리, 보안 전환 게이트, 관리자 요구 원본

제목, 요약, 태그, 본문을 검색합니다.