Skip to content

feat: 웹 API 표준화 + 보안 강화 + 에러 처리 개선#19

Merged
bbbang105 merged 1 commit intodevfrom
feat/web-api-standardize-security
Mar 8, 2026
Merged

feat: 웹 API 표준화 + 보안 강화 + 에러 처리 개선#19
bbbang105 merged 1 commit intodevfrom
feat/web-api-standardize-security

Conversation

@bbbang105
Copy link
Copy Markdown
Owner

@bbbang105 bbbang105 commented Mar 8, 2026

Summary

  • 전체 웹 API 라우트를 표준 에러/성공 응답 패턴으로 통일
  • 보안 레이어 강화 (XSS, SSRF, CSP)
  • 에러 처리 UX 개선 (에러 바운더리, 404, 토스트)

Changes

API 표준화 (16개 라우트)

파일 변경
api/auth/me, api/auth/logout Errors.unauthorized() + successResponse() 적용
api/profile/route, edit, withdraw 전체 에러 응답 Errors.*() 통일
api/members/route, [id] withCache(successResponse(...), 60) 적용
api/posts/route, manual Errors.unauthorized() + SSRF 체크 추가
api/ranking/route withCache(successResponse(...), 30) 적용
api/scores/route Errors.unauthorized() 적용
api/rounds/route, [id] 미인증 엔드포인트에 auth 체크 추가
api/admin/fines/route, [id] errorResponse() 통일
api/admin/settings/route errorResponse() 통일
api/board/route, [id] sanitizeTiptapContent() XSS 방어 적용

보안 강화

파일 변경
lib/sanitize.ts sanitizeTiptapContent() 추가 (javascript:/data:/vbscript: 링크 제거)
lib/rss-detect.ts isSafeUrl() export로 변경 (SSRF 방어 재사용)
api/admin/curation/crawl/route.ts SSRF 체크 (isSafeUrl()) 적용
api/posts/manual/route.ts SSRF 체크 적용
next.config.js Content-Security-Policy 헤더 추가

에러 처리 & UX

파일 변경
lib/api-error.ts withCache() 유틸 추가
app/layout.tsx sonner <Toaster /> 추가
app/not-found.tsx 커스텀 404 페이지 (신규)
app/(user)/error.tsx 사용자 에러 바운더리 (신규)
app/(admin)/error.tsx 관리자 에러 바운더리 (신규)
admin/fines/page.tsx inline 토스트 → sonner toast.success/error
profile/edit/page.tsx 저장 성공 토스트 추가
board/write, board/[id]/edit 작성/수정 성공 토스트 추가
posts/page.tsx 중복 fetchPostsuseCallback 통합

문서

파일 변경
CLAUDE.md sonner, sanitize, withCache, 보안 컨벤션 추가
docs/26-03-06-patterns.md Cache-Control, 새니타이즈, SSRF, 토스트 패턴 추가
docs/ARCHITECTURE.md 보안 섹션 + 에러 처리 섹션 추가

Design Decisions

결정 이유
withCache() scope 기본값 private 인증 필수 API이므로 CDN 캐싱 방지
sanitizeTiptapContent() 서버사이드 적용 클라이언트 우회 가능하므로 저장 시점에서 방어
sonner 선택 shadcn/ui 공식 추천 토스트 라이브러리, 번들 크기 작음
CSP에 unsafe-inline 포함 Next.js App Router가 인라인 스크립트/스타일 사용

Test Plan

  • 로그인 후 각 페이지 정상 렌더링 확인
  • API 에러 시 표준 JSON 응답 반환 확인
  • 게시글 작성 시 javascript: 링크 필터링 확인
  • 벌금 관리 페이지 토스트 정상 동작 확인
  • 404 페이지 표시 확인 (/nonexistent)
  • CSP 헤더 응답에 포함 확인

🤖 Generated with Claude Code

- 모든 API 라우트를 Errors/successResponse/errorResponse 표준 패턴으로 통일
- withCache() 유틸 추가 (members 60s, ranking 30s Cache-Control)
- sonner 토스트 시스템 통합 (inline 토스트 제거)
- sanitizeTiptapContent()로 게시판 XSS 방어 (javascript:/data:/vbscript: 차단)
- isSafeUrl() SSRF 방어 (posts/manual, curation/crawl)
- CSP 헤더 설정 (next.config.js)
- 에러 바운더리 추가 (user/admin error.tsx)
- 커스텀 404 페이지 추가
- 미인증 API 엔드포인트 수정 (rounds, rounds/[id])
- posts/page.tsx 중복 fetchPosts를 useCallback으로 통합

Co-Authored-By: Claude <noreply@anthropic.com>
@bbbang105 bbbang105 requested a review from choihooo as a code owner March 8, 2026 09:04
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 8, 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 Mar 8, 2026 9:04am

@bbbang105 bbbang105 added the 🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정 label Mar 8, 2026
@bbbang105 bbbang105 merged commit 5fae290 into dev Mar 8, 2026
8 checks passed
@bbbang105 bbbang105 deleted the feat/web-api-standardize-security branch March 8, 2026 09:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant