계정 보안 구현 - 연속 실패 시 계정 잠금 서비스 추가
eapim-portal CI / build (push) Has been cancelled
eapim-portal Test / test (push) Has been cancelled

- 비밀번호 본인확인 연속 실패 정책 및 처리 로직 추가
- 작성 요청 빈도 제한 서비스 및 메시지 구현
- 키보드 연속 문자 검증 규칙 및 테스트 추가
This commit is contained in:
Rinjae
2026-08-25 20:24:46 +09:00
parent 80b072983f
commit b58893d098
33 changed files with 920 additions and 145 deletions
@@ -0,0 +1,73 @@
package com.eactive.apim.portal.common.validator;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* [WEB-SER-006] 키보드 배열 연속 문자 차단 규칙 검증.
*
* <p>클라이언트 {@code static/js/password-policy.js} 의 hasKeyboardSequence 와 동일 규칙이어야 한다.</p>
*/
class PasswordRuleValidatorTest {
private final PasswordRuleValidator validator = new PasswordRuleValidator();
@Test
@DisplayName("키보드 배열 인접 3자 이상이면 연속으로 판정한다")
void detectsKeyboardSequence() {
String[] values = {
"qwe", "asd", "zxc", "qwert", "asdfg",
"QWE", "AsDfG", // 대소문자 무시
"ewq", "dsa", "trewq", // 역방향
"abqwe12", "12asd!@" // 문자열 중간에 포함
};
for (String value : values) {
assertTrue(PasswordRuleValidator.hasKeyboardSequence(value), value + " 는 키보드 연속으로 판정돼야 한다");
}
}
@Test
@DisplayName("키보드 배열 인접이 아니면 연속으로 보지 않는다")
void ignoresNonSequence() {
String[] values = { "qw", "qa", "qaz", "qwa", "Djb#7k2Qm4", "Jeju@2026x", "aq", "" };
for (String value : values) {
assertFalse(PasswordRuleValidator.hasKeyboardSequence(value), value + " 는 키보드 연속이 아니어야 한다");
}
}
@Test
@DisplayName("null 은 연속으로 보지 않는다")
void nullIsNotSequence() {
assertFalse(PasswordRuleValidator.hasKeyboardSequence(null));
}
@Test
@DisplayName("점검 지적 사례 qwert12! 는 정책 적용 시 거부된다")
void rejectsReportedCase() {
assertFalse(validator.isValid("qwert12!", null, null, true), "qwert12! 는 거부돼야 한다");
}
@Test
@DisplayName("정책을 끄면 qwert12! 가 다른 규칙만으로 판정된다")
void allowsWhenPolicyDisabled() {
assertTrue(validator.isValid("qwert12!", null, null, false), "정책 off 면 통과해야 한다");
}
@Test
@DisplayName("정상 비밀번호는 정책을 켜도 통과한다")
void acceptsStrongPassword() {
assertTrue(validator.isValid("Djb#7k2Qm4", null, null, true));
}
@Test
@DisplayName("기존 규칙(연속 문자·반복·공백)은 그대로 동작한다")
void keepsExistingRules() {
assertFalse(validator.isValid("abc12345!", null, null, true), "알파벳 3연속은 거부");
assertFalse(validator.isValid("Djb#7kkk2", null, null, true), "동일 문자 3회 반복은 거부");
assertFalse(validator.isValid("Djb# 7k2Q", null, null, true), "공백 포함은 거부");
assertFalse(validator.isValid("Djb#7k2", null, null, true), "8자 미만은 거부");
}
}