데이터(RLS/스키마/DB), 네트워크(VLAN/VPC), 워크로드(NS/Quota)까지 다층 격리.
솔루션
멀티테넌시 설계
보안·격리·과금
멀티테넌시 설계
SaaS/게임/플랫폼 서비스에서 고객(테넌트)별로 안전한 격리와 예측 가능한 성능, 정확한 과금을 구현합니다. 데이터·네트워크·아이덴티티 전 계층을 아우르는 표준 아키텍처를 제공합니다.
Pool 기반부터 DB/클러스터 전용까지 워크로드·규모·규제에 맞게 선택.
테넌트 태깅/쿼터/레이트, 사용량 파이프라인으로 비용·한도·알림.
암호화(KMS), 감사로그, 디도스보호(프록시), 데이터 거버넌스 반영.
멀티테넌시 패턴 비교
| 패턴 | 격리 | 운영 난이도 | 적합 사례 | 비고 |
|---|---|---|---|---|
| Pooled(공용 테이블) | 열(tenant_id) 기준 | 낮음 | 초기 MVP, 수천 테넌트 | RLS 필수, 마이그레이션 용이 |
| Schema-per-tenant | 스키마 분리 | 중간 | 테넌트별 커스터마이징 | 마이그/백업 유연 |
| DB-per-tenant | DB 인스턴스 분리 | 높음 | 규제·대형 고객 | 비용↑, 성능·보안↑ |
| Cluster-per-tenant | 컴퓨트·네트워크 전면 분리 | 매우 높음 | 엄격 규제/독립 배포 | 최고 격리·비용/운영 부담 |
| * 패턴은 혼합 가능(예: 공용 + 특정 VIP는 전용 DB). | ||||
격리 레이어 & 권장 설정
| 레이어 | 권장 | 설명 |
|---|---|---|
| 데이터 | tenant_id + RLS / 스키마 분리 | DDL 표준화, 마이그레이션 파이프라인 제공 |
| 네트워크 | VLAN/VXLAN 세그먼트, L3 ACL | 테넌트 관리·백엔드망 분리, 디도스보호(프록시) |
| 컴퓨트 | Namespace/Project 격리 + Quota | CPU/메모리/스토리지/네트워크 한도 |
| 아이덴티티 | Org → Tenant → Project → Role | RBAC/ABAC 혼용, SSO(OIDC/SAML) |
| 키/암호화 | 테넌트별 KMS 키(KEK) | 객체·스냅샷·비밀값 암호화 |
PostgreSQL RLS 예시
-- 1) 앱 레벨: 인증 후 테넌트 컨텍스트 주입
SET LOCAL app.tenant_id = :tenant_uuid;
-- 2) 테이블: 테넌트 컬럼 + RLS 활성화
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_iso ON invoices
USING (tenant_id = current_setting('app.tenant_id')::uuid);
-- 3) 인덱스: (tenant_id, business_key)
CREATE INDEX ON invoices (tenant_id, created_at);
데이터 분할/아카이빙
- 핫/콜드 파티셔닝: 기간·테넌트 기준 파티션으로 비용 최적화
- 백업/스냅샷: 테넌트 단위 복구·내보내기 지원
- PII 마스킹: 뷰/정책으로 감사 접근 제어
역할/정책 모델
// 테넌트 정책(ABAC 예시)
{
"version": "2025-01",
"effect": "allow",
"action": ["project:read", "invoice:write"],
"resource": ["tenant/${tenant_id}/*"],
"condition": {"ip": "203.0.113.0/24", "mfa": true}
}
조직(Org)→테넌트→프로젝트 계층에 사용자/서비스 계정을 배치하고, RBAC(역할) + ABAC(속성)을 혼합합니다. SSO(OIDC/SAML)로 외부 IdP 연동.
API 게이트웨이 라우팅
# JWT의 tenant 클레임을 헤더로 전달(예시)
if ($jwt_tenant) {
proxy_set_header X-Tenant-ID $jwt_tenant;
}
proxy_pass http://backend;
인증 토큰의 테넌트 컨텍스트를 다운스트림으로 전달하고, 백엔드는 모든 쿼리에 tenant_id를 강제합니다.
세그멘테이션 & 방어
- VLAN/VXLAN로 테넌트/환경 분리, 보안그룹·ACL
- mTLS/서비스 간 허용목록(Zero Trust)
- 디도스보호(프록시)와 WAF로 엣지 보호
- 레이트 제한·스파이크 흡수(큐/버퍼)
NetworkPolicy 예시
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-tenant-a
spec:
podSelector:
matchLabels: { tenant: "a" }
policyTypes: [Ingress, Egress]
ingress:
- from: [{ podSelector: { matchLabels: { tenant: "a" }}}]
egress:
- to: [{ podSelector: { matchLabels: { tenant: "a" }}}]
SLO·과금·거버넌스 체크리스트
| 항목 | 권장 | 설명 |
|---|---|---|
| SLO | p95 지연/가용성 테넌트별 산출 | 에러버짓·알림·자동 완화 연계 |
| 한도/쿼터 | CPU/메모리/스토리지/요청 수 | 초과 시 서킷브레이커·백오프 |
| 비용 태깅 | 모든 리소스에 tenant tag | 월별 쇼백/차지백 보고서 |
| 보존 정책 | 로그·메트릭·스냅샷 주기 | 규정 준수(예: 1/3/12개월) |
로그·지표·트레이싱
- 모든 이벤트에
tenant_id태깅(로그/메트릭/스팬) - 대시보드: 테넌트 필터, 상위 에러/지연, 탑토커
- 샘플링: 기본 10% + 오류/지연 우선 샘플
감사 로그 포맷(예)
{"ts":"2025-08-31T12:00:01Z","tenant":"acme","actor":"u:kim","action":"role.assign",
"res":"tenant/acme/project/alpha","ip":"198.51.100.23","result":"ALLOW"}
싱글 → 멀티테넌시 전환(하이레벨)
- 도메인 모델 점검: 모든 핵심 엔터티에 tenant_id 도입
- 데이터 이동 계획: 파티션/스키마/DB 분리 전략 수립
- 인증/권한: 토큰 클레임·정책에 테넌트 컨텍스트 추가
- 배포: 카나리 → 블루/그린, 롤백 플랜
- 검증: 테넌트 경계 침범 테스트, 부하·격리·혼합 워크로드
베스트 프랙티스(요약)
기본은 RLS+인덱스 — 성능/안전 균형, VIP는 전용 DB 고려
IdP 통합 — SSO, SCIM 프로비저닝으로 사용자 수명주기 자동화
테넌트 태깅 — 리소스/로그/메트릭 일관 태그로 비용·보안 정합성
쿼터와 레이트 — 남용 방지, 공정한 자원 배분
키 계층화 — 마스터/테넌트/데이터 키 분리, 회전 자동화
디도스보호(프록시) — 엣지 차단·캐싱으로 코어 보호
서비스 규모·규제 수준에 맞는 멀티테넌시, 함께 설계합니다
목표 격리 수준과 예산을 알려주시면 최적 패턴을 제안드립니다. 요금은 별도문의.