---
title: "C-3. 마스터로그인수정 + 데모타이틀변경"
notion_id: "36422962086881fdb852d88a3b4c48b2"
notion_url: "https://app.notion.com/p/36422962086881fdb852d88a3b4c48b2"
category: "workreport"
parent: "Claude Code 작업보고"
updated: "2026-05-18"
priority: "Low"
purpose: "마스터로그인(mster/qwer1234) localStorage 세션 전환 + 데모버전 타이틀 변경 (브랜치 분리)"
---

## 📌 스터디 요약
**파트-섹션:** C-3 | **작업일:** 2026-05-18 | **에이전트:** Claude Code (Opus 4.7 1M) | **브랜치:** main + demo
- 사용자가 **달록 셉션 3 잔여 작업 재투입** 지시
- **작업 1:** `mster/qwer1234` 마스터로그인 수정 (main). Supabase Auth 의존 → localStorage 로컈 세션으로 전환. 커밋 `53eedd6` + push
- **작업 2:** 데모버전 타이틀 '달록 (demoversion)'으로 변경 (demo). index.html/manifest/og:title 변경. 커밋 `767fb86` + push
- main 브랜치는 원래 타이틀(달록 — PaceLog) 그대로 유지됨 확인
**파트 연관:** C파트 — 인증/백엔드 / 선행: C-2 / 후속: C-4(데모버전 구축 및 main 통합)

---
# 달록 셉션 3 잔여 작업 - 마스터로그인 수정 / 데모 타이틀 변경
작업일: 2026-05-18
브랜치: main, demo

---
## [User 프롬프트]
```
[달록 셉션 3 잔여 작업 - 재투입]

※ 주의: 동일 작업을 수행 중인 다른 에이전트가 있을 수 있음.
작업 시작 전 git status 확인 후 충돌 여부 점검할 것.
충돌 감지 시 git stash 또는 git reset으로 정리 후 진행.

파일 경로: D:\dallog\dallog_git

작업 1. 마스터계정 로그인 수정
- ID: mster / PW: qwer1234 로 로그인 가능하도록 구현
- 현재 로그인 실패 상태, 관련 인증 로직 확인 및 수정
- 시크릿 모드에서 테스트 가능한 상태로 완료

작업 2. 데모버전 타이틀 변경
- 변경 전: 달록_PaceLog (또는 달록 — PaceLog)
- 변경 후: 달록 (demoversion)
- 적용 위치: demo 브랜치 index.html title 태그 및
  manifest, og:title 등 관련 메타태그 전체

완료 후:
- main 브랜치 커밋·푸시 (작업 1)
- demo 브랜치 커밋·푸시 (작업 2)
- 각 작업별 완료 상태 요약 제공
```

