4. Row-Level Security (RLS) 정책 구현
Row-Level Security (RLS)는 조건에 따라 데이터베이스 행에 대한 액세스를 제한하여 사용자가 승인된 데이터만 보고 수정할 수 있도록 보장하는 Supabase의 강력한 기능입니다. 이는 중요한 보안 계층입니다.
4.1. 테이블에 RLS 활성화
기본적으로 RLS는 비활성화되어 있습니다. 행 수준 액세스 제어를 적용하려는 각 테이블에 대해 RLS를 활성화해야 합니다. Supabase 대시보드에서 인증 > 정책으로 이동하거나 SQL 명령을 실행합니다.
alter table todos enable row level security;
4.2. CRUD 작업을 위한 정책 생성
RLS가 활성화되면 정책을 생성하기 전까지는 테이블에 대한 모든 액세스가 거부됩니다. SELECT, INSERT, UPDATE, DELETE 작업을 위한 별도의 정책을 생성해야 합니다.
SELECT (읽기) 작업을 위한 정책:
인증된 사용자가 자신의 할 일을 읽을 수 있도록 허용합니다.
create policy "Users can view their own todos."
on todos for select
using (auth.uid() = user_id);
설명: auth.uid()는 현재 인증된 사용자의 ID를 반환하는 Supabase 함수입니다. 이 정책은 사용자가 user_id 열이 자신의 auth.uid()와 일치하는 행만 선택할 수 있도록 보장합니다.
INSERT (생성) 작업을 위한 정책:
인증된 사용자가 할 일을 생성할 수 있도록 허용하지만, user_id가 올바르게 설정되었는지 확인합니다.
create policy "Users can create their own todos."
on todos for insert
with check (auth.uid() = user_id);
설명: WITH CHECK 절은 삽입되는 새 행이 조건을 만족하는지 확인합니다 (즉, 삽입되는 user_id가 인증된 사용자의 ID와 일치하는지). 사용자가 다른 사용자를 위해 할 일을 삽입하려고 하면 거부됩니다.
UPDATE 작업을 위한 정책:
인증된 사용자가 자신의 할 일을 업데이트할 수 있도록 허용합니다.
create policy "Users can update their own todos."
on todos for update
using (auth.uid() = user_id);
DELETE 작업을 위한 정책:
인증된 사용자가 자신의 할 일을 삭제할 수 있도록 허용합니다.
create policy "Users can delete their own todos."
on todos for delete
using (auth.uid() = user_id);
4.3. RLS 정책 테스트
RLS를 구현한 후에는 다른 인증된 사용자와 인증되지 않은 요청으로 애플리케이션을 철저히 테스트하여 데이터 액세스가 올바르게 제한되는지 확인합니다. RLS의 장점은 데이터 요청이 어떻게 이루어지든 (예: Next.js 앱, API 클라이언트 또는 직접 SQL 쿼리를 통해) 데이터베이스 수준에서 이러한 규칙을 적용한다는 것입니다.
RLS는 안전한 다중 테넌트 애플리케이션 또는 세분화된 데이터 액세스 제어가 필요한 모든 애플리케이션을 구축하기 위한 초석입니다.