[TroubleShooting] Supabase RLS 보안 이슈

ttining·2025년 5월 14일

💥문제 요약 (Problem)

개인 웹사이트의 데이터베이스를 Supabase로 구축해 사용하고 있던 중, Supabase로부터 보안 경고 이메일을 받았다.

내용을 요약하면, Supabase의 보안 관리자(Security Advisor)에서 일부 테이블 설정이 보안상 취약할 수 있음을 감지했고, 이에 대한 검토를 권장하는 주간 알림이었다.

If these are not intentional, they could result in unauthorized access to your database. We recommend taking these warnings seriously. We have a robust set of security checks which you can read about in our docs.




🔍 원인 분석 (Root Cause)

개인 웹사이트의 개발을 위해 Supabase 테이블에 클라이언트에서 직접 접근하도록 구성했고, 이를 위해 모든 테이블에 대해 RLS(Row Level Security)를 활성화했다.
이후 Supabase의 이메일을 통해 Advisors > Security Advisor 대시보드에서 아래와 같은 오류를 확인했다.

🚫 에러 메시지

Issue
Table public.my_table is public, but RLS has not been enabled.

Description
Detects cases where row level security (RLS) has not been enabled on tables in schemas exposed to PostgREST


이 메시지는 일반적으로 다음 두 가지 상황에서 발생한다.

  1. RLS가 활성화되지 않은 경우
    • RLS를 설정하지 않으면, 공개된 스키마를 통해 누구나 해당 테이블의 데이터에 접근할 수 있어 보안상 취약하다.
  2. RLS는 활성화했지만 정책이 정의되지 않은 경우
    • Supabase에서는 RLS가 활성화된 테이블에 대해 최소 하나 이상의 정책이 반드시 필요하다.
    • 그렇지 않으면 기본적으로 모든 접근이 차단되며, 쿼리 실행 시 오류가 발생하게 된다.

✅ Supabase에서 RLS를 설정하는 이유

📌 RLS (Row Level Security)란,

PostgreSQL의 기능으로, 사용자가 허용된 행(row)에만 접근하거나 수정할 수 있도록 제한하는 보안 메커니즘이다.

🔍 설정 목적 요약

  • 보안 강화
    인증된 사용자에게만 조건에 맞는 데이터를 제공
  • 유저 데이터 격리 (Multi-tenancy)
    여러 사용자의 데이터를 하나의 테이블에서 격리하여 안전하게 처리
  • 프론트엔드 직접 쿼리 허용을 위한 보호
    Supabase는 클라이언트에서 직접 DB에 접근할 수 있으므로, RLS 없이 운영 시 전체 데이터가 노출될 위험이 있다.



💡 해결 방법 (Solution)

  1. RLS 활성화 여부 확인
    Supabase Table Editor 또는 SQL 콘솔에서 아래 명령으로 RLS가 활성화되어 있는지 확인할 수 있다.
    ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;
  2. 최소 1개의 정책 생성
    RLS가 활성화된 테이블에는 적어도 하나 이상의 SELECT, INSERT, UPDATE, DELETE 관련 정책이 필요하다.
  3. RLS만 활성화하고 정책이 없는 경우
    이 경우 Supabase는 모든 접근을 차단하게 되며, 보안 경고 혹은 쿼리 실패가 발생할 수 있다.
  4. 정책 동작 테스트
    설정한 정책이 실제로 의도대로 동작하는지 테스트를 통해 반드시 검증한다.

📌 Supabase 공식 문서 - Row Level Security

profile
내가 보려고 만든 벨로그 *'-'*

0개의 댓글