기술 부채를 방지하는 확실한 권한 관리 설계 및 구현

「技術負債にならない・間違えない」権限管理の設計と実装 / naro143 (Yusuke Ishimi) - Kaigi on Rails 2025

작성자
Kaigi on Rails
발행일
2025년 11월 25일

핵심 요약

  • 1 권한 관리의 중요성을 이해하고, 역할(Role)에 의존하는 안티패턴을 피하며, 권한(Permission) 기반의 명시적 설계로 기술 부채를 줄일 수 있습니다.
  • 2 권한 관리의 핵심 요소를 대상, 역할, 조작, 조건으로 분리하고, Ruby on Rails 모듈을 통해 이를 체계적으로 구현하여 가독성과 유지보수성을 극대화합니다.
  • 3 구현된 모듈은 서비스 신뢰성 향상, 개발 생산성 증대, 그리고 Next.js 클라이언트 단의 기술 부채 방지까지 전반적인 긍정적 영향을 가져왔습니다.

도입

웹 서비스 개발 및 운영에서 권한 관리는 필수적이며, 오류 발생 시 서비스 신뢰도 하락 및 막대한 사업적 손실로 이어질 수 있습니다. 운영자 전용 기능, 민감 정보 접근 제어 등 다양한 상황에서 정확하고 확실한 권한 관리 설계 및 구현은 매우 중요합니다. 본 발표는 기술 부채를 야기하지 않는 권한 관리의 중요성과 안티패턴을 이해하고, 이를 해결하기 위한 구체적인 설계 및 구현 방안을 제시합니다.

권한 관리 안티패턴 및 개선 방안

기존 current_user.admin?과 같은 역할(Role) 직접 의존 방식은 사업 변화에 취약하며 기술 부채를 유발하는 안티패턴입니다. 권한이 암묵적이고 로직이 분산되어 유지보수가 어렵습니다.

이를 개선하려면 역할이 아닌 권한(Permission)에 의존해야 합니다. can_create_project?처럼 권한을 명시하고, 함수 내에서 역할을 정의합니다. 이로써 권한이 명시적이고 역할 변경에 영향을 받지 않으며, 권한 판별이 한 곳에 집중되어 오류 방지에 용이합니다.

권한 관리 요소 분리 및 모듈 설계

제안된 모듈은 대상, 역할, 조작, 조건의 4가지 핵심 요소를 명확히 분리합니다. 이는 Pundit Gem과 달리 역할과 조건을 분리하여 복잡한 로직의 가독성을 높입니다.

모듈은 대상과 역할로부터 권한 클래스를 특정하고, 판별 모드(레코드, 스코프, 리스트)에 따라 조작 함수를 실행하며 조건을 판별합니다. 메타 프로그래밍을 활용하여 유연성을 확보했고, 각 역할 파일에서는 정의된 조건을 논리 연산자와 함께 사용하여 영어만으로도 이해 가능한 단순하고 명확한 권한 표현을 가능하게 합니다.

서비스 전반의 긍정적 영향

모듈 도입 후 1년간 버그 발생 0건으로 서비스 신뢰성이 크게 향상되었습니다. 고객 지원(CS) 및 제품 관리자(PDM)가 직접 권한을 이해하고 대응하며, 엔지니어에게 오는 권한 관련 문의가 0건이 되어 개발 생산성이 증대되었습니다.

클라이언트 측(Next.js)에서도 기술 부채를 방지했습니다. Rails에서 권한 목록을 JSON으로 전달받아 Next.js도 역할이 아닌 권한에 의존하는 구현이 자연스럽게 이루어졌습니다. Next.js는 이 권한 맵과 PermissionComponent로 UI 제어를 선언적으로 기술하며, Rails와 Next.js 간 권한 일관성을 유지합니다.

결론

본 발표는 기술 부채를 유발하는 역할 기반 권한 관리의 한계를 지적하고, 권한 기반의 체계적인 설계 및 구현 방안을 제시했습니다. 대상, 역할, 조작, 조건의 4가지 핵심 요소를 분리하여 Ruby on Rails 모듈로 구현함으로써 권한 관리의 명시성, 가독성, 유지보수성을 획기적으로 개선했습니다. 결과적으로 서비스 신뢰도 향상, 개발 생산성 증대, 클라이언트 단 기술 부채 방지 등 전방위적인 긍정적 효과를 입증하며, 권한 관리가 서비스 전체 관점에서 통합적으로 설계되어야 함을 강조합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!