Supabase에서 데이터가 에러 없이 빈 배열로 올 때 (RLS)

이런 증상이라면

supabase.from(...).select() 했는데 error는 null인데 data가 빈 배열([])로 옵니다. 분명 테이블에는 행이 있습니다.

🔎 이 문제는 대부분 코드가 아니라 대시보드·설정에 있습니다. AI에게 코드를 고쳐달라고 반복해도 안 풀리는 이유예요.

흔한 원인 (가능성 순)

1RLS가 켜졌는데 SELECT 정책이 없음대시보드

RLS를 켜면 기본이 "전부 거부"입니다. SELECT를 허용하는 정책이 없으면 에러 없이 0행이 반환됩니다. (권한 없음이 곧 빈 결과)

2정책 조건이 현재 유저와 안 맞음대시보드

user_id = auth.uid() 같은 정책인데 로그인이 안 됐거나(anon), 행의 소유자가 다른 유저면 걸러집니다.

확인·해결 순서

  1. Supabase > Authentication/Table Editor에서 해당 테이블의 RLS Policies 확인
  2. SELECT용 정책 추가 (예: 로그인 유저 본인 데이터면 auth.uid() = user_id)
  3. SQL Editor에서 정책 유무에 따라 결과가 달라지는지 확인
  4. 서버 전용 작업은 service_role 키 사용(RLS 우회, 절대 클라이언트에 노출 금지)

자주 묻는 질문

왜 에러가 아니라 빈 배열인가요?

RLS는 "이 행을 볼 권한이 없음"을 에러가 아니라 "그 행이 없는 것처럼" 처리합니다. 그래서 error=null, data=[]가 됩니다.

RLS를 끄면 되나요?

개발 중 임시로는 가능하지만, 공개 앱에서 끄면 누구나 모든 데이터를 읽을 수 있어 위험합니다. 정책을 제대로 만드는 게 맞습니다.

위를 다 해봤는데도, 또는 AI(Cursor·Claude)한테 물어봐도 계속 같은 에러라면 — 에러 로그를 붙여넣으면 60초 안에 진짜 원인을 짚어드려요.

이 문제 무료로 AI 진단받기

관련 문제