🧵 "AI에게 72시간을 줬습니다" 챌린지 이야기를 보러 오셨나요? → 플레이북 페이지 바로가기
SUPABASE RLS · PRACTICAL KIT v1.0

RLS 진단에서 끝내지 말고
수정·테스트·CI까지

무료 RLS Guard로 위험을 찾고,
실전 처방전으로 고친 뒤 배포 전에 재발을 막으세요.

14,900원 24,900원
ZIP 즉시 다운로드 · 3일 이내 사유 불문 환불 · 평생 무료 업데이트

RLS가 잘못되면 실제로 무슨 일이 생기나

Supabase의 anon 키는 프론트엔드 코드에 그대로 노출됩니다(원래 그렇게 설계됨). 그래서 RLS가 유일한 방어선인데, 한 줄만 빠져도 이렇게 됩니다.

// 브라우저 콘솔이나 curl 한 줄이면 끝. RLS가 없거나 뚫려 있으면 fetch('https://your-project.supabase.co/rest/v1/orders', { headers: { apikey: '공개된 anon 키' } }) // → 전체 고객의 주문·이메일·결제정보가 그대로 응답으로 쏟아진다

실제 유출 사고 대부분이 이 패턴입니다. 테이블 RLS 활성화는 시작일 뿐이고 — INSERT의 WITH CHECK, 타 조직 교차 접근, Storage 버킷 조건, View·SECURITY DEFINER 함수의 우회까지 전부 막혀 있어야 합니다.

RLS Guard는 이 구멍들을 13개 규칙으로 배포 전에 잡아냅니다. 유료 킷은 그 결과를 실제 수정과 회귀 방지로 연결합니다.

구매하면 바로 받는 것

8쪽 실전 가이드

30분 점검 흐름과 위험도별 수정 우선순위

SQL 처방전 12종

개인 소유, 멀티테넌트, Storage, RPC, View, 함수

pgTAP 테스트 스타터

owner·other user의 허용/차단을 함께 검증

GitHub Actions CI

새 마이그레이션의 High/Critical 회귀 차단

실행 데모·Markdown 보고서

취약→수정→테스트 흐름과 PR에 남기는 검사 결과

72시간 AI 플레이북 보너스

이 상품을 실제로 만든 과정과 프롬프트 15종

한 번 고치고, 계속 막는 흐름

01 SCAN위험 진단
02 FIXSQL 수정
03 TEST역할 검증
04 BLOCKCI 차단

RLS Guard, 이렇게 씁니다 (3분)

설치도, 가입도, 로그인도 없습니다. Supabase 프로젝트의 SQL을 복사해 붙여넣기만 하면 됩니다.

1
마이그레이션 SQL을 복사

