- 인가와 권한 기반 접근 제어의 개념
- 역할 기반 접근 제어(RBAC)의 구성 요소(사용자, 역할, 권한, 리소스, 행위)를 정의하고 연결하기
- 작은 애플리케이션을 가정한 프레임워크 비종속(Java) 예를 통한 권한 설계, 구현 방법
- 권한 검증 워크플로우를 PEP/PDP 관점과 머메이드 다이어그램으로 이해
- 최소 권한, 기본 거부, 로깅/감사 등 팁
권한 기반 접근 제어 개념
권한 기반 접근 제어는 "인증된 주체가 어떤 리소스에 어떤 행위를 할 수 있는가"를 규칙적으로 명시하고, 요청시 규칙에 따라 허용/거부를 결정하는 체계임
- 인증(Authentication) : 사용자가 누구인지 식별함
- 인가(Authorization) : 식별된 사용자가 무엇을 할 수 있는지 결정함
1. 용어
| 용어 | 의미 | 예시 |
| 사용자(User) | 시스템을 이용하는 주체 | B1uffer, Alice, Bob |
| 역할(Role) | 사용자의 업무 묶음 | ADMIN, EDITOR, VIEWER 등 |
| 권한(Permission) | 특정 리소스에 대한 행위 허용 규칙 | POST:READ, POST:WRITE 등 |
| 리소스(Resource) | 보호 대상 | 게시글(Post), 파일(File), 주문(Order) 등 |
| 행위(Action) | 리소스에 대한 조작 | READ, CREATE, UPDATE, DELETE 등 |
| 정책(Policy) | 조건이 있는 권한 규칙 | 본인 소유 글만 UPDATE 허용하기 |
2. RBAC(역할 기반)의 핵심
RBAC는 사용자(User) - 역할(Role) - 권한(Permission)을 맵핑한다.
사용자는 역할을 부여받고, 역할에 권한을 부여하는 형태
RBAC를 선택하는 이유
- 관리가 용이함 : 사용자의 수가 많아도 역할 단위로 권한을 변경하면 끝임
- 일관성 : 비슷한 사용자들에게 동일한 정책을 적용하기 쉬움
- 감사가 용이함 : "이 역할을 어떠한 권한을 갖는가?"에 대한 답이 빠르게 나온다
* ACL은 리소스 주체별 목록, ABAC는 속성 기반(시간, 부서, 위치 등) 이라고 한다
권한 설계와 구현 방법
1. 권한 설계와 5대 원칙
| 원칙 | 설명 | 체크 질문 |
| 최소 권한(Least Privilege) | 필요한 최소 권한만 부여함 | 이 역할이 이런 기능이 없이도 업무가 가능한가? |
| 기본 거부(Default Deny) | 명시적으로 허용된 것만 허용함 | 정책이 없을 때 기본값은 거부인가? |
| 책임 분리 (Separation of Duties) |
서로 충돌 가능한 권한을 분리함 | 생성과 승인 권한이 같은 사람에게 있지 않나? |
| 감사 가능성(Auditability) | 누가/무엇을/왜 했는지 추적 가능해야함 | 로그에 정책 키와 사유가 남는가? |
| 단순성 우선(Keep It Simple) | 정책은 이해, 검토, 운영이 쉬워야 함 | 정책 문서만 보고도 신입이 이해할 수 있나? |
* 권한은 추가보다 회수가 어렵다. 초기에 보수적으로 설계하고 필요한 경우 점진적으로 허용을 넓힐 수 있음
2. 도메인 인벤토리 : 리소스, 행위 목록화
권한 설계는 도메인을 리소스와 행위로 쪼개는 일에서 시작한다.
# 도메인 인벤토리 예시
리소스(Resource) : POST, COMMENT, FILE, ORDER
행위(Action) : READ, CREATE, UPDATE, DELETE, EXPORT
상태(State) : DRAFT, PUBLISHED, ARCHIVED, DELETED
소유(Ownership) : OWNER, TEAM, ORG, PUBLIC
| 리소스 | 핵심 속성 | 민감도 | 비교 |
| POST | ownerId, status | 중간 | 소유자의 개념이 중요함 |
| FILE | ownerId, size, type | 높음 | 다운로드/외부공유 고려 |
| ORDER | buyerId, amount, state | 높음 | 정산/환불 플로우 존재 |
* 누가(주체) 어떤 리소스에 어떤 행위를, 어떤 조건(상태, 소유, 시간, 위치)에서 하는가?
3. 역할(Role) 도출 방법
1) 업무 단위로 묶기 : 실사용자의 업무 시나리오에서 공통 행위를 묶어서 역할 후보를 만듬
2) 최소 공통권한과 확장 권한을 분리하기
3) 충돌 권한 분리 : 생성자와 승인자를 분리하는 등 SoD 적용하기
* SoD(Segregation of Duties, 직무 분리)
| 사용자 | 주요 목표 | 역할 후보 |
| 콘텐츠 작성자 | 초안 작성, 수정 | EDITOR |
| 검수자 | 퍼블리시 승인, 회수 | REVIEWER |
| 열람자 | 읽기 전용 | VIEWER |
| 운영 관리 | 정책, 역할 관리 | ADMIN |
* 역할 수는 작게 시작하고, 필요시 세분화하기(과도한 역할은 운영 복잡도가 급증한다)
4. 권한 매트릭스 작성하기(Roles x Resources x Actions)
가장 중요한 '산출물'
| 역할\리소스:행위 | POST\:READ | POST\:CREATE | POST\:UPDATE | POST\:DELETE | FILE\:EXPORT |
| VIEWER | 공개만 O | X | X | X | X |
| EDITOR | O | O | O(소유자만) | X | X |
| REVIEWER | O | X | O(승인 전에 검수) | O(규정에 한함) | X |
| ADMIN | O | O | O | O | O |
| 역할\리소스:행위 | POST\:READ | POST\:CREATE | POST\:UPDATE | POST\:DELETE | FILE\:DELETE |
| 일반회원 | O | O | O(내것만) | O(내것만) | X |
| 관리자 | O | O | O | O | O |
* 역할로 허용된 행위 위에 정책 조건을 겹쳐서 최종 허용이 결정된다
5. 정책(Policy) 조건 설계 : RBAC의 한계 보완
- 소유 기반 : POST.UPDATE는 userId == ownerId 일때만 허용하기
- 상태 기반 : POST.DELETE는 status == DRAFT 일때만 허용하기
- 시간/위치 기반(선택) : EXPORT는 근무 시간(9~18) 내 사내망에서만 허용하기
- 리스크 기반(선택) : 고액 ORDER.REFUND는 2인 이상 승인이 필요하게 하기
정책은 역할 권한을 필터링하거나 추가 제약을 주는 형태로 동작한다
6. 정책 문서화 포맷(예시)
실무에서는 사람이 읽고 리뷰하기 쉬운 포맷을 권장한다고 함
# 정책 정의 예시
resource: POST
rules:
- id: post_update_owner_only
when:
action: UPDATE
role: [EDITOR, REVIEWER]
condition:
expression: user.id == resource.ownerId
effect: PERMIT
- id: post_delete_only_draft
when:
action: DELETE
role: [REVIEWER, ADMIN]
condition:
expression: resource.expression == 'DRAFT'
effect: PERMIT
- id: tenant_isolation
when:
action: [READ, CREATE, UPDATE, DELETE]
role: [*]
condition:
expression: user.tenantId == resource.tenantId
effect: PERMIT
- id: delete_deny
effect: DENY # 위 규칙과 매칭되지 않으면 거부하기
* 사람이 리뷰 가능해야 하며, 정책 키(id)는 로그/감사와 연결된다고 한다.
7. 권한 검증 워크플로우
https://b1uffer.tistory.com/361
권한 검증 플로우
1. 요청 처리 흐름
* 일련의 과정은 모두 '인증' 이후에 이루어져야 한다.
2. 테스트 시나리오
| 케이스 | 사용자 역할 | 리소스 소유자 | 요청 행위 | 기대 결과 |
| 1 | EDITOR | 본인 | UPDATE | 허용(200) |
| 2 | VIEWER | 타인 | UPDATE | 거부(403) |
| 3 | VIEWER | 본인 | READ | 허용(200) |
| 4 | 권한이 없음 | 본인(비회원) | CREATE | 거부(403) |
팁
* 최소 권한 원칙(PoLP) : 기본은 읽지만, 쓰기는 필요한 역할에만 권한을 주기
* 권한 명세서를 산출물로 관리하기(스프레드시트 등등..) : 역할 - 권한 목록, 변경 이력, 승인자 등
* 감사/로깅 : 403 발생 시 정책 키, 리소스 ID, 사용자 ID를 함께 남겨 분석 가능하게끔 하기
* 성능 : 역할 권한은 캐시, 정책 판단은 조건만 캐시하기(과도한 캐시 금지)
* 국소성 : 컨트롤러, 서비스 초입의 단일 PEP에서 일괄 검사하기(중복 로직 방지)
정리
| 항목 | 핵심 |
| RBAC 기본 | 사용자 -> 역할 -> 권한 맵핑으로 관리를 단순하게 하기 |
| 정책 분리 | RBAC로 표현이 어려운 조건(소유자, 상태, 시간 등)은 PDP 규칙으로 하기 |
| 검증 순서 | (인증 완) -> RBAC 권한 -> 정책 조건 -> 처리 |
| 안전 기본값 | 기본은 거부(Default Deny), 최소 권한만 부여하기 |
| 실무 포인트 | 명명 규칙, 로깅/감사, 캐시 전략, 단일 PEP 배치하기 |
'Spring Boot > 유저 관리 기능' 카테고리의 다른 글
| 인가와 권한 관리 : 실제 인가 구현 사례 (0) | 2026.03.21 |
|---|---|
| 인가와 권한 관리 : Spring Security와 권한 검증 플로우 (0) | 2026.03.17 |
| 인가와 권한 관리 : 인가 (0) | 2026.03.15 |
| Authorization 헤더, 토큰 기반 인증 : Refresh 토큰 (0) | 2026.03.15 |
| Authorization 헤더, 토큰 기반 인증 : JWT의 이해 (0) | 2026.03.14 |