feat: 메일 인증 링크 유효시간 설정 추가

This commit is contained in:
whitedot committed 2026-09-09 07:58:05 +00:00
1 parent 7b3c2e845b
commit d111100856
11 files changed
+105 -14

No files matched your search

+48
View File
@@ -2696,6 +2696,54 @@ function get_email_cert_key($mb_id, $mb_datetime)
return hash_hmac('sha256', $payload, $key);
}
/**
* 발급 시각을 포함한 메일 인증용 일회용 토큰을 생성한다.
*
* @return string
*/
function get_email_certify_token()
{
return get_random_token_string(16) . '.' . G5_SERVER_TIME;
}
/**
* 메일 인증 토큰의 일치 여부와 유효시간을 확인한다.
*
* 발급 시각이 없는 기존 토큰은 회원가입 시각을 기준으로 만료 여부를 확인한다.
*
* @param string $token
* @param string $stored_token
* @param string $mb_datetime
* @param int $valid_minutes
* @param int|null $now
* @return bool
*/
function is_valid_email_certify_token($token, $stored_token, $mb_datetime, $valid_minutes, $now = null)
{
if (!$token || !$stored_token || !hash_equals((string) $stored_token, (string) $token)) {
return false;
}
$valid_minutes = (int) $valid_minutes;
if ($valid_minutes < 1) {
return true;
}
if (preg_match('/\.([0-9]{10})$/', $stored_token, $matches)) {
$issued_at = (int) $matches[1];
} else {
$issued_at = strtotime($mb_datetime);
}
if (!$issued_at) {
return false;
}
$now = $now === null ? G5_SERVER_TIME : (int) $now;
return $issued_at + ($valid_minutes * 60) >= $now;
}
/**
* CSRF 방지용 Origin/Referer 검증 (OWASP 권장 패턴).
*