top of page

SaaS 성공의 핵심: 하나의 인프라로 수많은 고객을 안전하게 관리하는 멀티테넌트 전략

SaaS 성공의 핵심: 하나의 인프라로 수많은 고객을 안전하게 관리하는 멀티테넌트 전략

The key to SaaS success: multitenant strategy

Written by Hyejin Jeon


안녕하세요. 스마일샤크 전혜진입니다.

멀티 테넌트 SaaS(Software-as-a-Service) 아키텍처란 여러 고객이 동일한 애플리케이션 인스턴스와 인프라를 공유하는 구조입니다. 예를들어, 하나의 건물에 여러 회사가 입주한 형태라고 생각하시면 좋은데요, 각 회사는 개별 사무실(테넌트)을 사용하지만, 공용 시설(회의실, 카페, 인터넷 등) 을 공유하여 사용할 수 있습니다. 이렇게 멀티 테넌트 SaaS 환경은 여러 사용자가 같은 애플리케이션과 인프라를 공유하지만, 개별 데이터와 환경이 격리된 구조라고 보면 됩니다.



대표적인 SaaS 기업으로는 Salesforce가 있습니다. Salesforce는 전형적인 멀티 테넌트 CRM 시스템으로 하나의 인프라에서 모든 고객 데이터를 분리하여 관리합니다. 또 다른 예로는 Slack이 있습니다. 모든 기업이 동일한 Slack 플랫폼을 사용하지만, 워크스페이스(테넌트) 단위로 데이터 격리되는 SaaS 협업 툴입니다.


오늘은 AWS 클라우드 환경에서 멀티 테넌트 SaaS 환경을 구축할 때 적용해야할 보안 전략에 대해 알아보겠습니다.


 
 

1. 테넌트 격리 전략

각 테넌트의 데이터와 리소스를 안전하게 분리하기 위해 3가지 격리 모델 중 선택할 수 있습니다.

a. 사일로 모델(완전 격리) 각 테넌트마다 별도의 인프라를 제공합니다. 테넌트 당 VPC나 컨테이너 세트를 배포하는 형식이기 때문에 보안은 강력하지만 비용이 가장 높습니다.

b. 브릿지 모델(부분 격리)

핵심 서비스는 공유하고 나머지 리소스는 테넌트 별로 분리합니다. 예를 들어, 웹 티어는 공유하고 비즈니스 로직과 DB는 테넌트 별로 분리할 수 있습니다. 보안과 비용 측면에서 가장 균형잡힌 전략이지만 설계가 복잡할 수 있습니다.


c. 풀 모델(공유)

모든 테넌트가 동일한 인프라를 공유하며, 애플리케이션 수준에서 테넌트를 격리합니다. 예를 들어, 모든 테넌트 데이터를 동일한 DB 테이블에 저장하고 파티션 키를 테넌트 ID로 사용하여 구분합니다.

초기 개발중이거나 운영 비용을 최소화해야하는 소규모 스타트업은 풀 모델을, 금융 기관이나 대기업 같이 엄격한 보안 준수가 필요한 기업은 사일로 모델을 선택할 수 있습니다. 하나의 모델에 국한되지 않고 보안과 비용을 종합적으로 고려하여 적절한 격리 모델을 선택해야 합니다.


 

2. IAM을 통한 액세스 제어

AWS IAM을 이용해 각 테넌트의 사용자, 역할(Role), 정책(Policy)을 정의하고, 특정 리소스에 대한 접근 권한을 제한할 수 있습니다.

a. 역할 기반 정책(RBAC)

테넌트별로 다른 권한을 가진 IAM 역할을 부여하여 리소스 접근을 제어할 수 있습니다. (예: 테넌트별 IAM 역할 분리)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
	      "dynamodb:GetItem", 
	      "dynamodb:PutItem"
	    ],
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/TableName",
      "Condition": {
        "ForAllValues:StringEquals": {
	        // LeadingKeys : 파티션 키 값이 사용자 ID와 일치하는 항목만 액세스하도록 허용
	        // 특정 테넌트(tenant-123)만 자신의 데이터에 접근 가능
          "dynamodb:LeadingKeys": ["tenant-123"]
        }
      }
    }
  ]
}


b. 리소스 기반 정책

