사소한 개발팁
Supabase RLS 마스터하기: 데이터 보안의 핵심
냥냥박사에디
2025. 3. 27. 10:54
반응형
RLS가 왜 중요한가?
Supabase의 Row Level Security(RLS)는 단순한 보안 기능이 아니라 데이터베이스 수준의 강력한 접근 제어 메커니즘입니다. 전통적인 애플리케이션 레벨 인증과 달리, 데이터베이스 자체에서 행 단위로 접근을 제어할 수 있게 해줍니다.
RLS의 기본 원리 이해하기
1. RLS의 작동 방식
- 각 테이블에 대해 세밀한 접근 권한을 설정할 수 있음
- 사용자의 인증 정보와 함께 조건을 기반으로 데이터 접근을 제어
- 모든 쿼리(SELECT, INSERT, UPDATE, DELETE)에 즉시 적용
2. 기본 정책 유형
-- 모든 접근 거부 (가장 안전한 기본 상태)
CREATE POLICY "No access" ON your_table FOR ALL USING (false);
-- 인증된 사용자만 접근 허용
CREATE POLICY "Users can view own data"
ON your_table
FOR SELECT
USING (auth.uid() = user_id);
실제 시나리오별 RLS 정책 예시
사용자 프로필 테이블
-- 사용자는 오직 자신의 프로필만 수정 가능
CREATE POLICY "Users can update own profile"
ON profiles
FOR UPDATE
USING (auth.uid() = id);
할 일 목록 애플리케이션
-- 사용자는 오직 자신의 할 일만 볼 수 있음
CREATE POLICY "Users see only their todos"
ON todos
FOR SELECT
USING (auth.uid() = user_id);
-- 사용자는 자신의 할 일만 생성 가능
CREATE POLICY "Users create own todos"
ON todos
FOR INSERT
WITH CHECK (auth.uid() = user_id);
팀 프로젝트 협업 시나리오
-- 팀원들만 프로젝트 데이터에 접근 가능
CREATE POLICY "Team members can access project"
ON projects
FOR ALL
USING (auth.uid() IN (SELECT user_id FROM team_members WHERE team_id = projects.team_id));
RLS 설계 시 주의사항
보안 팁
- 기본적으로 모든 접근을 차단하고 필요한 권한만 점진적으로 부여
auth.uid()
를 활용한 사용자 식별- 복잡한 정책은 가독성을 위해 함수로 분리
흔한 실수
- 너무 느슨한 접근 정책 설정
- 보안 정책 누락
- 성능을 고려하지 않은 복잡한 정책
디버깅 및 테스트 방법
RLS 정책 확인
-- 현재 테이블의 모든 정책 조회
SELECT * FROM pg_policies WHERE tablename = 'your_table';
정책 비활성화 (테스트 목적)
-- 특정 테이블의 RLS 일시 중지
ALTER TABLE your_table DISABLE ROW LEVEL SECURITY;
고급 기법: 동적 정책
-- 사용자의 역할에 따른 동적 접근 제어
CREATE POLICY "Dynamic role-based access"
ON resources
FOR SELECT
USING (
CASE
WHEN auth.jwt()->>'role' = 'admin' THEN true
WHEN auth.jwt()->>'role' = 'manager' THEN department_id = get_user_department()
ELSE false
END
);
결론: RLS는 보안의 첫걸음
Supabase RLS는 단순한 기능이 아니라 애플리케이션 보안의 핵심입니다. 초기에는 복잡해 보일 수 있지만, 점진적으로 학습하고 적용하면 강력한 데이터 보호 메커니즘을 구축할 수 있습니다.
반응형