AWESOMEDEV c5c4a5b1f9 fix(security): 무인증 계정 탈취 경로 차단 + 세션 고정 방어 + 거짓 주석 수정
보안 검토(4개 영역 병렬)에서 확인된 실제 취약점 수정:

[HIGH] 무인증 계정 탈취 연쇄 — find-id로 아이디 획득 → 아이디+이름만으로 비밀번호 재설정
  → 요청 2번으로 멘토 권한 탈취 가능했음 (공개 서버, 시드 이름 예측 가능)
  - 무인증 POST /api/auth/reset-password 제거
  - find-id 응답 아이디 마스킹 (mentor1 → me****1)
  - 대체 경로 신설: POST /api/auth/change-password(본인, 현재 비번 재인증),
    POST /api/mentor/users/{id}/reset-password(멘토 전용, 학생 계정만)
  - 프론트: 재설정 폼 → 안내로 교체, 비밀번호 변경 페이지·멘토 재설정 UI 추가

[MEDIUM] 세션 고정 — 로그인 시 세션 ID 미재발급 (직접 구현이라 formLogin의 방어가 빠져 있었음)
  - changeSessionId() 추가. 세션 부재 시 IllegalStateException 나는 것 확인해 가드 포함

[교재 품질] 코드와 어긋난 주석 수정 — 학생이 주석 신뢰를 잃는 것이 가장 큰 손해
  - Badge: 라벨표 이중화로 REVIEWED가 화면마다 다르게 표시되던 실제 버그 수정(PASSED 추가)
  - QuizResult: 정렬 없이 '가장 최근'을 가정하던 주석 → OrderBy 명시로 사실화
  - runJs: (0, eval) 설명 → 실제 코드(new Function)에 맞게 수정
  - runJs: Worker는 fetch가 되므로 '멘토 화면에서 학생 코드 실행 금지' 회귀 경고 명시

운영 검증: 로그인 200 / 무인증 재설정 401 / 학생→멘토API 403 / 멘토 재설정 200

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