RLS는 workspace_id 기준 (user_id 단독 금지)

concept updated 2026-04-13

RLS는 workspace_id 기준

한 줄 정의

Multi-tenant 앱에서 RLS(Row Level Security)는 user_id 단독이 아닌 tenant_id(workspace_id) 기준으로 설계해야 한다.

핵심 내용

왜 user_id 단독이 위험한가:

  • 멤버가 workspace를 떠나면 user_id로 걸린 데이터가 **고아(orphan)**됨
  • workspace_id 기준이면 멤버 이탈과 무관하게 데이터 소유권 유지
-- ✅ workspace_id 기준
WHERE workspace_id = auth.jwt()->>'workspace_id'

-- ❌ user_id 단독 (고아 데이터 위험)
WHERE created_by = auth.uid()

예외:

  • workspace_members 테이블 자체 (user_id가 PK의 일부)
  • 개인 설정 (notification_preferences 등) — workspace와 무관한 데이터

적용 맥락

Supabase/PostgreSQL RLS를 사용하는 모든 multi-tenant SaaS. workspace_id = tenant_id 역할.

Relationships

related_to service_role은 API Route에서 금지 — RLS 우회 방지 패턴과 함께 적용