## 💚 어떤 기능인가요? `EmailVerificationService` 의 인증번호에 문제가 세 가지 있다. **1. 예측 가능한 난수** ```java String code = String.valueOf((int)(Math.random() * 900000) + 100000); ``` `Math.random()` 은 선형 합동 생성기다. 이전 출력에서 다음 값을 예측할 수 있어 인증 수단으로 쓰면 안 된다. **2. 시도 횟수 제한 없음** 6자리 숫자라 후보가 90만 개뿐인데 `verifyCode` 가 시도를 세지 않는다. 유효시간 5분 안에 전수 조회가 가능하다. **3. 재발송 간격 없음** 같은 주소로 메일을 무한정 보낼 수 있다. 발송 비용이 들고 수신자에게는 그대로 스팸이 된다. 부수적으로 코드 비교가 `String.equals` 이고, 인증 링크에 운영 IP 가 하드코딩돼 있다. ## ✅ To Dos - [ ] `Math.random()` → `SecureRandom` - [ ] 코드당 검증 시도 상한 도입 (초과 시 코드 폐기) - [ ] 재발송 쿨다운 (발송 실패 시에는 해제해 사용자가 갇히지 않게) - [ ] 상수 시간 비교 적용 - [ ] 인증 링크의 하드코딩 IP 를 설정값으로 - [ ] 회귀 테스트 추가
Activity