lifecarelog
백엔드

Supabase RLS 설계 시 실제로 실수한 패턴 3가지

Supabase Row Level Security를 처음 설정할 때 빠지기 쉬운 함정들이에요. CREATE TABLE이 anon 권한을 자동 부여한다는 게 가장 위험했어요.

3분 읽기

[예시 글] 실제 프로젝트에서 겪은 RLS 관련 실수를 정리했어요.

실수 1: CREATE TABLE 후 명시적 REVOKE를 안 했어요

Supabase에서 CREATE TABLE을 하면 anonauthenticated 롤에 자동으로 ALL privileges가 부여돼요. RLS를 켜도 이 기본 grant가 남아 있어요.

-- 테이블 생성 직후 반드시 실행
REVOKE ALL ON TABLE public.user_health_logs FROM anon, authenticated;
 
-- 필요한 권한만 다시 부여
GRANT SELECT, INSERT, UPDATE ON TABLE public.user_health_logs TO authenticated;

RLS만 설정하고 REVOKE를 안 하면, RLS 정책이 우회될 수 있는 상황이 생길 수 있어요.

실수 2: auth.uid() 패턴 혼동

RLS 정책에서 현재 사용자를 확인할 때 올바른 패턴을 써야 해요:

-- 올바른 패턴 (Supabase 2026 기준)
CREATE POLICY "users see own data"
ON public.user_health_logs
FOR SELECT
TO authenticated
USING ((SELECT auth.uid()) = user_id);

auth.uid()를 서브쿼리로 감싸는 게 성능상 더 좋아요. 매 행마다 함수를 호출하는 대신 한 번 평가해서 재사용하거든요.

실수 3: 마이그레이션 파일 존재 ≠ DB 적용

마이그레이션 파일을 만들었다고 DB에 적용된 건 아니에요. Supabase CLI로 실제 적용됐는지 확인해야 해요:

# 적용 상태 확인
supabase db diff
 
# 또는 직접 쿼리
SELECT tablename, rowsecurity
FROM pg_tables
WHERE schemaname = 'public';

"파일이 있으니까 됐겠지"라고 넘어갔다가 프로덕션에서 실제로 적용이 안 된 걸 뒤늦게 발견한 경험이 있어요. 항상 DB에서 직접 확인하세요.

정리

RLS 설계 순서: REVOKE 먼저 → RLS ENABLE → 정책 추가 → DB에서 확인. 이 순서를 지키면 대부분의 함정을 피할 수 있어요.

#supabase#rls#postgresql#security#backend

라이프케어로그 서비스가 궁금하신가요?

AI 기반 건강·일정·재활 관리 앱을 직접 써보세요.

서비스 살펴보기

관련 글