@@ -7,13 +7,14 @@ import Loader from '@/components/ui/common/Loader';
77
88/**
99 * ApiCodeGuard
10- * - /auth/{role}?team=<TEAM>&next =<...> (team은 전달 시에만 포함)
11- * - 200(또는 body.code=200) 이면 통과, 아니면 /auth/signin?next=... 로 이동
10+ * - /auth/{role}?next=<...>&team =<...>(옵션) 호출해 200(또는 body.code=200)이면 통과
11+ * - 아니면 로그인( /auth/signin?next=...)으로 보냄
1212 *
1313 * props:
14- * - requiredRole: 'GUEST'|'MEMBER'|'CORE'|'LEAD'|'ORGANIZER'|'ADMIN' (필수)
15- * - requiredTeam?: 'HR'|'BD'|'TECH'|'PR_DESIGN' ... (선택, 전달 시에만 서버에 team 쿼리 포함)
16- * - nextOverride?: string (선택)
14+ * - requiredRole: 'GUEST'|'MEMBER'|'CORE'|'LEAD'|'ORGANIZER'|'ADMIN'
15+ * - requiredTeam?: 'HR'|'BD'|'TECH'|'PR_DESIGN' (옵션, 주어질 때만 쿼리에 포함)
16+ * - nextOverride?: string
17+ * - children: ReactNode
1718 */
1819export default function ApiCodeGuard ( { requiredRole, requiredTeam = '' , nextOverride, children} ) {
1920 const router = useRouter ( ) ;
@@ -24,7 +25,7 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
2425 const [ checking , setChecking ] = useState ( true ) ;
2526 const [ allowed , setAllowed ] = useState ( false ) ;
2627
27- // 사용자가 원래 가려던 경로 (로그인 실패 시 next로 넘김 )
28+ // next URL 계산 (override > 현재 경로 )
2829 const nextUrl = useMemo ( ( ) => {
2930 if ( nextOverride ) return encodeURIComponent ( nextOverride ) ;
3031 const q = searchParams ?. toString ( ) ;
@@ -35,6 +36,7 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
3536
3637 useEffect ( ( ) => {
3738 if ( ! requiredRole ) {
39+ // 역할이 없으면 바로 차단
3840 router . replace ( `/auth/signin?next=${ nextUrl } ` ) ;
3941 return ;
4042 }
@@ -43,18 +45,11 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
4345
4446 const verify = async ( ) => {
4547 try {
46- // 쿼리 파라미터를 조건부로 구성
48+ // ✅ 권한 체크: /auth/{role}?next=... (&team=... 은 전달된 경우에만)
4749 const params = { next : decodeURIComponent ( nextUrl ) } ;
48- if ( requiredTeam ) {
49- params . team = requiredTeam ;
50- }
50+ if ( requiredTeam ) params . team = requiredTeam ;
5151
52- const res = await apiClient . get ( `/auth/${ requiredRole } ` , {
53- params, headers : {
54- Accept : 'application/json' ,
55- } , // 401/403도 정상 분기로 처리
56- validateStatus : ( s ) => s === 200 || s === 204 || s === 401 || s === 403 ,
57- } ) ;
52+ const res = await apiClient . get ( `/auth/${ requiredRole } ` , { params} ) ;
5853
5954 if ( cancelledRef . current ) return ;
6055
@@ -64,9 +59,6 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
6459 if ( okHttp && okBody ) {
6560 setAllowed ( true ) ;
6661 } else {
67- if ( res ?. status === 403 ) {
68- alert ( '권한이 부족합니다.' ) ;
69- }
7062 router . replace ( `/auth/signin?next=${ nextUrl } ` ) ;
7163 }
7264 } catch {
@@ -79,6 +71,7 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
7971 } ;
8072
8173 void verify ( ) ;
74+
8275 return ( ) => {
8376 cancelledRef . current = true ;
8477 } ;
0 commit comments