Skip to content

refactor: 보안 강화, 반응형 개편, 모듈화 및 로그인 수정#7

Merged
bbbang105 merged 2 commits intodevfrom
refactor/web-security-responsive-modularization
Feb 26, 2026
Merged

refactor: 보안 강화, 반응형 개편, 모듈화 및 로그인 수정#7
bbbang105 merged 2 commits intodevfrom
refactor/web-security-responsive-modularization

Conversation

@bbbang105
Copy link
Copy Markdown
Owner

@bbbang105 bbbang105 commented Feb 26, 2026

Summary

디스코드 로그인 간헐적 실패 근본 수정, 보안 취약점 6건 해결, 전 페이지 모바일 반응형 개편, 공유 컴포넌트 추출을 통한 코드 모듈화, 큐레이션 god component 분해를 포함한 종합 리팩터링.

  • 38 files changed, 1,656 insertions(+), 1,195 deletions(-)
  • 신규 파일 8개, 수정 파일 30개
  • TypeScript 0 에러

Changes

1. 로그인 간헐적 실패 수정

파일 변경 내용
src/proxy.ts (신규) Next.js 16 proxy convention으로 세션 갱신 미들웨어 생성. 매 요청마다 updateSession() 호출하여 쿠키 기반 세션 자동 갱신
src/lib/supabase/middleware.ts 개발 환경 한정 상세 디버깅 로그 추가 (쿠키 상태, 세션 갱신 결과)
src/app/auth/callback/route.ts OAuth 콜백 흐름 상세 로깅 추가

근본 원인: middleware 파일이 존재하지 않아 updateSession()이 호출되지 않음 → 첫 로그인 시 세션 쿠키 미갱신 → 실패 → 재시도 시 성공하는 패턴

2. 보안 취약점 수정 (6건)