---
## [Assistant 작업 진행]
### 1. 초기 상태 점검
- 워킹 트리 clean, main 브랜치 up to date
- 코드 충돌 없음 → 지시대로 진행
### 2. 인증 흔름 분석 / 진단
`signInMaster`는 `supabase.auth.signInWithPassword`를 호출하여 `master@dallog.internal` 사용자가 Supabase Auth에 존재해야만 동작. 클라이언트 anon 키로는 해당 사용자 생성이 불가능하므로 항상 실패하는 구조.
**해결 방향:** Supabase 의존 제거 + 로컈 세션 기반으로 우회
### 3. 코드 수정 — src/lib/auth.ts
```typescript
// 인증 헬퍼 — 마스터계정(로컈 세션)·Gmail OAuth 통합 진입점 — 2026.05.16 갱신
export const MASTER_DISPLAY_ID = 'mster'
const MASTER_PASSWORD = 'qwer1234'
const MASTER_LOCAL_KEY = 'dallog.masterSession'
export const MASTER_EVENT = 'dallog:master-session-change'

/** 마스터계정 로그인 (Supabase 의존 없이 로컈 세션으로 처리) */
export async function signInMaster(id: string, pw: string) {
  if (id !== MASTER_DISPLAY_ID) throw new Error('계정을 찾을 수 없습니다.')
  if (pw !== MASTER_PASSWORD) throw new Error('비밀번호가 올바르지 않습니다.')
  localStorage.setItem(MASTER_LOCAL_KEY, '1')
  window.dispatchEvent(new Event(MASTER_EVENT))
}

export function hasMasterSession() {
  try { return localStorage.getItem(MASTER_LOCAL_KEY) === '1' }
  catch { return false }
}

export async function signOut() {
  localStorage.removeItem(MASTER_LOCAL_KEY)
  window.dispatchEvent(new Event(MASTER_EVENT))
  await supabase.auth.signOut()
}
```
### 4. 코드 수정 — src/hooks/useAuth.ts
```typescript
import { hasMasterSession, isMaster, MASTER_EMAIL, MASTER_EVENT } from '../lib/auth'

const MASTER_USER = { email: MASTER_EMAIL } as User

export function useAuth() {
  const [user, setUser] = useState<User | null>(null)
  const [loading, setLoading] = useState(true)
  const [masterLocal, setMasterLocal] = useState(() => hasMasterSession())

  useEffect(() => {
    // Supabase 세션 구독
    supabase.auth.getSession().then(({ data }) => { ... })
    // 마스터 로컈 세션 이벤트 리스닝
    const onMasterChange = () => setMasterLocal(hasMasterSession())
    window.addEventListener(MASTER_EVENT, onMasterChange)
    window.addEventListener('storage', onMasterChange)
    // ...
  }, [])

  const effectiveUser = user ?? (masterLocal ? MASTER_USER : null)
  return {
    user: effectiveUser,
    loading,
    isMasterUser: effectiveUser ? isMaster(effectiveUser) : false,
    isLoggedIn: !!effectiveUser,
  }
}
```
### 5. 빌드 검증 + main 커밋·푸시
```
npx tsc --noEmit  # 성공
npx vite build    # 103 modules, 2.02s
git add src/lib/auth.ts src/hooks/useAuth.ts
git commit -m "fix: 마스터 로그인 mster/qwer1234 로컈 세션 방식으로 수정 - Supabase 의존 제거"
git push origin main
```
커밋: `53eedd6` / push: `e4b6fef..53eedd6  main -> main`
### 6. demo 브랜치 전환 + 타이틀 변경
```bash
git checkout demo
```
**index.html 변경:**
- `<title>달록 — PaceLog</title>` → `<title>달록 (demoversion)</title>`
- `og:title` 편집: `"달록 — 달리기 기록"` → `"달록 (demoversion)"`
**public/manifest.json 변경:**
- `"name": "달록"` → `"name": "달록 (demoversion)"`
- `"short_name": "달록"` → `"short_name": "달록 demo"`
```bash
git add index.html public/manifest.json
git commit -m "feat: 데모버전 타이틀 '달록 (demoversion)'으로 변경 - title·manifest·og:title 일괄"
git push origin demo
```
커밋: `767fb86` / push: `80020bf..767fb86  demo -> demo`
### 7. main 브랜치 복귀 + 브랜치 분리 확인
```
git checkout main
```
main의 `index.html`은 원래 타이틀(`달록 — PaceLog`) 그대로 유지, manifest 역시 원래 상태 유지 — **브랜치 분리 정상 동작 확인.**

---
## [Assistant 최종 보고]
**작업 1. 마스터계정 로그인 수정 (main 브랜치)**
수정 파일:
- `src/lib/auth.ts` — ID/PW를 클라이언트에서 직접 검증 후 localStorage에 마스터 세션 플래그 저장, MASTER_EVENT 디스패치
- `src/hooks/useAuth.ts` — Supabase 세션 + 마스터 로컈 세션 둘 다 구독, 둘 중 하나라도 활성이면 isLoggedIn true
**칔멥:** `53eedd6` (main) → origin 푸시 완료
**작업 2. 데모버전 타이틀 변경 (demo 브랜치)**
변경 위치:
- `index.html` title 태그 + og:title 메타태그
- `public/manifest.json` name + short_name
main 브랜치는 원래 타이틀 그대로 유지됨 확인.
**커밋:** `767fb86` (demo) → origin 푸시 완료

---
*작업 로그 03 | 2026.05.18 추출 | Claude Opus 4.7 (1M context)*
