배경
Supabase를 백엔드 데이터베이스로 활용하여 개발을 진행하던 중, 대시보드의 Advisor 기능에서 모든 테이블에 대해 SECURITY 레벨의 에러 로그가 발생한 것을 확인했다. 경고명은 "RLS Disabled in Public"이었으며, public.users, public.posts 등 생성한 모든 테이블이 대상이었다.
원인 분석
이 경고는 Supabase의 핵심 기능인 PostgREST와 관련이 있다. Supabase는 기본적으로 데이터베이스의 테이블을 REST API 형태로 외부에 노출한다. 이때 RLS(Row Level Security, 행 수준 보안)가 비활성화되어 있으면, 프로젝트의 공개 키(Anon Key)만 가진 익명의 사용자도 API를 통해 테이블의 모든 데이터를 조회하거나 수정할 수 있는 상태가 된다. 즉, 데이터베이스의 대문이 열려 있는 셈이다.
아키텍처에 따른 해결 방향 판단
일반적인 Supabase 사용 패턴(Serverless)이라면 CREATE POLICY 명령어로 "작성자 본인만 수정 가능"과 같은 구체적인 보안 정책을 설정해야 한다.
하지만 현재 내 프로젝트는 [Next.js (프론트) → FastAPI (백엔드) → Supabase (DB)]의 구조를 가지고 있다.
- 프론트엔드가 DB에 직접 접근하지 않는다.
- 모든 데이터 접근은 FastAPI 백엔드가 수행한다.
- 백엔드는 SQLAlchemy를 통해 DB 연결 문자열(Connection String)로 직접 접속한다.
백엔드 서버가 DB의 관리자 권한으로 접속하기 때문에, Supabase가 열어주는 공개 API 구멍은 필요가 없다. 따라서 복잡한 정책을 세울 필요 없이, RLS를 활성화하여 외부 접근을 원천 차단(Deny All)하는 것이 가장 깔끔하고 안전한 해결책이라고 판단했다.
해결 과정
Supabase SQL Editor에서 모든 테이블에 대해 RLS를 활성화하는 쿼리를 실행했다.
-- 마이그레이션 관리 테이블
ALTER TABLE public.alembic_version ENABLE ROW LEVEL SECURITY;
-- 사용자 관련 테이블
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.email_verifications ENABLE ROW LEVEL SECURITY;
-- 커뮤니티 데이터 테이블
ALTER TABLE public.posts ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.comments ENABLE ROW LEVEL SECURITY;
-- (나머지 테이블도 동일하게 적용)
결과
쿼리 실행 후 대시보드의 보안 경고가 모두 사라졌다. 외부에서 Supabase API를 통한 직접 접근은 차단되었지만, FastAPI 백엔드는 DB 연결 문자열을 통해 직접 통신하므로 RLS 설정의 영향을 받지 않고 정상적으로 동작함을 확인했다. Supabase를 BaaS 용도가 아닌 관리형 PostgreSQL로 사용할 때는 RLS를 켜두는 것이 보안상 필수적임을 확인했다.
'troubleshooting' 카테고리의 다른 글
| 게시글 조회 성능 최적화(N+1) 및 렌더링 예외 처리 (0) | 2026.01.08 |
|---|---|
| AWS Lambda 배포 시 로컬과 런타임의 Python 버전 불일치 문제 (1) | 2026.01.05 |
| TypeError : r.map is not a function (1) | 2023.12.22 |
| TypeError: Cannot read properties of undefined (reading 'length') (0) | 2023.12.21 |
| cannot read properties of null (reading 'scrollTop')_MUI error (0) | 2023.12.13 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!