ABOUT ME

에디가 작성하는 이것저것

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

    반응형
Designed by Tistory.