Skip to content

[feat] 페이지 접근 권한 관리 구현 #99

@mgYang53

Description

@mgYang53

📄 설명

현재 프로젝트는 로그인 여부(PrivateRoute/PublicRoute)와 온보딩 완료 여부만 라우트 레벨에서 체크하고 있습니다.
모임 멤버십, 리더 역할, 약속 참여 여부 등 리소스 기반 권한 체크가 없어서, 비멤버가 URL 직접 입력으로 모임 상세 페이지 등에 접근할 수 있는 상태입니다.

접근 방식

  • 인터셉터에서 권한 관련 에러 코드 감지 → 커스텀 DOM 이벤트(permission-denied) dispatch
  • RootLayout의 usePermissionRedirect에서 이벤트를 listen → showErrorToast() + navigate(HOME, { replace: true }) 처리
  • SPA 내비게이션을 유지하면서 한 곳에서 통합 관리

리다이렉트 대상 에러 코드

에러 코드 상수명 의미
GA002 NOT_GATHERING_MEMBER 모임의 멤버가 아님
GA003 NOT_GATHERING_LEADER 리더가 아님
M003 NOT_GATHERING_MEETING 모임에 속한 약속이 아님
M004 NOT_MEETING_MEMBER 약속의 멤버가 아님
M006 NOT_MEETING_LEADER 약속장이 아님
R105 NO_ACCESS_RETROSPECTIVE 회고 접근 권한 없음

제외 (액션 레벨 에러, 컴포넌트에서 개별 처리): GA005(리더 강퇴 불가), B010(리뷰 접근), E105(주제 삭제 권한), G101(범용 ACCESS_DENIED)

✅ 해야 할 일

인프라 구축

  • src/api/errors.tsPAGE_ACCESS_ERROR_CODES 상수 추가 (Set으로 에러 코드 6개 정의)
  • src/api/interceptors.ts에 권한 에러 감지 로직 추가 (401 처리 블록과 ApiError 변환 사이에 커스텀 이벤트 dispatch)
  • src/shared/hooks/usePermissionRedirect.ts 신규 훅 생성 (permission-denied 이벤트 listen → 토스트 + 홈 리다이렉트)
  • src/shared/hooks/index.ts에 export 추가
  • src/shared/layout/RootLayout.tsxusePermissionRedirect() 호출 추가

mutation-only 페이지 접근 검증 쿼리 추가

  • src/pages/Topics/TopicCreatePage.tsxuseMeetingDetail 쿼리 추가 (페이지 로드 시점에 접근 권한 검증)
  • src/pages/Retrospectives/MeetingRetrospectiveCreatePage.tsxuseMeetingDetail 쿼리 추가 (동일)

검증

  • pnpm build 타입 에러 없는지 확인
  • pnpm lint 린트 통과 확인
  • 비멤버로 모임 상세/설정/약속 상세 URL 직접 접근 시 홈 리다이렉트 + 토스트 동작 확인
  • 비멤버로 주제 생성/회고 생성 URL 직접 접근 시 쿼리 실패 → 홈 리다이렉트 + 토스트 동작 확인
  • 기존 에러 처리(즐겨찾기 제한, 닉네임 중복 등) 영향 없는지 확인
  • 401(세션 만료) 리다이렉트가 기존처럼 동작하는지 확인

📝 메모

  • 정상 플로우(MeetingDetail → 하위 페이지 이동)에서는 React Query 캐시 히트로 추가 API 호출이 발생하지 않음
  • 추후 에러 코드 추가 시 PAGE_ACCESS_ERROR_CODES Set에만 추가하면 자동 적용됨
  • 액션 레벨 에러(GA005, B010, E105, G101)는 각 컴포넌트에서 개별 처리 필요 (이 이슈 범위 밖)

Metadata

Metadata

Assignees

Labels

feat새로운 기능 추가

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions