PostgreSQL RLS는 언제, 어떻게 적용해야 할까: 장단점 및 의문 정리

2025. 10. 12. 12:20Frontend

Row Level Security 장점

1. 데이터베이스 수준 보안

RLS는 쿼리 실행 시점에 정책(USING, WITH CHECK)을
WHERE 절로 삽입하여 “데이터 계층”에서 접근을 통제한다.

즉, 애플리케이션 계층을 우회하는 DB 접근도 차단 가능하다.

2. 정책 일괄 적용

RLS는 테이블 단위로 활성화되며,
정책은 SQL 명령(SELECT, UPDATE, DELETE 등) 별로 작성할 수 있다.

애플리케이션이나 ORM에서 별도 권한 필터링을 중복 구현할 필요가 없다.

*ORM: Object-Relation Mapper, SQL과 프로그래밍 언어 매핑 도구
예) Prisma

3. 애플리케이션 로직 단순화

권한 검증 로직이 DB 내부로 이동하므로,
API 계층에서는 단순히 쿼리만 실행하면 된다.

 

Row Level Security 단점

1. 정책 관리·디버깅 난이도

RLS 정책은 pg_policies, pg_catalog를 통해 조회할 수 있지만,
여러 정책이 중첩될 경우 실제 적용 결과를 추적하기 어렵다.

2. DBMS 종속성

PostgreSQL, SQL Server 등 일부 DBMS만 RLS를 기본 제공한다.
DB 마이그레이션 시 호환성 및 유지보수 부담이 존재한다.

3. 인증·식별 체계 필요

PostgreSQL은 세션 콘텍스트(current_setting)
또는 ROLE을 이용해 사용자 정보를 인식한다.

하지만, 실제 서비스 환경에서는
JWT, OAuth 등 외부 인증 시스템과 연동해야
사용자별 RLS 정책을 현실적으로 구현할 수 있다.

 

Row Level Security 의문점

1. RLS 활성화로 쿼리 성능이 저하될까?

RLS 정책은 쿼리 최적화(Planner) 단계에서
WHERE 절에 병합된다.

단순 정책은 성능에 거의 영향을 주지 않는다.

다만, 복잡한 조건, 다중 정책, 비효율적 인덱스 구성이 있는 경우
성능 저하가 발생할 수 있다.

 

2. claim(사용자 정보)으로만 정책을 작성해야 할까?

필수는 아니다.
PostgreSQL은 SET 명령으로 세션 변수에 사용자 정보를 설정할 수 있다.

claim은 단지 API나 애플리케이션에서
세션 정보를 DB에 전달하는 방법 중 하나일 뿐이다.

또한, ROLE 방식으로도 정책을 작성할 수 있다.

 

3. ROLE 기반 접근을 사용하지 않는 이유?

ROLE 기반 접근은 소규모 사용자 환경에서 유용하지만,
수천 명 이상의 사용자 환경에서는 각 사용자 별 ROLE 생성이 필요해 관리 측면에서 복잡하다.

따라서, 실제 서비스에서는
JWT 기반 사용자 식별값을 세션 변수에 주입하는 방식을 사용한다.

 

4. claim(사용자 정보)을 JWT로 사용하는 이유?

JWT는 서명(signature) 기반으로 위변조를 방지할 수 있고,
서버에서 유효성을 검증할 수 있다.

단순 세션 변수나 로컬 스토리지 값은 클라이언트 조작 위험이 있으므로,
JWT → 서버 검증 → DB 세션 변수 설정 → RLS 정책 적용 흐름이 안전하다.

 

5. claim 같은 식별 정보 없이 RLS 정책을 설정할 수 있을까?

가능하지만 실효성은 낮다.

식별 정보가 없으면 USING 절에 조건을 설정할 수 없으므로,
사실상 테이블 소유자만 접근 가능하고 이외 사용자는 모두 차단된다.

 If enabled and no policies exist for the table,
then a default-deny policy is applied.
- PostgreSQL Docs
-- RLS만 활성화 되어 있는 상태서는 DB 접근이 제한된다.
ALTER TABLE user_info ENABLE ROW LEVEL SECURITY;

 

 

같이 보기
1. 내가 뭔가 놓친 걸까, 아니면 사용자가 컬럼을 업데이트할 수 있을 때 RLS에 큰 보안 취약점이 있는 걸까? - reddit.com/r/Supabase
2. 여전히 Row Level Security가 필요할까? - reddit.com/r/Supabase
3. 프로덕션 환경에서의 RLS: 여러분의 경험이 필요합니다! - reddit.com/r/Supabase
4. Row Level Security(RLS) 사용 시 쿼리 성능 - reddit.com/r/Supabase
5. RLS는 중요한가요? - reddit.com/r/SQL

 

참고
위키피디아: 방어 깊이(Defense in Depth) — wikipedia.org
미디엄 블로그: Row Level Security (RLS) — medium.com
Supabase 문서: Row Level Security — supabase.com
PostgreSQL 공식 문서: DDL — Row Security Policies — postgresql.org
PostgreSQL 공식 문서: 관리 함수 — postgresql.org
PostgreSQL 공식 문서: ALTER TABLE 행 보안 — postgresql.org