특정 AWS 서비스(S3, SQS 등)에 직접 정책을 연결하여, 테넌트별로 접근을 제한하는 방식입니다. (예: S3 버킷을 테넌트별로 분리)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::test-bucket/tenant-123/*",
      "Condition": {
        "StringEquals": {
	        // 특정 테넌트(tenant-123)만 해당 S3 객체에 접근 가능
          "aws:userid": "tenant-123" 
        }
      }
    }
  ]
}

c. 속성 기반 액세스 제어

ABAC는 테넌트 ID를 IAM 태그(Tag)로 설정하여 액세스를 제어하는 방식입니다. (예: 태그 기반 ABAC 적용)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::test-bucket",
      "Condition": {
        "StringEquals": {
	        // 동일한 테넌트 ID를 가진 사용자만 버킷에 접근 가능
          "aws:ResourceTag/tenant-id": "${aws:PrincipalTag/tenant-id}"
        }
      }
    }
  ]
}

이 외에도 권한 경계, 세션 정책 등의 테넌트 격리 방식이 있습니다.

적절한 방식을 조합하고 IAM 관리 모범사례(최소 권한 원칙 등)를 활용하여 보안과 확장성을 모두 갖춘 멀티 테넌트 SaaS 환경을 구축할 수 있습니다.

 

3. 데이터 보안

데이터 보안은 멀티 테넌트 SaaS 아키텍처에서 가장 중요한 보안 요소입니다. 한 테넌트의 데이터가 다른 테넌트에게 노출되는 순간, 서비스에 대한 신뢰가 무너질 수 있습니다. 다음은 AWS에서 구현할 수 있는 데이터 보안 전략입니다.

a. 데이터베이스 격리

① 별도의 데이터베이스(=사일로 모델) : 각 테넌트별로 별도의 데이터베이스를 사용합니다.

별도의 데이터베이스(사일로모델, Silo model)

② 별도의 스키마(= 브릿지 모델) : 동일한 데이터베이스 내에서 테넌트별로 다른 스키마를 사용합니다.

별도의 스키마(=브릿지모델, Bridge model)

③ 공유 테이블(= 풀 모델) : 모든 테넌트 데이터를 동일한 테이블에 저장하되, 테넌트 ID(식별자)를 통해 구분합니다.

공유테이블(=풀모델, Pool model)

b. 데이터 암호화

① 저장 데이터 암호화 : RDS, DynamoDB, S3 등의 서비스에서 제공하는 암호화 기능을 활성화합니다.

② 전송 중 데이터 암호화 : HTTPS/TLS를 사용하여 전송중인 데이터를 암호화합니다.

③ AWS KMS(Key Management Service) : 테넌트별 암호화 키를 관리하여 데이터 격리를 강화합니다.

④ 클라이언트 측 암호화 : 민감한 데이터는 데이터가 서버로 전송되기 전에 클라이언트 레벨(브라우저, 모바일 앱 등)에서 암호화합니다.


 

4. 네트워크 및 API 보안

SaaS 환경에서는 API 기반으로 다수의 테넌트가 애플리케이션을 이용하기 때문에 네트워크 및 API 보안이 매우 중요합니다.

a. 네트워크 보안

① VPC 및 서브넷 분리 : 테넌트별로 별도의 VPC를 구성하고 퍼블릭, 프라이빗 서브넷을 적절히 구성합니다.

② 보안 그룹 및 네트워크 ACL : 최소 권한 원칙에 따라 네트워크 접근을 제어합니다.

③ CloudFront + WAF : CDN과 웹 방화벽을 통합하여 XSS, SQL 인젝션 같은 공격을 차단합니다.

④ Shield Advanced : 디도스 공격으로부터 애플리케이션을 보호합니다.

b. API Gateway 보안

① API 키 : 테넌트를 식별하고 해당 테넌트의 API 액세스를 제어할 수 있습니다.

② 사용량 계획 : 테넌트별로 스로틀링 제한과 할당량을 설정할 수 있습니다. 이를 통해 한 테넌트의 과도한 API 사용이 다른 테넌트에게 영향을 미치지 않도록 방지할 수 있습니다.

③ WAF 통합 : AWS WAF를 API Gateway와 통합하여 웹 공격을 차단합니다.

④ 인증 및 권한 부여 : Cognito 또는 Lambda 권한 부여자를 활용하여 사용자 인증을 처리합니다.



 

5. 동적 테넌트 격리

동적 테넌트 격리는 런타임 시점에 테넌트 컨텍스트를 확인하고 적절한 격리를 제공하는 방식입니다. 고정된 IAM 정책이 아니라 요청에 따라 액세스 권한을 실시간으로 결정하는 방식입니다.

a. 컨텍스트 기반 액세스 제어

테넌트 컨텍스트란 현재 요청이 어떤 테넌트에 속하는지를 식별하는 정보입니다. JWT(JSON Web Token)와 같은 인증 방식을 사용하여 테넌트 ID를 식별합니다.


  • 구현 단계 : 사용자 인증 시 JWT 생성 → API Gateway나 애플리케이션 서버에서 토큰 검증 → 토큰에서 컨텍스트(테넌트 ID와 역할 정보) 추출 → 추출된 컨텍스트를 Datastore에 전달


b. 테넌트 인식 미들웨어

각 요청을 처리하기 전에 테넌트 컨텍스트를 확인하는 미들웨어 계층을 구현합니다. Express, Spring, Django 등 웹 프레임워크의 미들웨어 기능을 활용합니다.

 

마무리하며

지금까지 AWS 멀티테넌트 SaaS 환경에서 적용해야할 보안 전략에 대해 알아보았습니다.


비즈니스 요구사항에 맞게 격리모델(사일로, 브릿지, 풀)을 선택하고, AWS의 여러 서비스를 조합하여 다양한 계층에서 적절하게 테넌트를 격리할 수 있습니다. 테넌트 격리 전략부터 IAM을 통한 액세스 제어, 데이터 보안, 네트워크 및 API 보안, 동적 테넌트 격리에 이르기까지 각 계층별 보안 전략을 체계적으로 구현해야 합니다.


현재 서비스에서 테넌트 격리 문제로 어려움을 겪고 계시거나, 다중 테넌트로의 전환을 준비 중이신 분들은 아래 링크를 통해 상담 도와드리고 있습니다. AWS 멀티테넌트 SaaS 아키텍처를 설계하는 데 도움이 필요하시다면 부담 없이 문의해 주세요!


 
 
 

Comments


SmileShark Logo
스마일샤크는 
AWS 프리미어 파트너이며
AI MSP 세상을 만들어 가고 있습니다
AWS Premier Tier Services Partner
©Copyright
bottom of page