일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 타입스크립트
- 자바스크립트
- 코딩독학
- 세로메뉴바
- 웹디자인기능사실기
- CSS
- HTML
- Supabase
- 연산자
- 프론트엔드
- 웹퍼블리셔
- JavaScript
- 슬라이드전환
- 웹디실기
- 웹디자인기능사
- 코드공유
- 리액트
- github
- git
- PROJECT
- 정보처리기사
- 깃
- web
- JS
- react
- jQuery
- 비전공자
- 실기
- 렛츠기릿자바스크립트
- 생활코딩
Archives
- Today
- Total
코딩하는라민
[React, Supabase] 사용자별 데이터 접근 및 제어하기 (RLS Policy) 본문
728x90
반응형
[React, Supabase] 사용자별 데이터 접근 및 제어하기 (RLS Policy)
가계부 캘린더를 예를 들어보자.
사용자는 캘린더에 가계부 내역을 등록하고, 본인의 내역만 조회, 수정, 삭제가 가능해야 한다.
서비스에 여러 사용자가 있다면 각 사용자가 동시에 Ledger 테이블에 접근하게 된다. 이 경우 게시판과 같이 공개된 데이터가 아닌 이상 자신의 데이터만 접근할 수 있어야 한다.
이를 위해 Supabase 에서 RLS 정책을 지원한다.
RLS(Row-Level Security) 정책이란?
`RLS` 는 데이터베이스의 보안 기능 중의 하나이다.
각 사용자가 자신의 데이터(row)만 접근할 수 있도록 제한하는 정책이다.
예를 들면, user1 이라는 사용자는 user_name 의 user1 데이터 행만 볼 수 있어야 하고, user2 사용자의 데이터는 볼 수 없어야 한다.
RLS 를 설정하는 이유
- 개인정보 보호 및 데이터 유출 방지
- 역할 기반 접근 제어 가능
- 데이터 무결성 보호
- 보안 강화
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
반응형
'Serverless > Supabase' 카테고리의 다른 글
[Supabase] 사용자의 계정 소유 확인 및 로그인 성공 여부 파악은 어떻게 이루어지는가? (1) | 2024.09.18 |
---|---|
[React, Supabase] 이메일 회원가입 및 로그인 기능 구현 & 트리거 설정 (38) | 2024.06.26 |
[Supabase] JWTs(JSON Web Tokens) 공식문서 읽기 (27) | 2024.05.17 |
[Supabase] Supabase 로 백엔드 없이 Database 구축하기(기본 사용법) (31) | 2024.02.07 |