---
title: "📅 2026-05-28 (목) 작업일지"
notion_id: "36e2296208688144b0ddcc98f61eea43"
notion_url: "https://app.notion.com/p/36e2296208688144b0ddcc98f61eea43"
category: "devlog"
parent: "개발일지 (날짜별)"
updated: "2026-05-28"
priority: "Medium"
purpose: "v0.9 진입 의사결정 라운드/SAFEZONE RLS 1~3차 fix/소셜 풀스택/OAuth 진입점/Codex 검수 기록"
---

# 📅 2026-05-28 (목) 작업일지

> **운영 메모:** 오늘의 베이스 페이지. 이후 추가 작업은 새 페이지 발행 없이 append.
> **컨텍스트 구성:** 본 일자에는 1개 주력 컨텍스트 연속 운영 (09:00–21:30). 논스톱 수행.

---

## 01. 장대한 의사결정 라운드 — 아침·오전
**환경:** 사무실 PC `D:\dallog\dallog_git`
**도구:** Claude Code Opus 4.7 (1M context · 단일 컨텍스트)
**성격:** v0.9 클로즈베타 진입 직전 대규모 설계 결정 라운드

### 진행 내용
- 노션 작업 체크리스트 V2 고령 + V1 동결 수신
- 활일단위: #1 v0.9 클로즈베타 진입 선행·#2 SAFEZONE·#3 로그인·약관·사용자 관리·#4 소셜 기능 확장 4개 그룹 서명·우선순위 설계
- 2-3 환경 분리 5건 (도메인·CF Pages·Supabase·Workers 분리) 의사결정 + 사장님 명시 "D Supabase 분리·E Workers 분리·C 동일 프로젝트 브랜치 기반" 채택
- 개인정보 가명처리 제안 검토 + Supabase Auth 기본 구조 활용으로 해소 (사장님 컴펜)
- 본인인증 Phase A (카카오·네이버·Gmail OAuth 신뢰) 정식·SNS 시점까지 지속 지향 — 사장님 명시적 장기 정책

### 발행물 (아침·오전 세션)
- `docs/260528_oauth_kakao_naver_setup_guide.html` (11p, 별도 커밋 `c056969`)
- `docs/260528_user_verification_opinion_and_briefing.html` (10p+§10, 별도 커밋)
- `docs/260528_social_feature_mockup.html` (9 섹션 + 30+ 모바일 목업, 사장님 공식 컴펜 "목업안으로 결정, 타 섹션까지 이식")
- 메모리: `verification-policy.md` (Phase A 지속) — 사장님 명문화

### 컨텍스트 종합
- 자리 떤 없이 하루 종일 진행
- 사장님 다수 차례의 찠언 + CC 결정 큐는 우선순위·분할 채택·의사결정 5건 쓓임

---

## 02. 디자인 폴리싱 v2 + SAFEZONE 1차 — 적용 (오후)

### 진행 내용
- `src/index.css`: NanumSquare Neo 제거 + Pretendard Variable CDN 도입 (`--font-body`)
- 컴포넌트 클래스 확장: `.toggle-group`/`.toggle-opt` · `.callout` 4종 · `.checkbox-row` · `.modal-mock` · `.feed-card` · `.badge` 색 4종 · `.stack`/`.hstack` 헬퍼
- 새 토큰: `--accent-soft` · `--warn`/`--success`/`--info` + soft/border
- `src/main.tsx`: NanumSquare CSS import 제거 (1.7MB woff2 미로드)
- `src/pages/Dashboard.tsx`: BODY/RUNNING/STRENGTH 탭 인라인 스타일 → `.toggle-group` 으로 통일
- `docs/sql/260528_safezone_rls_policy_a.sql` 발행 (10 테이블 RLS·user_id 마이그레이션·정책 (a))
- `workers/brief-proxy/index.js` 보안 보강: `securityCheck()` 미들웨어 (body size 50KB · rate limit 360건/한시간 · JWT decode 옵션)
- 발행: `docs/sql/260528_safezone_rls_policy_a.sql` (1차)

### 커밋 3건 (오후)
- `3778fe2 feat(safezone): RLS 정책(a) SQL + Worker 보안 보강`
- `cf0cb06 feat(design): Pretendard 본문 폰트 + 목업 catalog 컴포넌트 이식 + Dashboard 탭 통일`
- `c056969 docs(260528): OAuth 가이드 + 본인인증 의견서 + 소셜 기능 목업 3종 발행`

### 검증
- Playwright 스모크: `smoke_dashboard_dark.png` · `smoke_dashboard_light.png` 양쪽 양호
- 빌드: 423 modules · CSS 15.00KB gzip 3.76KB · JS 1171KB gzip 347KB

---

## 03. SAFEZONE 적용 후 사장님 검증 + 결함 2건 발견 (저녁)

