
1편에서 tenant / user / tenant_user로 회원·테넌트 도메인을 정리했고,
2편에서 그 위에 JWT + Redis 인증 구조를 얹었다.
3편에서는 그 다음 단계인 권한(Authorization) 을 다룬다.
tenant_user와 역할을 어떻게 연결할지를 RBAC(Role-Based Access Control) 관점에서 정리한다.
user (회원)tenant (서비스/조직/고객사)tenant_user (테넌트 내 회원 관계)role (역할)permission (행동/권한 단위)ROLE_TENANT_ADMIN, ROLE_TENANT_USER 같은 고정 역할RBAC를 아주 단순화하면,
결국 다음 네 가지를 조합해서 “허용/거부”를 판단한다.
user, tenant_user, roleREAD, WRITE, DELETE, APPROVE 등tenant_id, 소유자 여부, 시간대, IP, 플랜 등이 글에서는 이 중 주체·컨텍스트에 집중한다.
(리소스/행동은 도메인마다 달라서, 패턴만 간단히 짚고 간다.)
1편에서 썼던 도메인에 역할/권한을 붙이면
대략 이런 모델이 된다.
user
---------
id
email
...
tenant
---------
id
code
name
...
tenant_user
---------
id
tenant_id (FK)
user_id (FK)
status -- 가입, 정지 등
...
role
---------
id
code -- ex) TENANT_ADMIN, TENANT_USER
name
scope -- GLOBAL / TENANT
...
permission
---------
id
code -- ex) COURSE_READ, COURSE_WRITE
name
role_permission -- 역할이 어떤 권한을 가지는지
---------------
role_id (FK)
permission_id (FK)
tenant_user_role -- 테넌트 내 회원의 역할
-----------------
tenant_user_id (FK)
role_id (FK)
핵심 개념은:
role
TENANT_ADMIN, TENANT_MANAGER, TENANT_USER, PLATFORM_ADMIN 등permission
COURSE_READ, COURSE_WRITE, USER_INVITE …)role_permission
tenant_user_role
이 구조 하나로:
까지 표현할 수 있다.
멀티테넌트 서비스에서는 보통 두 종류의 역할이 등장한다.
이를 role.scope 같은 필드로 구분할 수 있다.
role
---------
id
code -- ex) PLATFORM_ADMIN, TENANT_ADMIN, TENANT_USER
scope -- GLOBAL / TENANT
PLATFORM_ADMIN
SUPPORT
이 역할들은 보통 운영자 콘솔에서 사용되고,
일반 회원에게는 부여되지 않는다.
TENANT_ADMIN
TENANT_MANAGER
TENANT_USER
이 역할들은 각 테넌트의 관리자 화면에서,
해당 조직의 구성원에게 부여되는 역할이다.
여기서 중요한 선택지가 하나 나온다.
테넌트별로 역할 구성을 고정할 것인지,
아니면 각 테넌트가 직접 정의하게 할 것인지.
예:
TENANT_ADMINTENANT_MANAGERTENANT_USER만 제공하고, 테넌트는 이 역할을 구성원에게 할당만 할 수 있음.
장점
단점
고객사의 “조직 구조/권한 체계”를 세밀하게 반영하기 어렵다.
도입 초기에는 문제 없지만, 큰 고객사가 들어오면
언제 적합한가
각 테넌트가 자체적으로 역할 이름/권한 세트를 구성하도록 하는 패턴.
tenant_role
---------
id
tenant_id (FK)
code -- ex) ADMIN, MANAGER, VIEWER (tenant 내부 코드)
name
tenant_role_permission
-------------------
tenant_role_id (FK)
permission_id (FK)
(혹은 role 테이블에 tenant_id 컬럼을 두고, NULL이면 글로벌 역할로 보는 방식도 가능하다.)
장점
고객사가 원하는 권한 세분화를 그대로 반영할 수 있다.
큰 B2B 고객사 입장에서는
시스템은 permission 단위로만 API 보호를 설계하고
역할 구성은 테넌트에 위임할 수 있다.
단점
운영/디버깅 난이도가 확 올라간다.
UI/UX도 복잡해진다.
토큰에 실어 보내는 역할/권한 정보도
테넌트마다 달라지므로 캐싱 전략이 중요해진다.
언제 적합한가
permission을 정의할 때 자주 하는 고민:
“권한을 API 단위까지 쪼갤까,
아니면 기능 묶음 단위로만 볼까?”
예:
COURSE_CREATECOURSE_UPDATECOURSE_DELETECOURSE_ASSIGN_TEACHERCOURSE_PUBLISH장점
단점
예:
COURSE_MANAGE (생성/수정/삭제/배정 등 포함)COURSE_VIEWUSER_MANAGEUSER_VIEW장점
단점
현실적인 접근
권한 체크는 크게 두 레이어에서 할 수 있다.
@PreAuthorize예를 들어 Spring Security를 쓰면:
@PreAuthorize("hasRole('TENANT_ADMIN')")
@GetMapping("/tenants/{tenantId}/users")
public List<UserDto> listTenantUsers(...) { ... }
장점
단점
PermissionEvaluator 등을 추가로 구현해야 할 수 있다.예:
public Course findCourseForUser(TenantContext ctx, Long courseId) {
Course course = courseRepository.findByIdAndTenantId(courseId, ctx.getTenantId());
if (!authorizationService.canViewCourse(ctx.getTenantUserId(), course)) {
throw new AccessDeniedException();
}
return course;
}
장점
단점
현실적인 조합
2편에서 Access Token 클레임 예시는 대략 이랬다.
{
"sub": "user-12345",
"tenant_id": "tenant-001",
"tenant_user_id": "tu-7890",
"roles": ["TENANT_ADMIN", "TENANT_USER"],
"iat": 1730000000,
"exp": 1730003600
}
여기서 선택지는 두 가지 정도다.
roles만 넣고,role -> permission 매핑을 조회장점
단점
장점
단점
실무에서는:
지금 멀티테넌트 RBAC를 새로 설계하거나, 기존 구조를 다듬고 있다면
아래 질문들을 한 번씩 점검해볼 만하다.
역할 스코프
PLATFORM_ADMIN과 TENANT_ADMIN을 혼동하지 않도록역할 전략
플랫폼에서 정한 고정 역할 세트만 제공할 것인가?
테넌트별 커스텀 역할이 필요한 수준의 고객/요구가 있는가?
커스텀 역할이 필요하다면,
permission 설계
권한 체크 위치
JWT와의 연결
tenant_id, tenant_user_id, roles는 어느 수준까지 넣을 것인가?3편에서는 멀티테넌트 회원·인증 구조 위에 얹는 RBAC를 정리했다.
요약하면:
tenant / user / tenant_user 위에
role / permission / role_permission / tenant_user_role을 얹어서
역할 전략(고정 vs 커스텀), permission granularity,
권한 체크 위치(프레임워크 vs 도메인),
JWT와의 연결 방식 등을 상황에 맞게 선택해야 한다.
멀티테넌트 RBAC는
“정답”이라기보다 트레이드오프 싸움에 가깝다.
다음 편에서는 이 RBAC 구조와 테넌트 모델을 전제로, B2B SaaS에서 테넌트별 스케일링·분리 전략(노이즈 네이버 대응, 테넌트별 Rate Limit, 클러스터 분리 등) 을 인프라 관점에서 정리해볼 예정이다.
NIST CSRC, “Role Based Access Control (RBAC)”.
Sandhu et al., “The NIST Model for Role-Based Access Control”.
Ferraiolo et al., “Proposed NIST Standard for Role Based Access Control”.
IBM, “What Is Role-Based Access Control (RBAC)?”.
NIST, “A Role-Based Access Control Model and Reference Implementation”.