Supabase 대시보드의 SQL Editor, 또는 supabase/migrations/*.sql 파일 내용을 그대로 복사합니다. 여러 파일이면 순서대로 이어 붙여도 됩니다.

2
무료 스캐너에 붙여넣고 Scan

수 밀리초 만에 RLS 미설정, 항상 참인 정책, WITH CHECK 누락, View·함수 우회, 노출된 키까지 13종을 진단합니다. SQL은 브라우저 밖으로 나가지 않습니다.

3
발견 항목마다 나오는 수정 SQL을 복사·적용

각 위험에 "무엇이 왜 위험한지 + 바로 붙여넣을 수정 SQL"이 함께 나옵니다. 유료 킷은 여기에 역할별 테스트와 CI 차단까지 얹어 재발을 막습니다.

실제로 이렇게 잡아냅니다

아래는 흔한 실수 하나가 스캐너에서 어떻게 잡히고 어떻게 고쳐지는지 그대로 보여주는 예시입니다.

CRITICAL · RLS-001

붙여넣은 SQL — 얼핏 정상처럼 보입니다.

-- 주문 테이블을 만들었지만… create table public.orders ( id bigint primary key, user_id uuid references auth.users(id), total integer ); -- RLS를 켜지 않았다. anon 키만 있으면 모든 주문이 읽힌다.

RLS Guard 진단

🔴 public.orders 테이블에 RLS가 비활성화되어 있습니다. 공개 스키마의 테이블은 anon 키로 전체 행이 조회·수정될 수 있습니다.

함께 나오는 수정 SQL — 복사해서 붙여넣기만.

alter table public.orders enable row level security; create policy "본인 주문만 조회" on public.orders for select to authenticated using ((select auth.uid()) = user_id);

RLS-003(항상 참인 정책), RLS-004(INSERT의 WITH CHECK 누락), VIEW-001(View의 RLS 우회) 등 나머지 12종도 같은 방식으로 근거 + 수정 SQL을 함께 제시합니다.

어떤 로직으로 탐지하나

AI가 "느낌"으로 판단하는 게 아닙니다. 붙여넣은 SQL을 실제로 파싱해 최종 상태를 재구성하고, 규칙을 기계적으로 대조합니다.

1
SQL을 문장 단위로 파싱

주석·문자열·달러 인용($$…$$)을 건드리지 않고 안전하게 분리합니다. 주석 처리된 DDL이나 문자열 속 세미콜론에 속지 않습니다.

2
마이그레이션 최종 상태 재구성

여러 파일에 흩어진 CREATE/ALTER/DROP과 정책·권한·함수·View 변경을 순서대로 적용해 "지금 DB가 실제로 어떤 상태인지"를 계산합니다. 나중 마이그레이션이 앞의 정책을 덮으면 그것까지 반영합니다.

3
13개 규칙으로 대조

각 테이블·정책·역할·함수·View를 규칙에 통과시킵니다. 예: 노출 스키마 + created + RLS 미활성 → RLS-001(Critical), 정책 조건이 true → RLS-003, INSERT인데 WITH CHECK 없음 → RLS-004.

4
위험 + 근거 + 수정 SQL 출력

발견마다 "무엇이/왜 위험한지 + 어느 문장이 근거인지 + 어떻게 고치는지"를 함께 냅니다. 붙여넣은 SQL은 서버로 전송되지 않고 브라우저 안에서만 처리됩니다.

⚠️ 정규식·경량 파서 기반의 정적 분석입니다. 라이브 DB에 쿼리를 날려 검증하는 게 아니라 SQL 텍스트를 읽는 방식이라, 빠르고 안전한 대신 실행 시점 동적 로직까지는 보지 못합니다. "발견 0 = 안전 보장"은 아닙니다.

잡았으면, 이렇게 고칩니다

발견은 시작일 뿐입니다. 자주 나오는 위험 6가지의 수정 패턴을 그대로 정리했습니다. 무료 스캐너는 각 항목에 아래 방향을, 유료 킷은 시나리오별(개인 소유·멀티테넌트·Storage·RPC) 완성 SQL 12종과 검증 테스트를 제공합니다.

RLS-001 RLS가 꺼져 있음

테이블을 만들고 RLS를 안 켜면 anon 키로 전부 뚫립니다. 켜고, 소유자 조건 정책을 답니다.

alter table public.orders enable row level security; create policy "본인 것만" on public.orders for select to authenticated using ((select auth.uid()) = user_id);
RLS-003 항상 참인 정책 using (true)

정책은 있지만 조건이 true면 모두 통과입니다. 실제 소유자 조건으로 바꿉니다.

-- 위험: using (true) -- 수정: 소유자/테넌트 조건으로 교체 using ((select auth.uid()) = user_id)
RLS-004 INSERT에 WITH CHECK 없음

USING만 있으면 삽입 시 남의 user_id로 행을 넣을 수 있습니다. WITH CHECK로 삽입 값을 검증합니다.

create policy "본인 것만 삽입" on public.orders for insert to authenticated with check ((select auth.uid()) = user_id);
RLS-005/006 소유자 컬럼 미참조 · PUBLIC 대상

정책이 user_id를 안 보거나 to public이면 사실상 무방비입니다. 대상 역할을 authenticated로 좁히고 소유자 컬럼을 조건에 넣습니다.

to authenticated using ((select auth.uid()) = user_id)
VIEW-001 View가 RLS를 우회

기본 View는 소유자 권한으로 실행돼 기반 테이블의 RLS를 건너뜁니다. security_invoker로 호출자 권한으로 돌립니다.

create view public.order_totals with (security_invoker = true) as select user_id, sum(total) from public.orders group by user_id;
FUNC-001 SECURITY DEFINER 함수의 search_path 미고정

경로가 안 고정되면 권한 상승에 악용될 수 있습니다. search_path를 명시적으로 고정합니다.

alter function public.my_fn() set search_path = pg_catalog, public;

⚠️ 이 수정들은 대표 패턴입니다. 실제 스키마·업무 규칙(공개 데이터, 팀 공유, 관리자 접근 등)에 맞게 조정해야 하며, 적용 후 실제 역할로 테스트해 확인하세요. 유료 킷의 pgTAP 스타터가 owner·다른 사용자의 허용/차단을 자동 검증합니다.

이럴 때 씁니다

배포 직전 최종 점검

Supabase로 MVP를 올리기 전, "혹시 뚫린 테이블 없나?"를 30초 만에 훑습니다. 론칭 후 데이터 유출로 사과문 쓰는 것보다 쌉니다.

외주·인수인계 코드 검수

남이 짠 마이그레이션을 받았을 때, 정책이 실제로 안전한지 눈으로 읽지 않고 규칙으로 검증합니다.

PR마다 자동 차단 (유료 킷)

GitHub Actions에 넣어두면 새 마이그레이션이 High/Critical 위험을 들여올 때 CI가 머지를 막습니다. 사람이 매번 안 봐도 됩니다.

AI가 짠 SQL 검증

Claude·Cursor가 생성한 RLS 정책을 그대로 믿지 말고 붙여넣어 확인하세요. 생성형 코드의 조용한 보안 구멍을 잡습니다.

먼저 무료 도구로 확인하세요

결제 전에 RLS Guard 웹 스캐너를 직접 써보세요. SQL은 브라우저 밖으로 전송되지 않으며 가입도 필요 없습니다. 소스와 21개 회귀 테스트도 GitHub에 공개되어 있습니다.

이런 분께 맞습니다

  • Supabase로 MVP·사이드 프로젝트를 배포하는 개발자
  • RLS 정책은 만들었지만 타 사용자·타 조직 차단 테스트가 없는 팀
  • Security Advisor와 정적 검사를 PR·CI 흐름에 넣고 싶은 분

보안 인증서, 완성된 프로젝트별 감사, 수익 보장을 원하는 분께는 맞지 않습니다. 템플릿은 실제 스키마와 위협 모델에 맞게 검토해야 합니다.

자주 묻는 질문

수정까지 자동으로 해주나요?

아닙니다. RLS Guard는 탐지 + 수정 SQL 제안까지입니다. 데이터베이스를 자동으로 바꾸지 않습니다 — 이건 의도된 설계입니다. RLS는 서비스의 실제 권한 모델과 직결되므로(공개 데이터, 팀 공유, 관리자 접근 등 케이스마다 정답이 다름) 사람이 검토하고 적용해야 안전합니다. 도구는 붙여넣을 수 있는 수정 SQL을 주고, 적용·테스트는 여러분이 합니다. 유료 킷은 이 과정을 시나리오별 완성 SQL과 자동 테스트로 크게 줄여줍니다.

무료 RLS Guard와 무엇이 다른가요?

무료 도구는 위험을 찾고 수정 SQL을 제안하는 정적 스캐너입니다. 유료 킷은 그 수정을 시나리오별 완성 SQL 12종, 역할별 pgTAP 테스트, GitHub Actions CI, 운영 문서로 묶어 "고치고 → 검증하고 → 재발을 막는" 실행 체계로 만든 것입니다.

이걸 적용하면 보안이 보장되나요?

아닙니다. 정적 분석과 범용 템플릿은 완전한 감사를 대신하지 않습니다. 실제 역할 테스트, 앱 코드와 키 관리, 프로젝트별 사람 검토가 필요합니다.

무엇으로 열 수 있나요?

가이드는 PDF, 나머지는 Markdown·SQL·YAML·텍스트 파일입니다. VS Code 등 일반 편집기에서 바로 열 수 있습니다.

환불되나요?

결제 후 3일 이내 요청 시 사유 불문 전액 환불합니다. 래피드 구매 페이지 문의 채널로 연락해 주세요.

다음 migration부터
RLS 회귀를 남기지 마세요.

14,900원 24,900원
RLS Guard 실전 보안 킷 받기 →런칭 72시간 한정가 · 2026년 7월 21일 21:03 이후 24,900원