Supabase RLS(Row Level Security)

JSK·2024년 8월 14일

로펀님의 Supabase 강의를 듣고 작성한 글입니다.

서론

Supabase의 RLS는 데이터베이스 테이블에 대해 아주 구체적으로 접근 권한을 설정할 수 있게 해주는 기능이다. 이 기능을 사용하면 어떤 사용자가 어떤 데이터를 CRUD 할 수 있는지 세밀하게 조정할 수 있다. 특정 조건을 만족하는 사용자만이 데이터를 접근할 수 있게 된다.

Policies

정책(Policy)은 특정 테이블의 데이터를 접근할 수 있는 조건을 정의하는데 사용된다. 정책은 마치 SQL문에 Where절을 추가하는 것과 비슷하다고 볼 수 있다. 각각의 정책은 하나의 테이블에 종속되고 하나의 테이블은 여러개의 정책들을 가질 수 있다. 아래는 정책 생성의 한 예시이다.

create policy "Individuals can view their own todos."
on todos for select
using ( (select auth.uid()) = user_id );

"Individuals can view their own todos." 라는 이름의 정책이 만들어졌다. 이 정책은 todos 테이블에 종속되어 있고 해당 테이블에 Select문이 실행될 때 적용된다. 구체적인 내용은 접속한 사용자가 todos 테이블의 user_id 컬럼값에 일치할 때 조회가 가능하다는 내용이다. 정책 생성시 사용된 auth.uid()는 Helper function으로 DB에 요청을 날린 사용자의 id를 반환한다. 이렇게 만든 정책을 SQL문으로 변환하면 아래와 같이 Where절이 붙은 형태로 볼 수 있다.

select *
from todos
where auth.uid() = todos.user_id;

RLS 적용하기

Supabase에 RLS를 적용하기 위해서는 아래와 같은 과정을 거친다.

  • RLS 활성화 : Dashboard > Table Editor > 테이블 선택 후 RLS disabled 버튼을 클릭해 RLS를 활성화 할 수 있다. 혹은 SQL문으로 테이블의 RLS를 활성화 할 수도 있다.

    alter table "table_name" enable row level security;
  • 정책(Policy) 만들기 : RLS를 활성화한 후에는 정책을 만들 수 있다. 이 정책은 데이터에 접근할 수 있는 조건을 정의하는데 사용된다. 예를 들어, “특정 이메일 주소를 가진 사용자만 테이블의 데이터를 수정할 수 있도록 하겠다”라는 식으로 설정할 수 있다.

  • 정책 설정 : 정책에 디테일한 설정을 추가해 데이터 보호를 세밀하게 할 수 있다.

    • 정책 이름 : 정책의 이름을 정할 수 있다.

    • 적용할 테이블 : 이 정책이 적용될 테이블을 선택한다.

    • 정책 동작 방식 : 정책이 어떻게 동작할지 정할 수 있다. PERMISSIVE와 RESTRICTIVE 둘 중 하나를 선택하게 된다. PERMISSIVE는 정책의 기본값으로 여러개의 PERMISSIVE 정책들이 테이블에 있다면 이들 중 하나만 만족해도 접근가능하다. OR 라고 생각하면 쉽다. 반대로 RESTRICTIVE는 단 하나의 RESTRICTIVE 정책이 테이블에 있다면 모든 RESTRICTIVE 정책들과 PERMISSIVE 정책들이 통과되어야 데이터에 접근할 수 있다.

    • 허용할 작업: SELECT, INSERT, UPDATE, DELETE 등 어떤 작업을 허용할지 설저할 수 있다.

    • 조건 설정: 데이터를 읽거나 수정할 때 만족해야 할 조건을 SQL로 작성할 수 있다.

결론

RLS를 사용해 Supabase의 데이터 안정성을 높이고 사용자별로 맞춤형 접근 권한을 설정할 수 있는 유용한 도구이다. 이를 통해 데이터 보호를 강화하고, 각 사용자에게 적절한 권한만 부여할 수 있다.

참조

profile
fullstack developer & maker

0개의 댓글