---
title: "260522_C7-login재진입가드"
notion_id: "368229620868819c8e76ff4901a49a52"
notion_url: "https://app.notion.com/p/368229620868819c8e76ff4901a49a52"
category: "workreport"
parent: "Claude Code 작업보고"
updated: "2026-05-22"
priority: "Low"
purpose: "로그인 상태에서 /login 재진입 시 /dashboard로 즉시 리다이렉트 (빈 root 화면 방지)"
---

## 작업 개요
- 작업 ID: C-7
- 일시: 2026-05-22
- 작업자: Claude Code (Opus 4.7, 1M context)
- 작업 경로: d:dallogdallog_git
- 브랜치: main
## 사용자 지시 (원문)
```javascript
C-7 작업. 로그인 상태에서 /login 접근 시 /dashboard로 즉시 리다이렉트되도록 수정한다.
신규 로그인 성공 직후에도 /login 빈 root 상태에 머물지 않고 /dashboard로 전환되게 한다.

확인할 증상:
1. localStorage(dallog.masterSession)가 잔존한 상태에서 /login 진입 시 URL은 /login 유지, root 빈 화면 노출
2. 신규 수동 로그인 직후 dallog.masterSession 저장은 성공하지만 /dashboard 전환 누락
3. 정상 동작은 로그인 상태 /login 접근 시 /dashboard 즉시 redirect

구현 방향:
1. Login 페이지 또는 라우터 가드에서 dallog.masterSession 존재 여부 확인
2. 로그인 상태면 /login 렌더링 전에 /dashboard로 redirect
3. 마스터 로그인 성공 직후에도 navigate('/dashboard') 또는 동등한 라우팅 처리 보장
4. Google OAuth / Supabase Auth 흐름이 있다면 기존 흐름을 깨지 않도록 유지
5. 빈 root 상태가 발생하지 않도록 loading/redirect 상태 처리

주의사항:
- E-6 Markdown 렌더링 파일 건드리지 않는다.
- C-6 migration/type 파일 건드리지 않는다.
- F계열 UI 작업은 하지 않는다.
- 기존 staged 잔여물이 있으면 임의로 건드리지 말고 보고한다.

완료 기준:
1. npm run build 성공
2. localStorage에 dallog.masterSession이 있는 상태에서 /login 접근 시 /dashboard로 전환됨
3. mster/qwer1234 로그인 직후 /dashboard로 전환됨
4. 비로그인 상태에서는 /login 정상 표시
5. git diff --name-only 출력 보고
6. 수정 파일만 개별 git add
```
## 사전 점검
### git status (작업 시작 시)
기존 staged 잔여물 존재 (E-6 / C-6 / F-7 산출물). 지시대로 건드리지 않고 보고:
- A  .playwright-mcp/page-2026-05-20T08-23-18-022Z.yml
- A  docs/260520_playwright_browsing_[report.md](http://report.md)
- A  migrations/2026-05-22_records_updated_at.sql
- M  package-lock.json
- M  package.json
- A  src/components/MarkdownBriefRenderer.tsx
- M  src/lib/supabase.ts
- M  src/pages/CoachNotes.tsx
### git fetch
원격은 origin/main 기준 최신. pull은 실행하지 않음.
## 원인 분석
[src/App.tsx](src/App.tsx)의 라우터 구조:
```typescript
function AppRouter() {
  return (
    <Routes>
      <Route path="/" element={<Layout />}>
        <Route index element={<Navigate to="/dashboard" replace />} />
        <Route path="dashboard" element={<Dashboard />} />
        ...
      </Route>
    </Routes>
  )
}

export default function App() {
  const { isLoggedIn, loading } = useAuth()
  ...
  if (!isLoggedIn) return <LoginPage />   // ← URL 무관하게 직접 렌더
  return <AppRouter />
}
```
**핵심 원인:** AppRouter에 `/login` 경로가 정의되어 있지 않음.
- 로그인 상태에서 `/login` 진입 → AppRouter 렌더 → 매칭되는 라우트 없음 → Layout의 빈 Outlet 노출 (증상 1)
- 수동 로그인 성공 → `signInMaster()`가 localStorage 저장 + MASTER_EVENT dispatch → useAuth가 `isLoggedIn=true`로 갱신 → App이 AppRouter로 전환되지만 URL은 여전히 `/login` → 동일하게 빈 Outlet (증상 2)
LoginPage / MasterLoginForm / useAuth 자체는 정상. 라우터에 redirect만 추가하면 두 증상이 동시에 해결됨.
## 구현
### 변경 파일
- [src/App.tsx](src/App.tsx) (1개 파일, +2줄)
### diff
```diff
@@ -18,6 +18,8 @@ import { applyTheme, loadThemePref, subscribeSystemTheme } from './lib/theme'
 function AppRouter() {
   return (
     <Routes>
+      {/* C-7: 로그인 상태에서 /login 재진입 시 대시보드로 즉시 리다이렉트 */}
+      <Route path="/login" element={<Navigate to="/dashboard" replace />} />
       <Route path="/" element={<Layout />}>
         <Route index element={<Navigate to="/dashboard" replace />} />
         <Route path="dashboard" element={<Dashboard />} />
```
### 설계 결정
- `/login` redirect 라우트를 Layout 외부에 배치 → Layout(사이드바)이 깜빡이지 않고 즉시 /dashboard로 이동
- 비로그인 흐름은 그대로: `App`이 `<LoginPage />`를 직접 렌더하므로 AppRouter를 거치지 않음 → 기존 동작 보존
- Google OAuth `/auth/callback` 흐름도 영향 없음 (App.tsx 상단에서 별도 처리)
- 와일드카드 `/*` 폴백은 의도적으로 추가하지 않음 (수술적 변경 원칙 — 지시 범위 초과)
## 검증
### 1. 빌드
```javascript
> tsc && vite build
✓ 360 modules transformed.
✓ built in 2.60s
```
타입 에러·빌드 에러 없음.
### 2. Playwright 시각 검증 (1440×900, [http://localhost:5173](http://localhost:5173))
#### 증상 1 — localStorage 잔존 + /login 진입
```javascript
localStorage.setItem('dallog.masterSession', '1')  → set:'1'
browser_navigate('/login')
browser_wait_for(2s)

결과:
  url: http://localhost:5173/dashboard  ← 전환 성공
  bodyTextLen: 206
  hasNav: true (사이드바 렌더)
```
#### 증상 2 — mster/qwer1234 신규 로그인
```javascript
localStorage.removeItem('dallog.masterSession')
browser_navigate('/login')
browser_type(아이디, 'mster')
browser_type(비밀번호, 'qwer1234')
browser_click(로그인)

결과:
  url: http://localhost:5173/dashboard  ← 클릭 즉시 전환
  masterSession: '1'  ← 저장 정상
  bodyTextLen: 206
  hasNav: true
```
#### 증상 3 — 비로그인 시 /login 정상 표시
```javascript
localStorage.removeItem('dallog.masterSession')
window.dispatchEvent(MASTER_EVENT)
browser_navigate('/login')
browser_wait_for(2s)

결과:
  url: http://localhost:5173/login  ← 유지
  masterSession: null
  hasLoginForm: true (비밀번호 input 렌더)
  bodyTextLen: 137 (브랜드+폼)
```
3개 시나리오 모두 기대 동작.
## git
### git diff --name-only
```javascript
src/App.tsx
```
### git add
```javascript
git add src/App.tsx
```
`git add .` / `git add -A` 미사용. 기존 staged 잔여물은 그대로 둠 (별도 작업 산출물).
## 완료 기준 충족 여부
- [x] npm run build 성공
- [x] localStorage에 dallog.masterSession이 있는 상태에서 /login 접근 시 /dashboard로 전환됨
- [x] mster/qwer1234 로그인 직후 /dashboard로 전환됨
- [x] 비로그인 상태에서는 /login 정상 표시
- [x] git diff --name-only 보고
- [x] 수정 파일만 개별 git add (src/App.tsx)
## 사용자에게 남기는 메모
- 본 작업은 `src/App.tsx`만 수정 (단일 파일, +2줄). 다른 staged 변경은 별도 작업분으로 그대로 보존.
- 커밋·푸시는 사용자 결정 영역으로 남겨둠.
- v2 보고서의 P1-6 (login 재진입 가드) 항목이 본 작업으로 해소 가능.
