행 수준 보안(RLS)
PostgreSQL의 행 수준 보안(RLS)이란 무엇인가요?
행 수준 보안을 사용하면 CREATE POLICY로 만든 정책을 통해 각 역할이 어떤 행을 보거나 변경할 수 있는지 테이블이 행 단위로 결정할 수 있습니다.
행 수준 보안(RLS)은 쿼리가 반환하거나 수정할 수 있는 행을 역할별로 따로 제한합니다. 테이블에서 ALTER TABLE ... ENABLE ROW LEVEL SECURITY로 RLS를 활성화한 다음 CREATE POLICY로 정책을 추가합니다. 정책의 USING 식은 역할이 볼 수 있는 행을 걸러 내고, WITH CHECK 식은 어떤 새 행이나 수정된 행을 허용할지 결정합니다.
RLS가 켜져 있는데 적용되는 정책이 없으면 PostgreSQL은 기본 거부 정책을 사용합니다. 즉, 어떤 행도 보이지 않고 수정할 수도 없습니다. 슈퍼유저와 BYPASSRLS 속성을 가진 역할은 항상 행 보안을 우회하며, 테이블 소유자도 테이블에 FORCE ROW LEVEL SECURITY가 설정되어 있지 않으면 보통 우회합니다. 정책은 애플리케이션이 실제로 접속하는 역할로 테스트하세요.
예제
이 예제는 테이블에 RLS를 켜고, owner 열을 current_user와 비교하는 정책을 추가한 뒤, alice 역할로 테이블을 조회합니다. alice의 행만 반환됩니다. 설정 단계는 RLS를 우회하는 슈퍼유저로 실행되므로, 마지막 쿼리 전에 먼저 역할을 전환합니다.
CREATE TABLE notes (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
owner text NOT NULL,
body text NOT NULL
);
INSERT INTO notes (owner, body) VALUES ('alice', 'hello'), ('bob', 'hi');
ALTER TABLE notes ENABLE ROW LEVEL SECURITY;
CREATE POLICY notes_owner ON notes USING (owner = current_user);
CREATE ROLE alice;
GRANT SELECT ON notes TO alice;
SET ROLE alice;
SELECT * FROM notes;
RESET ROLE;확장 없이 기본 PostgreSQL 16 또는 17에서 실행되는 일반 SQL입니다. 버려도 되는 빈 데이터베이스에서 실행하세요.
출처
PostgreSQL 공식 문서(영문)입니다.