# task-506.1 완료 보고서: InsuRo 비로그인 사용자 접근 차단

## SCQA

**S**: InsuRo(React + Vite + Supabase Auth 기반 보험 CRM 앱)는 현재 개별 페이지에서 각각 인증 체크를 수행하며, `/intro`, `/guide` 등 다수 페이지가 비로그인 사용자에게 노출되어 있다.

**C**: 제이회장님이 "로그인하지 않은 사람은 아예 접속하지 못하게" 요청. 현재 전역 인증 가드가 없어 새 페이지 추가 시 인증 체크를 누락할 위험도 존재한다.

**Q**: 전역 인증 가드를 도입하여 비로그인 사용자의 모든 페이지 접근을 차단할 수 있는가?

**A**: `AuthGuard` 컴포넌트를 생성하여 App.tsx의 `<Routes>` 전체를 래핑. Supabase `getSession()` + `onAuthStateChange`로 세션을 체크하고, 인증 관련 경로(`/login`, `/reset-password`)와 고객 공개 경로(`/chat/:token`, `/namecard/:agentId`)만 예외 처리. TypeScript 에러 0건, 빌드 성공(7.28s).

---

## 작업 내용

### 생성 파일
- `src/components/AuthGuard.tsx` — 전역 인증 가드 컴포넌트

### 수정 파일
- `src/App.tsx` — AuthGuard import + Routes 래핑

### 구현 상세

**AuthGuard 동작 흐름:**
1. 마운트 시 `supabase.auth.getSession()`으로 현재 세션 확인
2. `onAuthStateChange` 구독으로 실시간 인증 상태 반영
3. 공개 경로(PUBLIC_PATHS/PUBLIC_PREFIXES) → 인증 체크 없이 즉시 렌더링
4. 세션 로딩 중 → Tailwind CSS 스피너 표시 (깜빡임 방지)
5. 비인증 → `<Navigate to="/login" state={{ from: location }} replace />` 리다이렉트
6. 인증 완료 → children 정상 렌더링

**공개 경로 목록:**
- `/login` — 로그인 페이지
- `/reset-password` — 비밀번호 재설정
- `/chat/*` — 고객 채팅 (토큰 기반, 외부 사용자용)
- `/namecard/*` — 디지털 명함 (에이전트ID 기반, 외부 사용자용)

---

## 테스트 결과

- `npx tsc --noEmit`: **에러 0건** (PASS)
- `npx vite build`: **성공** (7.28s, 3552 modules transformed)
  - dist/assets/index-C42KeGt7.js: 1,944.09 kB (기존 번들 사이즈, 변경 없음)
  - chunk size 경고는 기존 이슈 (본 작업과 무관)
- `npx vitest run src/components/AuthGuard.test.tsx`: **7/7 통과** (49ms)
  - 공개 경로 렌더링 4건 (login, reset-password, chat/:token, namecard/:agentId)
  - 보호 경로 로딩 스피너 1건
  - 비인증 리다이렉트 1건
  - 인증 시 정상 렌더링 1건

---

## 발견 이슈 (3건)

1. **기존 페이지별 인증 체크 중복**: Dashboard, Generate 등 개별 페이지의 `useEffect` 인증 로직이 AuthGuard와 중복. 기능적 문제 없으나 향후 정리 권장 (본 작업 범위 외)
2. **`/chat/:token`, `/namecard/:agentId` 공개 경로 추가**: 작업 지시서에는 "로그인/회원가입만 예외"이나, 이 경로들은 외부 고객용 페이지로 차단 시 서비스 중단 발생. 실용적 판단으로 공개 유지
3. **App.tsx AuthGuard 래핑 인덴테이션**: `<AuthGuard>` 태그의 들여쓰기가 기존 코드 스타일과 미세하게 불일치 (기능 영향 없음)

---

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-506.1-dev1
- **워크트리 경로**: /home/jay/projects/InsuRo/.worktrees/task-506.1-dev1
- **머지 의견**: tsc 에러 0건, 빌드 성공. 변경 범위 최소(2파일, +64줄). 기존 코드 패턴(Supabase Auth, React Router)을 그대로 활용. 충돌 가능성 낮음(App.tsx import 추가 + Routes 래핑만). 머지 권장.
