피드로 돌아가기
Dev.toSecurity
원문 읽기
JWT 기반 RLS 설계를 통한 30분 내 멀티테넌시 데이터 보안 체계 구축
How to Add Row-Level Security to a Supabase App in Under 30 Minutes
AI 요약
Context
AI 코드 제너레이터의 빠른 스캐폴딩으로 인한 RLS 미설정 상태의 테이블 노출 위험 존재. 인증된 사용자라도 Table Name과 anon key만으로 타인 데이터에 접근 가능한 심각한 보안 결함 발생.
Technical Solution
- PostgreSQL RLS 활성화를 통한 기본 접근 모델을 'Explicit Permit' 방식으로 전환
- JWT 내 UUID를 반환하는 auth.uid() 함수와 테이블 내 user_id 컬럼을 비교하는 Boolean Expression 기반 필터링 설계
- SELECT 및 DELETE 작업 시 USING 절을 통한 대상 행(Row) 식별 및 접근 제어
- INSERT 작업 시 WITH CHECK 절을 적용하여 작성 데이터의 소유권 일치 여부 검증
- UPDATE 작업 시 USING으로 대상 행을 특정하고 WITH CHECK로 변경 후의 소유권 유지 강제
- Service Role Key 및 SECURITY DEFINER 함수를 통한 관리자 전용 RLS Bypass 경로 확보
실천 포인트
- RLS 활성화 즉시 모든 쿼리가 빈 결과를 반환하므로 SELECT 정책 우선 생성 필요 - Subquery 기반 정책 적용 시 인덱싱되지 않은 Join 컬럼으로 인한 Latency 증가 가능성 검토 - anon 롤에 대한 명시적 정책 부재 시 모든 비인증 요청이 차단됨을 인지하고 설계 - Realtime Subscription 적용 시 서버 측에서 RLS 정책이 먼저 평가됨을 확인