Supabase RLS 완벽 가이드
Supabase Row Level Security(RLS)의 개념과 실전 사용법을 알아봅니다.
SupabaseDevOps
Supabase RLS 완벽 가이드
Row Level Security(RLS)는 Supabase의 핵심 보안 기능입니다.
RLS란?
PostgreSQL의 기능으로, 데이터베이스 레벨에서 행 단위 접근 제어를 제공합니다.
왜 RLS가 필요한가?
기존 방식의 문제점
// ❌ 애플리케이션 코드에서 권한 체크
async function getPosts(userId: string) {
if (!userId) throw new Error("Unauthorized");
return db.posts.where({ user_id: userId });
}문제:
- 코드에서 권한 체크를 깜빡할 수 있음
- 모든 API에 일일이 권한 체크 코드 작성
- 보안 로직이 분산됨
RLS 방식
-- ✅ 데이터베이스 레벨에서 권한 제어
CREATE POLICY "user_read_own"
ON posts FOR SELECT
USING (auth.uid() = user_id);장점:
- 데이터베이스가 자동으로 권한 체크
- 코드 간소화
- 보안 정책 중앙 관리
기본 사용법
1. RLS 활성화
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;2. 정책 생성
-- 공개 포스트 읽기
CREATE POLICY "public_read_published"
ON posts FOR SELECT
USING (status = 'published');
-- 본인 포스트 수정
CREATE POLICY "user_update_own"
ON posts FOR UPDATE
USING (auth.uid() = user_id);3. 클라이언트 코드
// RLS가 자동으로 권한 체크
const { data } = await supabase
.from("posts")
.select("*");
// 권한 체크 코드 불필요!실전 예제
블로그 포스트 RLS
-- 1. 누구나 published 포스트 읽기
CREATE POLICY "anyone_read_published"
ON posts FOR SELECT
USING (status = 'published');
-- 2. Admin만 모든 포스트 읽기
CREATE POLICY "admin_read_all"
ON posts FOR SELECT
USING (
auth.jwt() ->> 'role' = 'admin'
);
-- 3. Admin만 포스트 생성/수정/삭제
CREATE POLICY "admin_manage"
ON posts FOR ALL
USING (
auth.jwt() ->> 'role' = 'admin'
);주의사항
- 기본적으로 모두 거부: RLS 활성화 시 모든 접근이 차단됨
- 정책 순서: OR 연산으로 동작 (하나라도 통과하면 OK)
- 성능: 인덱스 활용 필수
RLS를 활용하면 안전하고 깔끔한 코드를 작성할 수 있습니다!
댓글 (3)
강민석2026.02.10 07:59
실전 프로젝트에서 RLS 적용하니 보안이 확실히 좋아졌어요. 추천합니다!
장하은2026.02.11 23:59
JWT role 기반 RLS 정책도 알려주시면 좋을 것 같습니다.
윤서준2026.02.12 03:59
RLS 정책 설정이 생각보다 복잡하네요. 좋은 자료 감사합니다!