From 6e4abf9f274252b2c11bb7efa4079bd15b04b38d Mon Sep 17 00:00:00 2001 From: eastargh Date: Thu, 27 Aug 2026 16:05:22 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=8B=9C=20SMS=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebContent/jsp/common/screen/emergency.jsp | 35 ++++++- .../login/ChangePasswordResponseDto.java | 25 +++++ .../rms/common/login/LoginResponseDto.java | 5 + .../eai/rms/common/login/MainController.java | 91 ++++++++++++++++--- .../ext/djb/smsauth/SmsAuthController.java | 42 +++++++++ .../eai/rms/ext/djb/smsauth/SmsAuthDto.java | 5 + .../rms/ext/djb/smsauth/SmsAuthService.java | 36 ++++++++ 7 files changed, 224 insertions(+), 15 deletions(-) diff --git a/WebContent/jsp/common/screen/emergency.jsp b/WebContent/jsp/common/screen/emergency.jsp index b2eacc2..16ca022 100644 --- a/WebContent/jsp/common/screen/emergency.jsp +++ b/WebContent/jsp/common/screen/emergency.jsp @@ -65,6 +65,7 @@ // SMS 인증 관련 변수 var smsAuthTimer = null; var resendTimer = null; + var smsAuthPurpose = 'LOGIN'; // 'LOGIN' | 'PASSWORD_CHANGE' - SMS 인증 모달을 어느 흐름에서 띄웠는지 구분 function fncPreMain() { if ($("input[name=userId]").val() ==null || $("input[name=userId]").val().length == 0 ){ @@ -96,6 +97,7 @@ } else if (response.smsAuthRequired) { // SMS 인증 필요 + smsAuthPurpose = 'LOGIN'; showSmsAuthModal(response); } else if (response.success) { // 직접 로그인 성공 @@ -123,11 +125,21 @@ function showSmsAuthModal(data) { $('#smsAuthMaskedPhone').text(data.maskedPhone); $('#smsAuthCode').val(''); + updateSmsTestHint(data.smsTestHint); startExpiryTimer(data.expiresAt); startResendTimer(data.resendableAt); $('#smsAuthModal').modal('show'); } + // fixed 모드(djb.sms_auth.mode=fixed)일 때만 서버가 내려주는 테스트용 인증번호 힌트 표시 + function updateSmsTestHint(hint) { + if (hint) { + $('#smsAuthTestHint').text(hint).show(); + } else { + $('#smsAuthTestHint').text('').hide(); + } + } + // 유효시간 타이머 function startExpiryTimer(expiresAt) { clearInterval(smsAuthTimer); @@ -181,6 +193,7 @@ dataType: 'json', success: function(data) { if (data.sent) { + updateSmsTestHint(data.smsTestHint); startExpiryTimer(data.expiresAt); startResendTimer(data.resendableAt); alert('인증번호가 재발송되었습니다.'); @@ -194,7 +207,7 @@ }); } - // SMS 인증번호 확인 + // SMS 인증번호 확인 (로그인 / 비밀번호 변경 공용 - smsAuthPurpose로 분기) function verifySmsAuthCode() { var code = $('#smsAuthCode').val(); if (!code || code.length !== 6) { @@ -203,17 +216,25 @@ return; } + var isPasswordChange = (smsAuthPurpose === 'PASSWORD_CHANGE'); + var verifyUrl = isPasswordChange + ? '' + : ''; + $.ajax({ - url: '', + url: verifyUrl, type: 'POST', data: { authCode: code }, dataType: 'json', success: function(data) { if (data.success) { $('#smsAuthModal').modal('hide'); + if (isPasswordChange) { + alert(data.message); + } window.location.href = data.redirectUrl; } else { - alert(data.errorMessage || '인증에 실패했습니다.'); + alert(data.errorMessage || data.message || '인증에 실패했습니다.'); } }, error: function() { @@ -275,6 +296,13 @@ data: $('#modalLoginForm').serialize(), dataType: 'json', success: function(response) { + if (response.smsAuthRequired) { + // 비밀번호는 아직 반영되지 않음 - SMS 인증 완료 시 최종 반영됨 + smsAuthPurpose = 'PASSWORD_CHANGE'; + $('#pwdChgModal').modal('hide'); + showSmsAuthModal(response); + return; + } alert(response.message); if (response.success) { window.location.href = response.redirectUrl || ''; @@ -462,6 +490,7 @@ placeholder="인증번호 6자리" maxlength="6" onkeypress="return event.charCode >= 48 && event.charCode <= 57"> +

남은 시간: 60