AWESOMEDEV e04e93cf18
All checks were successful
CI / backend-test (push) Successful in 1m22s
CI / frontend-build (push) Successful in 24s
CI / backend-dep-scan (push) Successful in 31s
feat(security): 보안 3종 — PII 감사로그·공개쓰기 레이트리밋·CI 의존성 스캔
SEC-02 PII 감사로그(누가·언제·어디서 개인정보를 조회/내보냈/파기했나):
- AuditLog 엔티티 + AuditLogRepository + AuditService(DB 영속 + slf4j 이중기록)
- MentorController: 명단조회·CSV내보내기·비번재설정·학생파기 4개 민감지점에 기록
- GET /api/mentor/audit-logs + MentorPage에 '개인정보 접근 기록' 표(남기기+보기 짝)
- 미성년 수습생 PII라 개인정보보호법상 접근기록 의무 대응

SEC-03 공개쓰기 레이트리밋(무인증 남용 방어):
- RateLimiterService(범용 고정창, Clock 주입, 메모리) — LoginAttemptService와 별도(단일책임)
- signup(30건/시간/IP: 대량가입·알림폭탄 차단), find-id(15건/10분/IP: 이름열거 차단)
- 초과 시 429. ClientIp 유틸로 rightmost XFF(Caddy 뒤 실제 IP) 공용화(AuthController 중복 제거)

CI 의존성 스캔:
- 프론트 npm audit(--omit=dev --audit-level=high, 비차단), 백엔드 OSV-Scanner v2.4.0(비차단)
- 둘 다 continue-on-error로 '보고 전용' 시작 → 무관한 신규 권고로 CI가 붉어지지 않게

적대적 보안 리뷰(4관점→검증) 확정 4건(전부 LOW) 반영:
- 파기 감사에 대상 아이디/이름 박제(파기 후 id는 dangling → '누구'를 못 알던 문제)
- 가입 한도 10→30(기수 동시 온보딩 대비), 감사 저장 전 로그 선기록(DB실패 시 흔적 유지)
- 고정창 경계 2배 특성 문서화, npm audit 비차단 전환

테스트 29→47(RateLimiter 5·Audit 3·SecurityContract 2 추가), 전부 통과.
운영 검증: audit_log 테이블 생성·감사쓰기(실IP 포함)·find-id 429·스모크 11/11 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 18:52:44 +09:00
..