코딩하는라민

[React, Supabase] 사용자별 데이터 접근 및 제어하기 (RLS Policy) 본문

Serverless/Supabase

[React, Supabase] 사용자별 데이터 접근 및 제어하기 (RLS Policy)

코딩하는라민 2024. 7. 11. 16:34
728x90
반응형

[React, Supabase] 사용자별 데이터 접근 및 제어하기 (RLS Policy)

 

 

가계부 캘린더를 예를 들어보자.

사용자는 캘린더에 가계부 내역을 등록하고, 본인의 내역만 조회, 수정, 삭제가 가능해야 한다.

 

서비스에 여러 사용자가 있다면 각 사용자가 동시에 Ledger 테이블에 접근하게 된다. 이 경우 게시판과 같이 공개된 데이터가 아닌 이상 자신의 데이터만 접근할 수 있어야 한다.

이를 위해 Supabase 에서 RLS 정책을 지원한다.

 

 

RLS(Row-Level Security) 정책이란?

`RLS` 는 데이터베이스의 보안 기능 중의 하나이다.

각 사용자가 자신의 데이터(row)만 접근할 수 있도록 제한하는 정책이다.

예를 들면, user1 이라는 사용자는 user_name 의 user1 데이터 행만 볼 수 있어야 하고, user2 사용자의 데이터는 볼 수 없어야 한다.

 

RLS 를 설정하는 이유

  1. 개인정보 보호 및 데이터 유출 방지
  2. 역할 기반 접근 제어 가능
  3. 데이터 무결성 보호
  4. 보안 강화

 

RLS 정책 생성 및 적용

ledger 라는 테이블이 있고 자신의 가계부 내역만 조회할 수 있도록 하려면 다음과 같이 SQL 문을 작성할 수 있다. 또한 데이터를 조회하는 것 뿐만 아니라 수정(Update), 삭제(Delete), 추가(Insert) 정책도 추가할 수 있다.

 

테이블 생성 예시

CREATE TABLE ledger (
    id SERIAL PRIMARY KEY,
    user_id UUID NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    category VARCHAR(255) NOT NULL,
    date DATE NOT NULL,
    description TEXT
);

정책을 적용하기 전 테이블을 준비해준다.

 

Policy 생성

조회(Select Policy)
-- 1. Select Policy
CREATE POLICY "Select own ledger"
  ON ledger
  FOR SELECT
  USING (user_id = auth.uid());
  • `CREATE POLICY "..."` : 정책을 설명하는 이름 설정
  • `ON 테이블명` : 정책을 적용할 테이블 지정
  • `FOR SELECT` : 데이터를 조회할 경우 적용
  • `USING (auth.uid() = user_id )` : 조건 지정(auth 의 uid 와 테이블의 user_id 가 일치하는 행만 조회)

 

수정(Update Policy)
-- 2. Update Policy
CREATE POLICY "Update own ledger"
  ON ledger
  FOR UPDATE
  USING (user_id = auth.uid());

 

삭제(Delete Policy)
-- 3. Delete Policy
CREATE POLICY "Delete own ledger"
  ON ledger
  FOR DELETE
  USING (user_id = auth.uid());

 

추가(Insert Policy)
-- 4. Insert Policy
CREATE POLICY "Insert ledger with correct user_id"
ON ledger
FOR INSERT
WITH CHECK (user_id = auth.uid());

위의 Select, Update, Delete 는 조건절이 `Using` 으로 시작했는데, Insert 는 조건절이 `With Check` 로 시작한다.

  • `Using 절` 은 이미 존재하는 행에 대한 접근 권한을 확인한다.
    • 대상 : SELECT, UPDATE, DELETE
  • `With Check 절` 은 존재하지 않는 행을 새로 삽입하는 것이기 때문에 현재 사용자가 auth에 등록된 유저인지 확인한다.(무결성 확인)
    • 대상 : INSERT 
    • 사용자가 임의로 user_id 를 조작해서 전송하는 것을 방지하기 위함

 

Policy 적용

ALTER TABLE ledger ENABLE ROW LEVEL SECURITY;

정책을 정의한 후 해당 테이블에 RLS 를 활성화해야 정상적으로 기능이 적용된다.

 

적용 완료

 


참고

728x90
반응형