노트

행 수준 보안 (RLS)

Row-Level Security

백엔드#db#security · 연결된 개념 3개

쉽게 말하면

행 수준 보안은 같은 서류함을 써도 각자 자기 칸만 열리게 자물쇠를 다는 DB 기능이에요. 앱이 '내 것만' 조건을 깜빡해도 DB가 남의 행은 아예 보여 주지 않죠.

비유가 깨지는 곳 서류함 주인은 자물쇠를 그냥 지나쳐요. 테이블 소유자와 슈퍼유저는 정책을 우회하니 앱 계정은 별도 롤로 두거나 FORCE를 걸고, 커넥션 풀에선 SET LOCAL로 설정이 새지 않게 해요.

행 수준 보안(Row-Level Security, RLS)은 테이블에 정책을 걸어, 같은 쿼리를 실행해도 현재 사용자가 볼 수 있는 행만 돌려주게 하는 DB 기능이다. PostgreSQL이 대표적이다. 애플리케이션이 WHERE 조건을 빠뜨려도 DB가 막아 준다.

ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
 
CREATE POLICY tenant_isolation ON orders
  USING (tenant_id = current_setting('app.current_tenant')::int);
 
-- 요청마다 현재 테넌트를 세션 설정에 넣고 쿼리
SET app.current_tenant = '42';
SELECT * FROM orders;   -- tenant_id = 42인 행만 보인다
  • USING은 읽기·수정·삭제 대상이 될 행을, WITH CHECK는 새로 쓰거나 바꾼 행이 만족해야 할 조건을 정한다
  • 테이블 소유자와 슈퍼유저는 기본적으로 정책을 우회한다. 앱이 쓰는 DB 계정은 소유자가 아닌 별도 롤(role)로 두거나 FORCE ROW LEVEL SECURITY를 건다
  • 커넥션 풀(connection pool)을 쓰면 세션 설정이 다음 요청으로 새지 않게 트랜잭션 단위(SET LOCAL)로 설정한다

전용 DB와의 관계

RLS는 멀티테넌시에서 공유 DB로 가면서도 격리를 지키는 저비용 수단이다. 테넌트마다 DB를 나누면(dedicated DB) 남의 데이터에 닿을 일이 없어 RLS가 필요 없다. 둘은 같은 문제의 다른 답이지, 한쪽이 다른 쪽을 이용하는 관계가 아니다.

장단점

  • 장점: 인가(authorization) 규칙이 데이터 바로 옆에 있어, 새 API나 관리 도구가 생겨도 같은 규칙이 적용된다(인증과 인가)
  • 단점: 정책 한 줄 실수가 그대로 유출로 이어지고, 복잡한 정책은 쿼리 성능에 영향을 준다. 정책을 테스트로 고정해 두는 것이 좋다

Supabase처럼 브라우저가 DB API를 직접 부르는 구조에서는 RLS가 사실상 주된 보안 경계다. 서버를 거치지 않는 요청을 어떻게 믿을지는 브라우저 요청과 서버 간 요청를 본다.

출처: PostgreSQL 문서: Row Security Policies

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

  • Oracle PL/SQL

    PL/SQL(Procedural Language/SQL)은 Oracle이 SQL에 변수·조건문·반복문·예외 처리를 더한 절차형 언어(procedural language)다. DB 안에서 함수·프로시저(stored procedure)·트리거(trigger)를 만들어 로직을 데이터 가까이에서 돌린다. 다른 DB에도 비슷한 것(PostgreSQL의 PL/pgSQL 등)이 있지만 문법은 제각각이다.

  • HTTP와 HTTPS

    HTTPS는 HTTP(Hypertext Transfer Protocol) 메시지를 TLS(Transport Layer Security)로 감싸 보내는 방식이다. HTTP 자체는 바뀌지 않고, 그 아래에 암호화 계층이 하나 끼어든다. 기본 포트는 HTTP가 80, HTTPS가 443이다.

  • Redis (인메모리 저장소)

    Redis는 데이터를 메모리에 두는 키-값 저장소(key-value store)다. 디스크 기반 DB보다 훨씬 빠르지만, 기본적으로 휘발성에 가깝게 다루는 것이 안전하다. 문자열뿐 아니라 리스트·해시·셋·정렬된 셋 같은 자료구조를 명령 하나로 다룬다.

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

보기 옵션