파일 취약점 수정 내용
src/app/auth/callback/route.ts Open Redirect startsWith('/')new URL(rawNext, origin).origin === origin 검증
src/lib/rss-detect.ts SSRF isSafeUrl() 신규 — IPv4 사설대역 전체(172.16.0.0/12), IPv6 루프백(::1), 링크로컬(fe80::) 차단
src/app/api/*/route.ts (6개) 미인증 API 접근 createClient()getUser() 인증 체크 추가
next.config.js 보안 헤더 누락 X-Content-Type-Options, X-Frame-Options, Referrer-Policy 추가
src/app/api/admin/curation/[id]/route.ts 입력 검증 미흡 category, name, url, tags 타입 및 enum 검증 강화
src/app/api/members/route.ts 쿼리 인젝션 ALLOWED_STATUSES allowlist 검증

3. 모듈화 — 공유 컴포넌트 추출

파일 (신규) 제거한 중복 영향 범위
src/components/ui/page-state.tsx 동일한 로딩/에러 JSX 블록 26개 14개+ 페이지
src/components/ui/part-badge.tsx 인라인 파트 배지 코드 6곳 user/admin 페이지
src/components/ui/tag-list.tsx 태그 렌더링 블록 3곳 큐레이션 관련 페이지
src/lib/member-config.ts 멤버 상태 설정 객체 2곳 admin/members, admin/attendance

4. God Component 분해 (큐레이션)

파일 변경
admin/curation/page.tsx 1,087줄 → ~220줄 (오케스트레이션만 담당)
admin/curation/crawl-modal.tsx (신규) 크롤링 진행 Dialog + SSE 스트리밍 표시
admin/curation/source-form.tsx (신규) 소스 추가/수정 공용 폼
admin/curation/sources-table.tsx (신규) 데스크톱 테이블 + 모바일 카드 이중 뷰

5. 반응형 디자인 전면 개편

영역 변경 내용
레이아웃 overflow-x-hidden + min-w-0으로 수평 오버플로우 근본 차단
모든 테이블 데스크톱 테이블(hidden md:block) + 모바일 카드(md:hidden) 이중 구조
포스트 목록 모바일 컴팩트 리스트 뷰 (2줄 아이템)
대시보드 stat 카드 아이콘 shrink-0, 텍스트 min-w-0 + truncate
헤더/폼 모바일 세로 스택, 데스크톱 가로 배치 (flex-colsm:flex-row)

6. 코드 품질 개선

항목 Before After
사이드바 상태 관리 MutationObserver DOM 해킹 lifted React state (collapsed prop)
크롤링 상태 stale closure 위험 setCrawlStatus((prev) => ...)
소셜 링크 <span onClick={window.open}> <a target="_blank" rel="noopener noreferrer">
SourceForm 리마운트 암묵적 의존 key={editingSource.id} 명시
미사용 코드 onCrawl dead prop, 중복 블로그 URL 제거

Design Decisions

결정 이유
proxy.ts (Next.js 16 convention) middleware.ts는 Next.js 16.1에서 deprecated. proxy export가 공식 대체
SSRF에 isSafeUrl() 직접 구현 외부 라이브러리 추가 없이 최소한으로. 172.16.0.0/12 전체 + IPv6 커버
PageLoading/PageError 단일 컴포넌트 26곳 중복을 2줄로 대체. 오버엔지니어링 없이 최대 효과
모바일 카드 vs 가로 스크롤 테이블 카드뷰가 터치 UX에 더 적합하고 정보 밀도 유지
포스트 목록은 컴팩트 리스트 큐레이션(시각적 다양성)과 달리 포스트는 스캔 위주 → 카드보다 리스트가 적합
Rate limiting / CSP / CSRF 보류 각각 Redis 인프라 / 세밀한 설정 / Server Actions 전환 시 자동 해결. 오버엔지니어링 방지

Test Plan

  • pnpm typecheck — TypeScript 0 에러 확인 ✅
  • 로컬 pnpm dev:web으로 localhost:3200 정상 기동 확인
  • 디스코드 로그인 → 첫 시도에 성공하는지 확인
  • 모바일 뷰포트(375px)에서 전 페이지 가로 스크롤 없는지 확인
  • 대시보드 stat 카드 아이콘 잘림 없는지 확인
  • 관리자 큐레이션 페이지 CRUD + 크롤링 동작 확인
  • API 라우트 비인증 접근 시 401 반환 확인
  • auth callback에 ?next=https://evil.com 전달 시 /dashboard로 리다이렉트 확인

🤖 Generated with Claude Code

- 세션 갱신 proxy.ts 생성 (Next.js 16 convention) → 로그인 간헐 실패 근본 수정
- 보안: Open Redirect 방지, SSRF 차단 (IPv4/IPv6), API 인증 체크 6건, 보안 헤더
- 모듈화: PageLoading/PageError, PartBadge, TagList, MEMBER_STATUS_CONFIG 공유 컴포넌트 추출
- 큐레이션 god component 분해 (1,087줄 → 220줄 + 3개 컴포넌트)
- 반응형: 전 페이지 모바일 카드뷰, 레이아웃 오버플로우 수정, 사이드바 상태 리팩터링
- 코드 품질: MutationObserver 제거, stale closure 수정, dead code 정리

Co-Authored-By: Claude <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel bot commented Feb 26, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
study-admin-web Ready Ready Preview, Comment Feb 26, 2026 2:49am

Link 컴포넌트 내부의 소셜 링크를 <a> → <span role="link">으로 변경하여
HTML spec 위반(<a> 안에 <a>) 및 hydration 에러 해결

Co-Authored-By: Claude <noreply@anthropic.com>
@bbbang105 bbbang105 added the 🚨 fix 버그 수정 / 에러 해결 label Feb 26, 2026
@bbbang105 bbbang105 merged commit b310024 into dev Feb 26, 2026
7 checks passed
@bbbang105 bbbang105 deleted the refactor/web-security-responsive-modularization branch February 26, 2026 02:51
choihooo added a commit that referenced this pull request Mar 10, 2026
P0 #5: 주간 랭킹 날짜 필터 추가
- 문제: activityScores 테이블에서 모든 기간의 점수를 합산
- 해결: 이번 주 시작일(~ 00:00:00 KST)부터 종료일(~ 23:59:59.999 KST)까지의 점수만 필터링
- 파일: weekly-ranking.ts

P0 #6: 회차 시작 알림 타임존 수정
- 문제: UTC 기준으로 날짜 비교해서 KST에서 실행 시 날짜 불일치
- 해결: KST (UTC+9) 기준으로 오늘 날짜 구해서 비교
- 파일: round-reporter.ts (sendRoundStartAnnouncement)

P0 #7: 회차 종료 후 isCurrent 플래그 업데이트
- 문제: 회차 리포트 전송 후 isCurrent 플래그가 업데이트되지 않음
- 해결: 다음 회차가 있으면 해당 회차를 current로 설정, 없으면 현재 회차의 isCurrent를 false로 변경
- 파일: round-reporter.ts (sendRoundReport)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
choihooo added a commit that referenced this pull request Mar 10, 2026
* fix: 회차 스케줄러 버그 수정 (P0 #5, #6, #7)

P0 #5: 주간 랭킹 날짜 필터 추가
- 문제: activityScores 테이블에서 모든 기간의 점수를 합산
- 해결: 이번 주 시작일(~ 00:00:00 KST)부터 종료일(~ 23:59:59.999 KST)까지의 점수만 필터링
- 파일: weekly-ranking.ts

P0 #6: 회차 시작 알림 타임존 수정
- 문제: UTC 기준으로 날짜 비교해서 KST에서 실행 시 날짜 불일치
- 해결: KST (UTC+9) 기준으로 오늘 날짜 구해서 비교
- 파일: round-reporter.ts (sendRoundStartAnnouncement)

P0 #7: 회차 종료 후 isCurrent 플래그 업데이트
- 문제: 회차 리포트 전송 후 isCurrent 플래그가 업데이트되지 않음
- 해결: 다음 회차가 있으면 해당 회차를 current로 설정, 없으면 현재 회차의 isCurrent를 false로 변경
- 파일: round-reporter.ts (sendRoundReport)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor: 타임존 처리를 formatKSTDate 헬퍼 함수로 분리

코드 리뷰 사항 반영:
- P0 #6 타임존 처리 로직을 formatKSTDate() 헬퍼 함수로 분리
- 코드 재사용성과 명확성 향상
- KST 오프셋 계산 로직을 함수 내부로 캡슐화

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚨 fix 버그 수정 / 에러 해결 🔄 refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant