RLS란?
Supabase 본격적으로 사용하다보면, RLS를 접하게 되는데요. 이 RLS 개념이 상당히 편리한 기능입니다.
Row Level Security , 즉 DB 의 특정 필드의 값을 채크하여 query 시 Row 단위로 제외 시킬 수 있는 방식입니다.
id | user_id | created_at | title | content | team_id |
1 | mika | 11 | 안녕하세요. | 개발 진행 합니다. | 1 |
2 | other | 12 | 개발 의뢰 합니다 | 이런거 개발해 주세요. | 2 |
말로 표현하려니 좀 어려웠는데요.
위와 같은 table이 있다고 한다면, user_id 가 mika. 인 데이터만 가져오려고 한다면,
query시 user_id 가 mika 인 조건을 추가해서 client에서 호출하면 됩니다.
그러나, 만약 클라이언트 개발자가 이 과정에서 특정 경우에 조건을 추가하지 않았다면, 다른 사람의 정보들까지 노출되버리겠죠.
이를 시스템 상으로 보완할수 있는 하나의 방법이 RLS 입니다.
RLS에 기본적인 예제로 acceess token에서 auth 정보를 가져와서 접근 권한을 설정할 수 있기 때문에, 로그인한 사용자에게 맞춰서 데이터를 필터링 할 수 있게 됩니다.
문제는 뷰 (View)
View 는 기본적으로 RLS가 적용 안됩니다.
VIEW로 쿼리할때 데이터가 필터링 안되는지 몇시간 고민하다 찾게 된 사항입니다.
만약 View를 만들어서 사용하려면, View를 만들때 RLS가 적용되도록 해야합니다.
WITH ( security_invoker = TRUE )
view 생성시 이렇게 security_invoker를 설정해주면 RLS가 적용됩니다.
create or replace view
[view이름] WITH ( security_invoker = TRUE ) as
select * form [talbe이름]
아래와 같은 형식이 되겠죠..
create or replace view
public.myview WITH ( security_invoker = TRUE ) as
select
mydata.*
user_profiles.name as user_name,
user_profiles.email as user_email,
org.name as org_name,
sites.name as site_name
from
mydata
left join user_profiles on mydata.user_id = user_profiles.id
left join org on mydata.org_id = org.id
...
ALTER를 이용하여 기존의 View에 적용하는 방법.
View는 RLS 를 설정 할 수 없습니다. 이걸로 좌절하고 주말을 보냈는데, 찾다보니 방법이 있더군요.
ALTER VIEW my_view SET (security_invoker = on);
이렇게 설정을 하면 my_view 에서 query하는 table에 RLS가 적용 됩니다.
다만 이렇게 했을때 문제는 my_view 가 접근하는 모든 table에 RLS가 잘 적용 되어있어야 동작 한다는 것입니다.
a table은 접근 권한이 있고 b table은 접근 권한이 없으면 퍼미션 에러가 발생합니다.
View 뿐만 아니라, Table 에서도 마찬가지 입니다.
(이건 시스템을 어떻게 설계하느냐의 문제이기 때문에 이런 부분 고려해서 설계하면 좋겠네요)
RLS를 활용하여 내 서비스의 기능을 발전 시켜 나가보세요~
#해피코딩!!
'Supabase' 카테고리의 다른 글
[supabase] DB table UPDATE 시 Permission Denied? RLS와 GRANT로 해결하는 법 (0) | 2025.04.04 |
---|---|
[supabase] Auth Hooking 을 이용한 그룹별 DB access 권한 제한 (0) | 2025.01.24 |
[supabase] postgres plv8 활성화 (0) | 2025.01.24 |
[Supabase] Edge function 만들기 (0) | 2024.12.11 |
[Flutter] supabase database 의 json 내부 query하기 (0) | 2024.09.19 |