피드로 돌아가기
I had real backend auth. The browser just walked around it.
Dev.toDev.to
Security

Supabase RLS 취약점 해결을 통한 API 보안 표면 최소화

I had real backend auth. The browser just walked around it.

Vadym Arnaut2026년 6월 17일4intermediate

Context

React, FastAPI, Supabase Postgres 기반 아키텍처에서 FastAPI를 통한 비즈니스 로직 검증 체계를 구축함. 하지만 브라우저에 노출된 Supabase anon key를 통해 클라이언트가 Backend를 우회하여 Database에 직접 접근 가능한 보안 허점이 존재함.

Technical Solution

  • RLS(Row Level Security) 정책이 단순 Row 접근 제어에 치중되어 Column-level 데이터 노출을 방지하지 못한 설계 결함 파악
  • quiz_options 테이블의 is_correct 컬럼에 대해 client role의 SELECT 권한을 REVOKE 하여 정답 유출 경로 차단
  • 기본 Postgres Grant 설정으로 인해 발생한 광범위한 쓰기 권한을 제거하기 위해 ALTER DEFAULT PRIVILEGES 적용
  • authenticated role의 모든 테이블 INSERT, UPDATE, DELETE 권한을 일괄 취소한 후 필요한 최소 권한만 개별 GRANT 하는 White-list 방식 도입
  • 브라우저-DB 직접 통신 경로를 Profile 수정 등 최소 기능으로 제한하고 나머지 모든 쓰기 요청을 FastAPI로 강제하는 구조로 변경

- Supabase-js 사용 시 RLS 설정을 단순한 DB 옵션이 아닌 외부 공개 API 명세로 인식하고 감사할 것 - 'Authenticated User' 권한 부여 시 Row 단위 제어뿐 아니라 Column 단위 SELECT 권한을 정밀하게 검토할 것 - Default Privileges를 통한 'Write-Nothing' 전략을 우선 적용하고 필요한 권한만 점진적으로 허용할 것 - Backend API가 존재하더라도 Client-DB 직접 연결 경로가 있다면 해당 경로의 권한 체계가 최우선 보안 계층임을 인지할 것

원문 읽기