Skip to content

[ Auth ] 이메일 인증번호가 예측 가능하고 시도 횟수 제한이 없다 #86

Description

@RosieOh

💚 어떤 기능인가요?

EmailVerificationService 의 인증번호에 문제가 세 가지 있다.

1. 예측 가능한 난수

Stringcode = 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions