피드로 돌아가기
Row-Level Security in Embedded Reporting: The Patterns That Actually Work for .NET SaaS
Dev.toDev.to
Security

임베디드 리포팅의 RLS 취약성은 클라이언트 사이드 TenantId 주입으로 교차 테넌트 데이터 유출이 발생한다

Row-Level Security in Embedded Reporting: The Patterns That Actually Work for .NET SaaS

Dotnet Report2026년 4월 1일3intermediate

Context

다중 테넌트 SaaS에서 임베디드 리포팅은 각 테넌트의 데이터를 격리하는 보안이 필수적이다. 클라이언트 사이드에서 TenantId를 가져오면 악의적 사용자가 값을 변조할 수 있어 교차 테넌트 데이터 유출이 발생한다.

Technical Solution

  • ASP.NET Core 서버 사이드 인증 세션에서 TenantId를 안전하게 추출한다
  • TenantRlsInterceptor를 통해 EF Core의 DbCommandInterceptor로 SESSION_CONTEXT에 TenantId를 설정한다
  • SQL Server RLS 함수(fn_tenantPredicate)와 보안 정책(TenantPolicy)을 적용하여 DB 계층에서도 데이터 격리를 보장한다
  • 사용자 수준 스코핑으로 테넌트 내 지역별 데이터 접근 제어를 구현한다

Impact

테넌트 격리 테스트(Report_ShouldNotReturnCrossTenantData)로 교차 테넌트 데이터 접근을 검증한다

Key Takeaway

임베디드 리포팅의 RLS는 클라이언트 주입 방지를 위해 서버 사이드 인증에 의존해야 하며 애플리케이션 레이어와 DB 레이어의 이중 방어 체계가 필요하다


ASP.NET Core 다중 테넌트 SaaS에서 EF Core DbCommandInterceptor와 SQL Server RLS 함수(fn_tenantPredicate)를 조합하면 클라이언트 TenantId 변조로 인한 교차 테넌트 데이터 유출을 원천 차단한다

원문 읽기