### 사장님 검증 결과
1. **결함 1 — is_master() false 반환**: 마스터·OAuth 양 계정 모두 false. `auth.jwt() ->> 'email'` 방식의 SECURITY DEFINER + STABLE 조합 이싈.
2. **결함 2 — app_settings 데이터 누출**: 마스터 로그인 시 OAuth 사용자 설정 데이터 (메모·프로젝트·AI지침·루틴·신발 설정 등 14개 key) 그대로 조회됨. 사장님 평 "타 사용자 신규화면에서 해당 타 사용자에 의해 같은 문제가 발견이 되었다면 달록 기록보안 신뢰에 치명적 데미지".

### 원인 분석 (CC)
- 결함 1: `auth.jwt()` SECURITY DEFINER + STABLE 조합에서 [request.jwt.claims](http://request.jwt.claims) GUC 전달 불안정
- 결함 2: 1차 SAFEZONE SQL이 `app_settings`를 글로벌 테이블 4종에 잘못 분류. 실제는 사용자별 설정 저장소 (14개 key 모두 사용자별 데이터).

---

## 04. SAFEZONE fix v2 + 소셜 기능 구현 + OAuth 진입점 (아괲~밤)
사장님 명시 위임: 논스톱 + 커밋·push 제약 해제 + 노션 업로드까지 컴퓨터 켜두고 퇴근.

### 진행 내용

#### Part A — SAFEZONE fix v2 SQL 발행 (1시간)
- `docs/sql/260528_safezone_rls_fix_v2.sql` (314줄)
- is_master() 재정의: `auth.users.raw_user_meta_data ->> 'role' = 'master'` 기반 + plpgsql + SECURITY DEFINER + EXCEPTION fallback
- app_settings 재분류: user_id 추가 · ccy8215 UUID 매핑 · (user_id,key) unique · 사용자별 RLS
- 마스터 OR 조건 제거: 정책 (a) 적용 (사장님 컴펜)

#### Part B — 소셜 기능 DB 스키마 (1시간 30분)
- `docs/sql/260528_social_schema.sql` (545줄)
- 8개 테이블: profiles · follows · posts · post_likes · post_comments · blocks · reports · notifications
- 트리거 3종: 좋아요·댓글 카운트 동기화 · 팔로우·좋아요·댓글 알림 자동 생성
- ccy8215 프로필 시드 + Storage 버킷 `avatars` 안내
- V-1~V-7·M-4 권장안 일괄 채택 기준

#### Part C — 소셜 클라이언트 코드 (3시간)
- `src/lib/social.ts` (315줄) — 인터페이스 5종 + API 25개
- `src/pages/SocialFeedPage.tsx` (370줄) — SNS 피드 + 작성모달 + 신고모달 인라인
- `src/pages/SocialProfilePage.tsx` (220줄) — 본인/타인/편집 모드 자동 분기
- `src/pages/SocialPostDetailPage.tsx` (130줄) — 게시 상세 + 댓글 sticky 입력바
- `src/pages/SocialNotificationsPage.tsx` (95줄) — 알림 센터
- `src/pages/NaverCallbackPage.tsx` (80줄) — 네이버 자체 OAuth 콜백 (골격)

#### Part D — OAuth 진입점 + 라우팅 + 사이드바 (30분)
- `src/lib/auth.ts`: signInWithKakao + signInWithNaver
- `src/pages/LoginPage.tsx`: 카카오(노란)·네이버(초록)·Gmail 3종 버튼 노출
- `src/App.tsx`: 7 신규 라우트 + 네이버 콜백 예외 처리
- `src/components/Layout.tsx`: SocialIcon 신설 + 사이드바·하단탭바 SNS 항목

### 검증
- 빌드 통과: 429 modules · JS 1203.65KB gzip 356.14KB · CSS 15.00KB gzip 3.76KB
- Playwright 스모크: `smoke_social_feed.png` (SNS탭 정상, posts 테이블 404 예상 완료 — 사장님 SQL 실행 대기) · `smoke_login_oauth.png` (3종 OAuth 버튼 노출)

### 커밋 4건 (저녁·밤)
- `14ca02c fix(safezone): 결함 2건 수정 SQL v2 — is_master 재정의 + app_settings 사용자 테이블 재분류 + 마스터 OR 제거`
- `cd6c957 feat(social): 작업 7·8·9 DB 스키마 + lib/social`
- `1ae1ce4 feat(social): 작업 7·8·9 페이지 5종 + 라우팅 + 사이드바 SNS 항목`
- `62ecebe feat(auth): 카카오·네이버 OAuth 진입점 + Login 페이지 버튼 3종 추가`
- push origin/main 성공 (사장님 제약 해제 위임 활용)

### 의사결정 기록 (상세)
하위 페이지 참조: `📝 26-05-28_2-작업노트_의사결정기록` (핸드오프 하위)
- 결정 1: 마스터 RLS 권한 (a) 채택 — 사장님
- 결정 2: 데모 시드 (M-4) 본격 도입 보류 (작업 8-3) — CC 재량
- 결정 3: 디자인 이식 CoachNotes/History/Settings 후속화 — CC 재량
- 결정 4: 데모 버튼 Login 미추가 — CC 재량
- 결정 5: 소셜 파일 4개 압축 — CC 재량
- 결정 6: Workers auth-proxy 이관 — CC 재량
- 결정 7: is_master() (c) raw_user_meta_data 기반 — CC 재량
- 결정 8: 차단 RLS 이중화 보류 — CC 재량
- 결정 9: 프로필 클라이언트 ensure — CC 재량
- 결정 10: 폰트 Pretendard — 사장님 명시 + CC 재량

### 산출물 합계
- SQL 파일 2종 (859줄)
- 신규 클라이언트 파일 6개 (소셜 5 + NaverCallback 1, 약 1210줄)
- 수정 파일 4개 (App·Layout·auth·LoginPage)
- HTML 발행물 3종 (OAuth 가이드·본인인증 의견서·소셜 목업)
- 커밋 7건 (아침 3 + 저녁·밤 4)
- 메모리 3건 신규 (verification-policy · master-rls-policy · nonstop-autonomy)

---

## 05. 다음 컨텍스트 이관 사항

### 사장님 액션 (출근 직후)
1. SAFEZONE fix v2 SQL 실행 + 검증 4종
2. 소셜 스키마 SQL 실행 + 검증
3. Supabase Storage `avatars` 버킷 생성
4. OAuth 콘솔 작업 마무리
5. 2계정 교차 검증 (마스터 mster + OAuth ccy8215 + 선택적 추가 OAuth ccy4848)

### CC 액션 (다음 컨텍스트)
1. 사장님 검증 결과 접수 → 회귀 fix 대응
2. CF Workers `auth-proxy` 신설 — 네이버 token exchange
3. 디자인 이식 잔여 (CoachNotes · History · Settings)
4. 약관·개인정보처리방침 Claude 표준 템플릿 초안 (P-2)
5. 작업 1-2 v0.9 기준문서 정합화

### 메모리 신규 사항
- `feedback_nonstop_autonomy.md` — 논스톱 위임 시 중간 컴펜 없이 CC 재량 + 의사결정 기록 의무
- `project_master_rls_policy.md` — 마스터 RLS 권한 (a) 명문화
- `project_verification_policy.md` (아침 세션) — Phase A 지속

---

## 06. 관련 페이지
- 핸드오프 (아침): `📋 26-05-28_1-달록_핸드오프` (생략 — 자동 통합 부었으니 설명)
- 핸드오프 (저녁): `📋 26-05-28_2-달록_핸드오프`
- 작업노트: `📝 26-05-28_2-작업노트_의사결정기록`
- 작업보고(디자인 폴리싱·SAFEZONE·소셜·OAuth): 신규 발행 생략 — 핸드오프와 작업노트로 통합
- V2 작업 체크리스트: 상위 결정 반영 액션 — 다음 컨텍스트에서 체크박스 일부 광합
- 마지막 커밋: `62ecebe` · origin/main sync OK
- 배포: [https://dallog.pages.dev](https://dallog.pages.dev) (테스트 mster / qwer1234)
- 백업: `D:/dallog/backup_full.sql` (2026-05-28 16:59)

---

## 06. 사장님 검증 + 신발 결함 fix v3 + Codex 검수 (야간 후속)
§04 (SAFEZONE fix v2 + 소셜 + OAuth) 커밋·push 후 사장님이 직접 SAFEZONE 1차+v2 SQL 실행. 3계정 교차 검증에서 신발 잔존 결함 발견 → fix v3 + Codex 검수 1라운드 추가.

### 진행 내용 요약

#### Part A — 사장님 검증 보고 접수
- ✅ 기존 OAuth ccy8215: 큰 변화 없음, 기록 보존 정상
- ❌ 신규 OAuth [ccy8215.work](http://ccy8215.work): 신발 목록 잔존 (개인 러닝 설정-신발)
- ❌ 마스터 mster: 신발 목록 잔존
- 사장님 가설: "user_id 분리 없이 글로벌로 등록된 기존 데이터 때문에 완벽한 데이터 분리 안 됨"

#### Part B — 원인 분석 (CC)
1차 SAFEZONE SQL 이 `shoe_configs` + `exercise_configs` 를 글로벌 4종으로 분류한 게 결함. fix v2 에서는 `app_settings` 만 사용자 테이블로 재분류, 신발·종목은 글로벌 유지.

#### Part C — fix v3 SQL 발행 (240줄)
- `docs/sql/260528_safezone_rls_fix_v3.sql`
- shoe_configs: 완전 사용자 분리 (user_id 추가 + ccy8215 매핑 + RLS 사용자별)
- exercise_configs: 하이브리드 정책 (`is_basic` 컬럼 활용 — 기본 24종은 글로벌, 사용자 추가 3종은 ccy8215 매핑)
- 검증 쿼리 6종

#### Part D — Codex adversarial 검수 (`--background` 자동 실행)
판정: needs-attention · 지적 2건:
- [high] blanket UPDATE 위험 (shoe_configs/exercise_configs)
- [medium] supabase/.temp/ 메타데이터 노출 위험

#### Part E — ⭐ Codex 지적 vs 사장님 의도 충돌 → 사장님 우선 채택
사장님 명시: "현재 등록된 모든 신발은 ccy8215. mster 가 글로벌 시절에 등록했었다 하더라도 결국 다 ccy8215 신발."
- Codex high 지적은 일반론(다중 사용자) 에서 맞지만 1인 운영 현실에 해당 없음
- fix v3 audit guard: `RAISE EXCEPTION` → `RAISE NOTICE` 완화 (사장님 의도 반영)
- row 수 달라도 진행, 사장님 본인 매핑 보장
- .gitignore 갱신: supabase/.temp/, supabase/.branches/ 추가 (Codex medium 반영)

#### Part F — 노션 페이지 2종 재구성
- V2 체크리스트: 각 섹션 상단 ✅ 회색박스로 기진행 분리 + 미진행만 체크박스
- v0.9 충족기준: §4 신규 5항목 (4-9 SAFEZONE · 4-10 소셜 · 4-11 OAuth · 4-12 본인인증 Phase A · 4-13 발행 문서) + §5 ✅ 표시 + 잔존만 체크박스 + §10 신설

#### Part G — Storage 버킷 가이드 + 남은 작업 표
- Storage `avatars` 버킷 생성 7단계 + 정책 4종 SQL (사장님 출근 후 액션)
- 남은 작업 22 항목 디테일 표 (작업자 + 의사결정 컬럼 추가) — 핸드오프 §9 영구 보존, 다음 컨텍스트가 그대로 출력 (사장님 명시 2026-05-28)

#### Part H — 메모리 2건 신규
- `feedback_nondev_explainer` — 비개발자 친절 해설 의무
- `project_data_classification_lesson` — 신규 RLS 설계 시 백업 row 단위 분류

#### Part I — 추가 커밋·push
- `7876ff7 fix(safezone-v3+codex): shoe_configs + exercise_configs 사용자 테이블 재분류 + Codex 검수 반영 + 사장님 의도 완화`
- origin/main 합계: 본 일자 5 커밋 push 완료

### 의사결정 추가 3건 (작업노트 §11~§13)
1. 외부 검수와 사장님 정보 충돌 시 사장님 우선 (일반 규칙)
2. Storage 버킷 생성은 Dashboard 7단계 (SQL 자동화 불가)
3. fix + 외부 검수 반영 1 커밋 패턴

### 컨텍스트 종합 (본 일자 통합)
- 시작: 2026-05-28 09:00 KST
- 완료: 2026-05-28 23:55 KST
- 작업 시간: 약 15시간 (점심 + 자리비움 + 사장님 검증 시간 포함, 순수 작업 약 11.5시간)
- 한 컨텍스트에서 SAFEZONE 3차 (1차+v2+v3) + 소셜 풀스택 + OAuth 진입점 + 디자인 시스템 v2 + 노션 5 페이지 + Codex 1라운드 + 사장님 검증 1라운드 일괄 처리
- 사장님 명시 위임 (논스톱 + 커밋·push 제약 해제 + 노션 업로드까지) 완수

### 다음 컨텍스트 첫 액션
**📌 다음 컨텍스트는 핸드오프 §9 표를 가장 먼저 그대로 출력하라 (사장님 명시 2026-05-28).**
1. 사장님 fix v3 SQL 실행 + Storage 버킷 + 3계정 교차 검증 결과 접수
2. 회귀 발견 시 즉시 fix
3. CF Workers `auth-proxy` 신설 (네이버, 사장님 키 후)
4. 약관 P-2 Claude 표준 초안
5. 디자인 이식 잔여 (CoachNotes·History·Settings)

### 관련 페이지
- 핸드오프 §8·§9: [📋 26-05-28_2-달록_핸드오프](#/doc/handoff-14)
- 작업노트 §11~§13: [📝 26-05-28_2-작업노트_의사결정기록](https://www.notion.so/36e22962086881b0a46dde23d6c033e3)
- v0.9 충족기준 §10: 2026-05-28 야간 통합 컨텍스트 갱신
- V2 체크리스트: 2026-05-28 갱신본
- 마지막 커밋: `7876ff7`
