안전 & 권한권한보안팀필독
권한 모델 — owner · member · viewer
Tabple 의 모든 권한 체크는 lib/apiAuth.ts 의 canRead/canWrite 가 SSOT. 역할별로 무엇을 할 수 있고 못 하는지 명확히.
약 4분 2026년 5월 11일 업데이트
역할 한 줄 요약
- owner — 프로젝트의 모든 권한 + 멤버 관리 + 프로젝트 삭제. 보통 프로젝트 생성자가 자동 owner.
- member — 태스크/위키/DB/채팅 모두 읽기·쓰기. 멤버 초대 가능. 프로젝트 자체 설정·삭제 불가.
- viewer — 읽기만 가능. 댓글·반응도 막힘. 무료 가이드/리뷰어 등 외부 협업에 적합.
역할별 권한 매트릭스
- 프로젝트 설정·삭제: owner ✓ / member ✗ / viewer ✗
- 멤버 초대·역할 변경: owner ✓ / member ✓ (단 owner 지정은 불가) / viewer ✗
- 태스크 생성·편집·이동: owner ✓ / member ✓ / viewer ✗
- 위키 페이지 작성·편집: owner ✓ / member ✓ / viewer ✗
- 채팅 메시지·댓글 작성: owner ✓ / member ✓ / viewer ✗
- DB 레코드·필드 변경: owner ✓ / member ✓ / viewer ✗
- 페이지 외부 공개 게시: owner ✓ / member ✓ (Pro 플랜 한정) / viewer ✗
- 읽기 (보기): owner ✓ / member ✓ / viewer ✓
✓ = 가능, ✗ = 불가. 시스템 관리자(user.role === 'admin') 는 모든 권한 자동 우회.
역할 변경
1
프로젝트 → 설정 → 멤버 관리
owner 만 진입 가능. 멤버 목록 옆 역할 드롭다운.
2
역할 선택
owner ↔ member ↔ viewer 자유 변경. 단, 본인의 owner 권한은 다른 멤버에게 양도 후 본인은 owner 가 더 이상 아님.
주의프로젝트에 owner 가 최소 1명은 있어야 합니다. 단독 owner 가 자신을 강등하려 하면 안내가 표시되며 차단.
3
변경 결과
권한 변경은 즉시 반영. 영향 받는 사용자는 다음 액션 시 새 권한으로 동작합니다.
참고변경 알림이 해당 사용자에게 자동 발송.
API 가드 (개발자 참고)
getAuthUser(req)— 세션 확인, 미인증 시 unauthorized()getProjectAccess(projectId, userId)— { role, isPublic } 반환. null 이면 비멤버 + 비공개 → 404canRead(role, isSystemAdmin)— viewer 이상이면 truecanWrite(role, isSystemAdmin)— member 이상이면 true- 공개 프로젝트는
access.isPublic으로 read 만 우회 (FEATURES.publicProjects 활성 시)
모든 API 라우트는 lib/apiAuth.ts 의 헬퍼로 권한을 검증합니다.
권한 회피 패턴 — 안전한 외부 협업
- 외부 리뷰어 → viewer 로 초대 → 의견은 별도 채널 (이메일/슬랙) 로 수렴
- 임시 협업자 → member 로 초대 → 작업 종료 시 viewer 로 강등 (삭제 대신, 본인의 작성 이력 보존)
- 공개 페이지 →
publish-pages가이드 참조 (Pro 한정, 별도 외부 URL 발행) - 외부 폼 응답 수집 → 데이터베이스의 공개 폼 뷰 (로그인 불필요)