피드로 돌아가기
Dev.toSecurity
원문 읽기
Supabase RLS 설정 실수 방지를 통한 데이터 유출 원천 차단
Supabase RLS — 5 Common Mistakes I Broke and Fixed Myself
AI 요약
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 키가 포함되었는지 전수 조사