다중 테넌시 아키텍처는 단일 애플리케이션 및 데이터베이스 인스턴스가 여러 클라이언트(테넌트)를 지원하는 방식입니다. 여기서 테넌트는 애플리케이션을 사용하는 회사 또는 조직을 의미하며, 공유 인프라에서 운영됨에도 불구하고 각 테넌트는 자신의 데이터에 대해 격리된 접근 권한을 가집니다. 다중 테넌시의 주요 유형으로는 ‘공유 데이터베이스, 공유 스키마’, ‘테넌트별 개별 데이터베이스’, ‘공유 데이터베이스, 테넌트별 개별 스키마’가 있으며, 이 중 가장 일반적인 ‘공유 데이터베이스, 공유 스키마’ 모델에서 PostgreSQL의 RLS를 통한 행 수준 데이터 격리가 중점적으로 다루어집니다.
PostgreSQL의 행 수준 보안(RLS)
PostgreSQL의 RLS는 런타임 정책에 기반하여 테이블 내의 특정 행에 대한 접근을 필터링하는 기능입니다. 이는 데이터 접근 규칙을 데이터베이스 내부에서 강제함으로써, 애플리케이션 로직에만 의존하는 방식보다 훨씬 안전한 데이터 격리 메커니즘을 제공합니다.
다중 테넌트 Rails 앱에서 RLS를 사용하는 이유
- 보안(Security): RLS는 데이터베이스 레벨에서 보안을 강제하므로, Rails 애플리케이션에서 필터링하는 것보다 훨씬 안전합니다. 이는 개발자가 실수로 필터링 로직을 누락하더라도 데이터 유출을 방지할 수 있습니다.
- 확장성(Scalability): 새로운 테넌트를 추가할 때 스키마를 변경할 필요가 없어 쉽게 확장할 수 있습니다.
- 유연성(Flexibility): 쿼리나 조인 작업 시 테넌트 간의 우발적인 데이터 유출을 효과적으로 방지합니다.
RLS의 주요 이점
- 데이터베이스 레벨에서 강력한 데이터 격리를 제공합니다.
- 우발적인 데이터 유출 가능성이 없습니다.
- 개발자가 Rails에서 필터링을 잊어도 작동합니다.
- 테넌트 수 증가에 따라 깔끔하게 확장됩니다.