안녕하세요 makeviibe 입니다.
서비스가 성장하면서 가장 먼저 고민하게 되는 보안 중 하나는
“누가 어떤 기능을 쓸 수 있어야 하는가?”입니다.
예를 들어,
“운영자만 유저 목록을 조회할 수 있게 해주세요”
“일반 유저는 본인 정보만 수정 가능해야 해요”
“어드민만 설정을 바꿀 수 있어야 합니다”
이런 요구사항이 반복될 때마다 코드를 if문으로 처리한다면
점점 유지보수가 어려워지고, 실수로 권한 없는 유저가 접근하게 되는 상황도 생길 수 있습니다.
그래서 makeviibe 팀은 모든 프로젝트에서
역할 기반 권한 시스템(RBAC: Role-Based Access Control) 을 표준으로 설계하고,
Spring Security를 통해 API 단위에서부터 명확한 권한 체계를 적용합니다.
✅ 역할 기반 권한 시스템이란?
RBAC은 “사용자의 역할(role)에 따라 접근 권한을 나누는 시스템”입니다.

이 구조의 핵심은 다음과 같습니다:
- 사용자마다 고정된 역할이 1개 이상 주어진다
- 각 역할은 권한의 묶음이다 (기능 단위 권한이 아님)
- 역할은 코드와 문서 모두에서 명확히 관리된다
✅ makeviibe 팀의 RBAC 설계 방식
1. API 경로 자체에 역할을 드러낸다
우리는 API 경로를 역할 기반으로 구성합니다:

✅ 이렇게 하면:
- 프론트엔드도 어떤 API가 어떤 역할 전용인지 바로 파악할 수 있고
- 개발자가 실수로 잘못된 API를 연결할 확률이 줄어듭니다
- Swagger, Postman 등에서 문서화할 때도 구조가 명확해집니다
2. Spring Security에서 역할별 접근을 사전 필터링
Spring Security를 사용해 컨트롤러 진입 전 단계에서 권한 체크를 수행합니다.

이 설정 하나로, /api-admin/** 경로는 관리자만,
/api-user/**는 일반 유저도 접근할 수 있도록 분리됩니다.
3. 역할 정보는 JWT 토큰에 포함
makeviibe 팀은 JWT 기반 인증을 사용하며,
토큰 payload에 사용자 ID와 함께 role도 명시합니다.

→ 이 값을 Spring Security에서 추출해 인증 객체에 넣고,
→ 위의 hasRole('ADMIN') 설정에 따라 접근 허용 여부를 판단합니다.
4. 컨트롤러에서도 명시적으로 역할 제한
보안은 코드에 “의도”가 드러나는 게 중요합니다.
그래서 @PreAuthorize 혹은 @Secured 등을 사용해
컨트롤러 함수마다 역할 조건을 명확히 선언합니다.

→ 개발자, 코드리뷰어 모두 “이건 관리자만 가능하구나”를 한눈에 파악할 수 있습니다.
5. 역할 정의는 Enum + 정책 문서로 함께 관리
코드에는 Enum을 사용하고,

기능별 접근 정책은 Notion 등 협업 툴에서 다음과 같이 정리합니다:

→ 프론트엔드와 기획팀, QA가 참고할 수 있도록 구조화해 둡니다.
🎯 왜 이런 구조가 좋은가?

✍ 마무리하며
makeviibe 팀은 역할 기반 권한 구조를 기능 개발 초기 단계부터 설계합니다.
우리는 다음을 지향합니다:
- ✅ 권한 조건이 숨겨지지 않고 코드에 명시되도록
- ✅ API 구조로 의도가 드러나도록
- ✅ 인증/인가 흐름이 재사용 가능하고 테스트 가능한 구조로
보안은 신뢰의 기본이고, 신뢰는 설계에서 시작됩니다.
그 시작점이 바로 “역할 기반 권한 구조”라고 생각합니다.
'개발일지' 카테고리의 다른 글
| 🛠️ 외주 프로젝트에서 Pulumi, Terraform을 사용하는 이유 – 인프라도 코드로 관리해야 하는 진짜 이유 (2) | 2025.07.29 |
|---|---|
| 처음부터 서버리스? 아니요, 우리는 이렇게 확장합니다 (4) | 2025.07.25 |
| 🔐 인증과 인가, 실무에서 어디까지 나눠야 할까? (3) | 2025.07.18 |
| 🔍 View, JOIN, IN절 비교 – 우리는 왜 ORM + IN절을 쓸까요? (1) | 2025.07.17 |
| 🥐 빵파티는 왜 웹뷰앱(WebView App)으로 만들었을까? (0) | 2025.07.15 |