Rails 애플리케이션에서의 권한 부여 전략: Pundit에서 Fine-Grained Authorization까지

5. Yatish Mehta - No 'Pundit' Intended - wroc_love.rb 2025

작성자
wrocloverb
발행일
2025년 04월 17일

핵심 요약

  • 1 Rails 애플리케이션의 권한 부여 방식은 암묵적 방식, CanCan, Pundit을 거쳐 발전했으며, 각 방식은 앱 규모에 따라 확장성과 관리 용이성 측면에서 한계를 드러냈습니다.
  • 2 Pundit은 유연하지만 복잡성 증가 시 리팩토링, 성능, 디버깅, 역방향 조회에서 어려움이 있습니다.
  • 3 Google Zanzibar 프로젝트 기반의 Fine-Grained Authorization(FGA)은 관계형 데이터를 그래프 형태로 저장하고 규칙을 정의하여 이러한 한계를 극복하며, `granity` 젬을 통해 Rails에서 구현 가능합니다.

도입

Rails 애플리케이션에서 사용자 권한 부여(Authorization)는 애플리케이션 보안의 핵심 요소입니다. 본 발표는 인증(Authentication)과 권한 부여(Authorization)의 차이점을 명확히 하고, Rails 환경에서 권한 부여를 구현하는 다양한 접근 방식의 진화 과정을 심층적으로 탐구합니다. 특히, 초기 단순한 방식부터 널리 사용되는 젬(CanCan, Pundit)의 한계를 분석하고, Google Zanzibar 프로젝트에서 영감을 받은 고급 권한 부여 모델인 Fine-Grained Authorization(FGA)의 개념과 Ruby on Rails에서의 구현 사례(`granity` 젬)를 제시합니다.

인증(Authentication)과 권한 부여(Authorization)의 이해

인증은 ‘당신이 누구인가’를 확인하며, 권한 부여는 ‘무엇을 할 수 있는가’를 결정합니다. Rails에서는 Devise가 인증에, Pundit이 권한 부여에 주로 사용됩니다.

기존 Rails 권한 부여 방식의 한계

  • 암묵적 권한 부여: 쿼리 스코프를 이용한 초기 방식은 단순하지만 비즈니스 로직과 권한 규칙이 혼합되어 확장성이 떨어집니다.
  • CanCan: ability.rb로 규칙을 중앙화했으나, 앱 규모가 커지면 파일이 비대해져 관리 및 리팩토링이 매우 어려워집니다.
  • Pundit: 리소스별 정책 클래스로 유연성을 제공하지만, 대규모 앱에서는 다음과 같은 한계에 직면합니다: 리팩토링의 어려움(암묵적 의존성), 성능 문제(N+1 쿼리, 캐싱 어려움), 감사 및 디버깅의 어려움(접근 원인 추적 불가), 역방향 조회 불가(데이터 미저장).

Fine-Grained Authorization (FGA) / 관계 기반 접근 제어 (Relationship-Based Access Control)의 도입

Google Zanzibar 프로젝트 기반의 FGA는 엔티티 간의 관계를 ‘튜플(subject, relationship, object)’ 형태로 저장하고, 이 관계 데이터를 그래프로 활용하여 권한 규칙을 정의합니다. 권한 확인은 그래프 내 특정 경로 존재 여부로 판단합니다.

granity 젬을 통한 Rails 구현

granity는 Rails에서 FGA를 지원하는 젬입니다. 스키마 정의를 통해 리소스, 관계, 권한을 명시하고 튜플을 생성하여 관계 데이터를 관리합니다.

FGA의 장점

  • 쉬운 리팩토링: 명시적 스키마와 그래프 객체를 통해 의존성 파악이 용이합니다.
  • 향상된 성능: ID 기반 튜플 탐색 및 스마트 캐싱을 통해 불필요한 데이터 로딩과 재평가를 줄입니다.
  • 뛰어난 감사 가능성: 권한 확인 시 접근 경로를 반환하여 디버깅 및 감사에 용이합니다.
  • 역방향 조회 지원: 관계 데이터를 저장하므로 특정 권한을 가진 주체를 쉽게 조회할 수 있습니다.

외부 FGA 서비스

OpenFGA, OSO, Permit.io 등은 분산 시스템 환경에서 권한 부여를 중앙 집중화하고 최적화된 성능을 제공하는 대안입니다.

결론

Rails 애플리케이션의 권한 부여 전략은 규모와 복잡성에 따라 진화해야 합니다. Pundit으로 시작하여 시스템이 성장하면 `granity` 젬을 활용한 Fine-Grained Authorization과 같은 관계 기반 접근 제어 모델을 도입하는 것이 바람직합니다. 나아가 분산 시스템 환경에서는 OpenFGA와 같은 외부 권한 부여 서비스를 고려하는 것이 효율적입니다. 적절한 모델 선택은 애플리케이션의 보안, 성능, 유지보수성에 큰 영향을 미칩니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

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