피드로 돌아가기
Supabase RLS — 5 Common Mistakes I Broke and Fixed Myself
Dev.toDev.to
Security

Supabase RLS 설정 실수 방지를 통한 데이터 유출 원천 차단

Supabase RLS — 5 Common Mistakes I Broke and Fixed Myself

LazyDev_OH2026년 4월 30일15intermediate

Context

PostgreSQL 기반의 Row Level Security(RLS)는 DB 계층에서 행 단위 접근 제어를 수행하는 보안 모델임. Supabase 환경에서 RLS 설정 단계의 파편화로 인해 보안 정책이 불완전하게 적용되어 데이터가 외부에 노출되는 취약점이 발생함.

Technical Solution

  • ALTER TABLE 명령어를 통한 RLS 명시적 활성화로 기본 Public 접근 차단
  • Implicit Deny 원칙에 따른 최소 한 개 이상의 허용 정책(Permissive Policy) 수립
  • auth.uid() 호출 시 서브쿼리 (SELECT auth.uid()) 패턴을 적용하여 행별 함수 실행 오버헤드 제거
  • UPDATE 작업 시 USING과 WITH CHECK 구문을 동시 적용하여 데이터 변조 및 권한 우회 방지
  • INSERT 정책 내 TO authenticated 명시를 통한 anon 역할의 무단 쓰기 권한 제한
  • service_role 키의 클라이언트 노출 차단 및 서버 사이드 환경 변수 격리 설계

- 신규 테이블 생성 직후 ENABLE ROW LEVEL SECURITY 실행 여부 확인 - pg_tables 뷰를 쿼리하여 RLS가 비활성화된 테이블이 있는지 CI/CD 단계에서 검증 - 모든 RLS 정책에 대해 TO authenticated 또는 TO anon 역할이 명확히 지정되었는지 검토 - 업데이트 정책 작성 시 WITH CHECK 구문 포함 여부 확인 - 클라이언트 환경 변수(NEXT_PUBLIC_)에 service_role 키가 포함되었는지 전수 조사

원문 읽기