설명
패스워드 재설정 토큰을 uniqid, rand, mt_rand 같은 예측 가능한 값으로 생성하면 공격자가 재설정 링크나 코드를 추측할 수 있습니다. 재설정 토큰은 충분한 엔트로피를 가진 암호학적 난수여야 합니다.
잠재적 영향
- 패스워드 재설정 링크 추측
- 계정 탈취
- 재설정 코드 대입 공격 성공 가능성 증가
해결 방법
bin2hex(random_bytes(32))처럼 암호학적으로 안전한 난수로 토큰을 생성합니다.- 토큰은 해시하여 저장하고 짧은 만료 시간과 1회 사용을 적용합니다.
- 재설정 링크의 도메인은 요청 Host 헤더가 아닌 신뢰된 설정값에서 가져옵니다.
예시
savePasswordResetToken()은 사용자별 토큰 해시와 만료 시간을 저장하는 애플리케이션 함수이며 구현은 생략했습니다. 실제 재설정 처리에서 토큰 해시·만료를 확인하고 사용한 토큰을 다시 쓸 수 없게 해야 합니다.
변경 전
php
<?php
$resetToken = uniqid();
mail($email, 'Password reset', 'Use token ' . $resetToken);
변경 후
php
<?php
$resetToken = bin2hex(random_bytes(32));
$tokenHash = hash('sha256', $resetToken);
savePasswordResetToken($userId, $tokenHash, time() + 900);
mail($email, 'Password reset', 'Use token ' . $resetToken);
설명:
- 변경 전: 패스워드 재설정 토큰을
uniqid,rand,mt_rand같은 예측 가능한 값으로 생성하면 공격자가 재설정 링크나 코드를 추측할 수 있습니다. - 변경 후: 암호학적으로 안전한 난수로 재설정 토큰을 생성하고, 서버에는 토큰 해시와 짧은 만료 시간만 저장합니다.