사소한 개발팁

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 설계 시 주의사항

보안 팁

  1. 기본적으로 모든 접근을 차단하고 필요한 권한만 점진적으로 부여
  2. auth.uid()를 활용한 사용자 식별
  3. 복잡한 정책은 가독성을 위해 함수로 분리

흔한 실수

  • 너무 느슨한 접근 정책 설정
  • 보안 정책 누락
  • 성능을 고려하지 않은 복잡한 정책

디버깅 및 테스트 방법

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는 단순한 기능이 아니라 애플리케이션 보안의 핵심입니다. 초기에는 복잡해 보일 수 있지만, 점진적으로 학습하고 적용하면 강력한 데이터 보호 메커니즘을 구축할 수 있습니다.

반응형