왜 RLS는 협상 불가능한가
Row-Level Security 한 줄 누락이 전체 데이터 유출로 이어진 사례를 본 적 있다. JWT 검증, API Gateway, 모든 게 무용지물이 된다 — DB가 마지막 방어선이기 때문.
+ read full note− collapse
백엔드를 만들 때 가장 위험한 사고방식은 "앱 레이어에서 막으면 된다"는 것이다. 마이크로서비스, GraphQL 게이트웨이, 미들웨어 — 어디선가 한 곳만 새도 끝난다.
RLS는 데이터베이스 자체에 권한을 새기는 방식이다. SELECT, UPDATE, DELETE가 정책에 위배되면 DB가 거부한다. 앱 코드의 버그와 무관하게 작동한다.
추가 비용? 거의 없다. Postgres는 RLS를 위해 설계되었다. 단, 정책을 *틀리게* 쓰는 건 가능하니, has_role() 같은 SECURITY DEFINER 함수로 재귀 검사를 분리해야 한다.