Skip to content

chore: 의존성 보안 업데이트 및 CI·lint 정리 - #22

Merged
with-developer merged 10 commits into
mainfrom
dev
Nov 2, 2026
Merged

with-developer merged 10 commits into
mainfrom
dev

Conversation

@with-developer

Copy link
Copy Markdown
Owner

배경

  • npm audit에서 next 14.2.24의 보안 권고(critical 포함)와 하위 의존성 취약점 다수
  • GitHub Actions가 Node 20 기반 액션(checkout v3, setup-node v3, vercel-action v20) 때문에 매 실행마다 지원 종료 경고
  • npm run lint가 동작하지 않음: Next 14의 next lint는 flat config(eslint.config.mjs)를 인식하지 못해 설정 마법사가 대화형으로 뜨고, 그 설정 파일은 존재하지 않는 패키지(eslint-plugin-next, nextConfig named export)를 import
  • 사용하지 않는 의존성과 파일이 남아 있음

변경 사항

의존성

  • next, eslint-config-next 14.2.24 → 14.2.35 (14.x 최신 보안 패치)
  • npm audit fix(호환 범위) 및 brace-expansion 1.1.11 → 1.1.21
  • 운영 의존성 취약점 4개 → 2개. 남은 next/postcss 권고는 15.5 이상에서만 수정되며, 미들웨어·i18n·App Router·next/image·next/script·WebSocket·자체 호스팅 대상이라 이 앱에는 해당 없음. jest·eslint 등 개발 도구의 남은 권고는 메이저 업그레이드가 필요해 이번 범위에서 제외

CI

  • actions/checkout v3 → v7, actions/setup-node v3 → v7, amondnet/vercel-action v20 → v42 (모두 Node 24 기반)
  • vercel-action v42는 org/project ID를 모두 요구(기존에도 전달 중)하며 vercel-args(--prod)를 쓰는 CLI 모드와 preview-url 출력은 그대로
  • 테스트 job에 lint 단계 추가

lint

  • eslint.config.mjs를 Next 14 표준 .eslintrc.json(next/core-web-vitals + prettier)으로 교체
  • 페이지의 <img>는 모두 API가 만드는 동적 SVG 카드라 @next/next/no-img-element는 끔

정리

  • 사용하지 않는 node-fetch, msw, @testing-library/react, eslint-plugin-prettier 제거
  • node-fetch용 jest transformIgnorePatterns, 설치되지 않은 @vercel/kv 목, Vercel에서 쓰지 않는 scripts/verify-tests.sh 제거

테스트

  • npm ci(새 lockfile), jest 88개, tsc --noEmit, next build, npm run lint(경고·오류 없음) 통과
  • next 14.2.35 빌드로 next start 후 /, /api/stats, /api/most-solved, /api/user-id, /api/warmup 동작 확인
  • dev 푸시 시 새 버전 액션으로 CI 테스트(lint 포함) 및 Vercel Preview 배포 확인

🤖 Generated with Claude Code

https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd

Others 카테고리가 새로 생기며 Most Solved Categories 범례가 4개에서
5개로 늘어나 박스 하단이 빡빡해진 문제 수정. 범례 시작점을 위로 올리고
배경 박스를 키워 5개 항목의 상하 여백 균형을 맞춤.
SVG가 <img>로 렌더링되면(GitHub README, 메인페이지 미리보기) 브라우저가
외부 리소스를 불러오지 않아 Google Fonts @import가 무시되고, OS 기본
monospace 폰트(macOS Chrome은 Menlo, Safari는 Courier 등)로 표시되던 문제 수정.
JetBrains Mono 가변 폰트를 카드에 쓰는 굵기(400~700)와 ASCII 문자만 남겨
서브셋한 뒤 base64 @font-face로 SVG에 직접 임베드하고, 서브셋 생성
스크립트와 폰트 라이선스(OFL)를 함께 추가.

Claude-Session: https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd
Vercel이 Node.js 20 지원을 종료해(2026-10-01) 배포가 실패하므로
package.json engines로 Vercel 빌드/함수 런타임을 24.x로 지정하고,
CI 테스트도 같은 버전으로 맞춤.

Claude-Session: https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd
- 닉네임 등 외부 값을 SVG에 넣을 때 XML 이스케이프 (Try&Catch, DUck_< 카드가
  깨지던 문제)
- Dreamhack 검색어를 URL 인코딩 (p&p, #7851A9 등을 찾지 못하던 문제)하고, 검색
  API가 50개까지만 돌려주므로 최대 5페이지까지 확인
- 사용자를 찾지 못하거나 조회에 실패하면 JSON 대신 안내 카드(SVG, 200)를 반환해
  README에 깨진 이미지 대신 이유를 표시 (GitHub camo는 200이 아닌 응답을 502로
  바꿈). 찾지 못한 닉네임은 10분간 캐시
- 캐시된 ID가 404일 때 캐시를 지우고 다시 검색하도록 재시도 로직 수정
- 프로필 링크를 숫자 ID 주소로 생성 (/api/user-id 추가, 메인 페이지와 README
  안내 수정)
- 메인 페이지 미리보기와 생성 코드의 닉네임 인코딩, 입력값 앞뒤 공백 제거
- Dreamhack 요청마다 10초 타임아웃을 두고 함수 최대 실행 시간을 60초로 설정

Claude-Session: https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd
- next, eslint-config-next 14.2.24 -> 14.2.35 (14.x 최신 보안 패치)와
  npm audit fix로 하위 의존성 업데이트. 운영 의존성 취약점 4개 -> 2개
  (남은 next 권고는 15.5 이상에서만 수정되며 미들웨어·i18n·App Router·
  next/image 등 이 앱에서 쓰지 않는 기능 대상)
- GitHub Actions를 Node 24 기반 버전으로 업데이트 (checkout v7,
  setup-node v7, vercel-action v42)해 Node 20 지원 종료 경고 해소
- 동작하지 않던 lint 설정 수리: Next 14의 next lint가 인식하지 못하는
  flat config(없는 패키지를 import)를 .eslintrc.json으로 교체하고 CI에
  lint 단계 추가
- 사용하지 않는 node-fetch, msw, @testing-library/react,
  eslint-plugin-prettier와 @vercel/kv 목, verify-tests.sh 제거

Claude-Session: https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd
@with-developer
with-developer merged commit 3c6c406 into main Nov 2, 2026
6 checks passed

This branch was successfully deployed

1 active deployment
Preview — ab706114 Deployed Nov 2, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant