diff --git a/backend/src/main/java/moadong/global/validator/PasswordValidator.java b/backend/src/main/java/moadong/global/validator/PasswordValidator.java index 5495b4eb6..3382efe3b 100644 --- a/backend/src/main/java/moadong/global/validator/PasswordValidator.java +++ b/backend/src/main/java/moadong/global/validator/PasswordValidator.java @@ -7,13 +7,16 @@ import java.util.regex.Pattern; public class PasswordValidator implements ConstraintValidator { - // 8 ~ 20자이고, 반드시 한 개의 알파벳, 한 개의 숫자, !@#$%^ 중 한 개가 모두 들어 갔는지 확인 - private static final Pattern PASSWORD_PATTERN = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[!@#$%^]).{8,20}$"); + private static final String REGEX = "^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^])(?!.*\\s).{8,20}$"; + private static final Pattern PASSWORD_PATTERN = Pattern.compile(REGEX); + @Override - public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { + public boolean isValid(String s, ConstraintValidatorContext context) { if (s == null || s.isEmpty()) { - return true; + return false; } return PASSWORD_PATTERN.matcher(s).matches(); } + } + diff --git a/backend/src/test/java/moadong/unit/user/PasswordValidatorTest.java b/backend/src/test/java/moadong/unit/user/PasswordValidatorTest.java new file mode 100644 index 000000000..5b0812901 --- /dev/null +++ b/backend/src/test/java/moadong/unit/user/PasswordValidatorTest.java @@ -0,0 +1,40 @@ +package moadong.unit.user; + +import moadong.fixture.UserFixture; +import moadong.global.validator.PasswordValidator; +import moadong.util.annotations.UnitTest; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +@UnitTest +public class PasswordValidatorTest { + private final PasswordValidator passwordValidator = new PasswordValidator(); + + @Test + void 유효한_비밀번호는_유효하다() { + boolean isValid = passwordValidator.isValid(UserFixture.collectPassword, null); + Assertions.assertThat(isValid).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = { + "short1!", // 7자 (길이 부족) + "longpassword1234567890!", // 21자 (길이 초과) + "abcdefgh", // 영문 소문자만 (숫자 없음) + "ABCDEFGH", // 영문 대문자만 (숫자 없음) + "12345678", // 숫자만 (영문 없음) + "Abcdefgh", // 영문만 (숫자 없음) + "abcd1234*", // 허용되지 않은 특수문자 `*` + "abc def123!", // 공백 포함 + "passWord!", // 특수문자 있음, 숫자 없음 + "1234!@#$", // 숫자 + 특수문자, 문자 없음 + "Abcdef12()", // 괄호 포함 (허용되지 않은 특수문자) + "ABCD1234~", // `~` 특수문자 허용 안됨 + }) + void 유효하지_않은_비밀번호는_실패한다(String password) { + boolean isValid = passwordValidator.isValid(password, null); + Assertions.assertThat(isValid).isFalse(); + } +} diff --git a/backend/src/test/java/moadong/unit/user/UserRegisterTest.java b/backend/src/test/java/moadong/unit/user/UserRegisterTest.java index c53eeb664..f67e17256 100644 --- a/backend/src/test/java/moadong/unit/user/UserRegisterTest.java +++ b/backend/src/test/java/moadong/unit/user/UserRegisterTest.java @@ -153,7 +153,6 @@ public static void setUp() { "1234!@#$", // 숫자 + 특수문자, 문자 없음 "Abcdef12()", // 괄호 포함 (허용되지 않은 특수문자) "ABCD1234~", // `~` 특수문자 허용 안됨 - "abc1234^", // `^`는 허용되지만 문자 형식에 따라 위험성 있음 }) void 회원가입시_유저_비밀번호가_조건에_맞지_않으면_실패한다(String password) { String userId = UserFixture.collectUserId;