Hanami 앱에 Rodauth 통합하기: 강력하고 유연한 인증 프레임워크 경험

Rodauth, meet Hanami - Tim Riley

작성자
Ruby Weekly
발행일
2025년 09월 16일

핵심 요약

  • 1 Rodauth는 Hanami 앱에 강력하고 유연한 인증 기능을 제공하는 경량 프레임워크로, Roda 미들웨어를 통해 쉽게 통합됩니다.
  • 2 50개 이상의 기능을 제공하며 URL, 리다이렉션, 계정 생성 로직 등 모든 요소를 세밀하게 설정하여 맞춤형 인증 흐름을 구현할 수 있습니다.
  • 3 Rack 기반의 설계 덕분에 Hanami 액션 및 뷰와 자연스럽게 연동되며, 핵심 인증 로직과 앱 비즈니스 로직을 명확히 분리하여 유지보수성을 높입니다.

도입

웹 애플리케이션에서 인증은 필수적이며, Rodauth는 강력하고 검증된 인증 프레임워크로 각광받고 있습니다. 이 글은 저자가 자신의 오픈소스 Hanami 앱인 Decaf Sucks에 Rodauth를 통합하며 겪은 경험을 공유합니다. Rodauth의 경량성, 높은 설정 가능성, 그리고 Ruby 앱 전반에 걸친 지원에 대한 긍정적인 평가와 함께, Hanami 환경에서 Rodauth를 효과적으로 활용하는 방법을 상세히 설명합니다.

Rodauth와 Hanami 통합 과정

Rodauth는 Roda 위에 구축되어 있으므로, Roda 앱에서는 간단하게 플러그인으로 추가할 수 있습니다. Hanami 앱에서는 Roda를 미들웨어로 활용하여 Rodauth를 통합합니다.

  • AuthenticationApp (Roda 앱):
    • plugin :middlewareplugin :rodauth를 사용하여 인증 기능을 정의합니다.
    • env["rodauth"] = rodauth를 통해 Rodauth 인스턴스를 Rack 환경에 노출합니다.
    • r.rodauth를 통해 Rodauth 라우트를 처리합니다.
  • Hanami 라우트:
    • Hanami::Routes 내에서 use Main::AuthenticationApp을 사용하여 Rodauth 라우트를 노출하고 요청을 처리하게 합니다. 인증 관련 요청은 Rodauth가, 그 외는 Hanami 라우터가 처리합니다.
  • 인증된 액션 (Authenticated Action):
    • Main::Actions::Authenticated 클래스를 생성하여 before :require_authentication 콜백을 정의합니다.
    • 이 콜백은 request.env["rodauth"]에서 Rodauth 인스턴스를 가져와 rodauth.require_account를 호출하여 사용자 인증을 요구합니다.
    • handle_rodauth_redirect 메서드를 통해 Rodauth가 시작한 리다이렉션을 Hanami 액션이 처리하고, 플래시 메시지를 Hanami의 플래시 객체로 전달합니다.

Rodauth 기능 및 설정

Rodauth는 50개 이상의 다양한 기능을 제공하며, Decaf Sucks 앱에서는 다음과 같은 기능을 활성화했습니다:

  • create_account, verify_account, login, logout, remember, reset_password
  • change_login, verify_login_change, change_password, change_password_notify

이러한 기능들은 기본적으로 연동되지만, 높은 설정 유연성을 통해 맞춤형 경험을 제공합니다:

  • URL 사용자 정의: login_route, logout_route 등을 사용하여 원하는 URL 경로를 설정합니다.
  • 리다이렉션 제어: login_return_to_requested_location?, logout_redirect, already_logged_in 등을 통해 리다이렉션 동작을 조정합니다.
  • 계정 생성 로직 확장: before_create_account, after_create_account 훅을 사용하여 계정 생성 시 사용자 이름(name) 필드를 처리하고 users 테이블에 저장합니다.
  • 기본 동작 변경: after_login에서 remember_login을 호출하여 세션 간 로그인 유지를 활성화하고, require_password_confirmation? false, verify_account_set_password? false 등으로 기본 동작을 변경합니다.
  • 텍스트 메시지 사용자 정의: 로그인, 로그아웃, 계정 생성 등 다양한 화면의 텍스트를 커스터마이징합니다.

데이터베이스 준비 및 Hanami 연동 최적화

Rodauth는 기능별로 분리된 데이터베이스 테이블을 사용하며, 보안 강화를 위한 기본 설정이 있지만, 이 글에서는 단순화를 위해 account_password_hash_column :password_hashuse_database_authentication_functions? false 설정을 통해 일반적인 방식으로 패스워드 해시를 관리합니다. 또한, 사용자 정보를 저장하기 위해 accounts 테이블과 연결되는 별도의 users 테이블을 유지합니다.

Hanami 앱과의 완벽한 연동을 위해 enable :hanami 기능을 활성화하여 Rodauth 뷰를 Hanami 뷰 시스템 내에서 렌더링하도록 설정합니다. 이를 통해 Rodauth 페이지가 앱의 레이아웃과 디자인을 따르고, Hanami 뷰의 모든 기능을 활용할 수 있게 됩니다.

결론

저자는 Rodauth가 Ruby 생태계에 큰 축복이라고 평가하며, Hanami 앱에 통합하는 과정이 매우 자연스럽고 직관적이었다고 강조합니다. Rodauth의 핵심 인증 로직이 젬 내부에 잘 관리되고, 독립적인 데이터베이스 테이블 구조 덕분에 앱의 비즈니스 로직과 인증 로직이 명확히 분리되어 유지보수가 용이하다는 점을 장점으로 꼽습니다. 또한, Hanami 액션 및 뷰와의 긴밀한 연동을 통해 사용자 경험을 일관되게 유지할 수 있습니다. 문서화가 설정 위주이고 코드의 메타프로그래밍이 학습을 어렵게 한다는 단점도 언급되었지만, 전반적으로 Rodauth의 강력함과 유연성에 깊은 만족감을 표하며, 향후 `rodauth-hanami` 젬 개발에 대한 가능성을 시사합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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