Rails 8 인증 생성기로 단일 관리자 영역 단단히 만들기

인증 생성기는 출발점이다

Rails 8의 authentication generator는 세션 모델, 서명 쿠키, 현재 사용자 상태를 관리하는 Current, 인증 concern을 함께 만들어 준다. 직접 로그인 구조를 조립하는 것보다 안전한 출발점이지만, 생성만 했다고 관리자 영역이 보호되는 것은 아니다. 먼저 애플리케이션 전체를 기본 비공개로 두고 공개 화면만 명시적으로 열어야 한다.

class ApplicationController < ActionController::Base
  include Authentication
end

class PostsController < ApplicationController
  allow_unauthenticated_access only: %i[index show]
end

이 구조에서는 새 컨트롤러를 추가했을 때 인증 선언을 빠뜨려도 기본적으로 접근이 거부된다. 반대로 모든 화면을 공개한 뒤 관리자 컨트롤러마다 필터를 붙이는 방식은 누락 한 번으로 관리 기능이 노출될 수 있다.

공개 조회와 관리자 변경을 분리한다

공개 글 목록과 상세는 언제나 발행된 글만 조회해야 한다. URL의 slug를 알고 있더라도 초안에 접근할 수 없어야 한다.

def show
  @post = Post.published.find_by!(slug: params[:slug])
end

관리자 네임스페이스에서는 초안과 발행 글을 모두 다룰 수 있지만 생성, 수정, 삭제 요청 전체가 인증 필터 아래 있어야 한다. 댓글 삭제나 Direct Upload처럼 화면상 덜 눈에 띄는 endpoint도 같은 경계에 포함한다. 인증 여부를 뷰에서만 확인해 버튼을 숨기는 것은 접근 제어가 아니다. 서버가 요청마다 권한을 확인해야 한다.

세션 쿠키와 로그인 제한을 점검한다

세션 식별자는 서명 쿠키에 저장하고 httponly, same_site: :lax를 적용한다. HTTPS 요청에서는 secure도 켜야 한다. 로그아웃할 때는 브라우저 쿠키만 지우지 말고 서버의 Session 레코드도 함께 삭제한다. 그래야 탈취되었거나 오래된 세션을 명시적으로 폐기할 수 있다.

로그인 endpoint에는 Rails의 rate_limit을 적용한다. 제한 기준과 시간 창은 실제 운영자가 암호를 몇 번 잘못 입력해도 복구 가능한 수준으로 정한다. 실패 응답은 계정 존재 여부를 드러내지 않도록 동일한 메시지를 사용한다. 로그에는 암호, 세션 쿠키, production secret이 남지 않는지도 확인한다.

관리자는 배포 과정에서 한 명만 만든다

공개 회원가입 기능이 필요하지 않은 개인 블로그라면 User 생성 화면을 만들 이유가 없다. 관리자는 seed 또는 일회성 Rails console 명령으로 한 명만 생성하고, 초기 암호는 환경변수나 비밀 관리 도구로 전달한다. 저장소의 seed 파일과 .env.example에는 실제 암호를 적지 않는다.

운영 중 관리자 암호를 바꿀 때는 기존 세션을 함께 정리할지 결정해야 한다. 의심스러운 접근 이후라면 모든 Session 레코드를 폐기하는 편이 안전하다. 정상적인 암호 교체라면 현재 세션 유지 정책을 문서로 남겨 다음 작업자가 같은 판단을 반복하지 않게 한다.

회귀 테스트로 경계를 고정한다

인증 테스트는 로그인 성공만 확인해서는 부족하다. 다음 경로를 각각 요청해 기대 상태를 고정한다.

  • 비로그인 사용자의 /admin/** 접근은 로그인 화면으로 이동한다.
  • 비로그인 사용자는 글 생성·수정·삭제와 댓글 삭제를 수행할 수 없다.
  • 발행 글은 공개되지만 초안은 목록, 상세, 검색, 피드에서 모두 404 또는 비노출 상태다.
  • 로그인 제한 횟수를 넘으면 429 Too Many Requests가 반환된다.
  • 로그아웃 후 이전 세션 쿠키를 재사용해도 관리자 화면에 들어갈 수 없다.

마지막으로 system test에서 로그인 후 원래 요청했던 관리자 URL로 돌아오는 흐름까지 확인한다. 인증은 한 번 구현하고 잊는 기능이 아니라, 새로운 endpoint가 생길 때마다 기본 비공개 원칙이 유지되는지 검사해야 하는 애플리케이션 경계다.

댓글

아직 댓글이 없습니다.

댓글 남기기