# SPRINT-006: 버그 수정 + 인증 시스템 ## 목표 기존 버그 3건 수정 + JWT 기반 관리자 인증 시스템 구축 ## 태스크 ### TASK-020: 버그 수정 3건 **우선순위: 최우선 (인증 전환 전에 기존 기능 안정화)** #### BUG-1: 하네스 편집 저장 실패 (PUT /api/admin/harness/:name/:file) - 증상: API Key 입력해도 저장 실패 - 원인 조사: CORS PUT 메서드, DTO validation, AdminService.updateHarnessFile() 로직 확인 - FE 측: Authorization 헤더 전달, Content-Type, 에러 핸들링 확인 #### BUG-2: 로그 뷰어 초기 로드 안 됨 - 증상: /admin/logs 페이지 진입 시 로그가 비어있음 (수동 새로고침 필요) - 수정: 컴포넌트 마운트 시 자동 fetch (useEffect 초기 로드) - 자매/lines 기본값 설정 후 자동 조회 #### BUG-3: /api/admin/costs/record/:name 작동 안 함 - 증상: POST 요청 시 응답 없거나 에러 - 원인 조사: SSH 연결, python3 의존성, main.json 경로, 파싱 로직 확인 - python3 미설치 시 fallback (jq 또는 Node.js 스크립트) ### TASK-021: JWT 인증 BE - User 테이블 추가 (Prisma 마이그레이션) ``` model User { id Int @id @default(autoincrement()) username String @unique password String // bcrypt hash role String @default("admin") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } ``` - 인증 API: - `POST /api/auth/register` — 초대 코드 필수 (INVITE_CODE env), bcrypt hash - `POST /api/auth/login` — JWT access token (15분) + refresh token (7일) - `POST /api/auth/refresh` — refresh token으로 새 access token 발급 - `GET /api/auth/me` — 현재 사용자 정보 - JWT_SECRET, INVITE_CODE 환경변수 - Rate limiting: 로그인 엔드포인트 (5회/분) - 테스트: auth 관련 유닛 테스트 ### TASK-022: 로그인/회원가입 페이지 FE - `/login` 페이지: username + password + 로그인 버튼 - `/register` 페이지: username + password + 초대 코드 + 가입 버튼 - 디자인: DESIGN-SYSTEM.md v2 준수 (미니멀 터미널 UI) - 로그인 실패 시 에러 메시지 표시 - 토큰 저장: localStorage (access) + httpOnly cookie 검토 - 라우트 보호: 비로그인 시 `/login`으로 리다이렉트 - AuthContext/AuthProvider 구현 ### TASK-023: API Key Guard → JWT Guard 전환 - JwtGuard 생성 (passport-jwt) - 기존 ApiKeyGuard 유지 + JwtGuard 병행 (CompositeGuard: JWT 먼저 → API Key fallback) - 하위호환: API Key는 Sprint 008까지 유지, 이후 제거 예정 - WebSocket 인증: Socket.IO handshake에 JWT 토큰 검증 추가 - 모든 @UseGuards 교체 (ApiKeyGuard → CompositeGuard) ## 의존성 - TASK-020 먼저 완료 → TASK-021 → TASK-022 → TASK-023 - TASK-022는 TASK-021 완료 필요 (API가 있어야 FE 연동) ## 검증 기준 - 버그 3건 모두 재현 → 수정 → 동작 확인 - 회원가입(초대 코드) → 로그인 → JWT 발급 → 보호된 API 접근 성공 - API Key로도 기존 방식 그대로 접근 가능 (하위호환) - WebSocket 연결 시 JWT 검증 - npm run build 성공 + 테스트 통과