웹 서비스를 개발하다 보면 사용자가 입력한 비밀번호가 보안 기준을 충족하는지 확인해야 하는 경우가 많습니다. 이번 글에서는 비밀번호 문자열을 유일한 인수로 받아 유효성을 판별하는 JavaScript 함수를 작성해 보겠습니다.
함수는 아래 조건을 모두 만족할 때만 true를 반환해야 합니다.
길이가 6자 이상 20자 이하일 것
숫자를 최소 1개 포함할 것
영문 소문자를 최소 1개 포함할 것
영문 대문자를 최소 1개 포함할 것
특수문자를 최소 1개 포함할 것 (허용되는 특수문자: !@#$%^&*()-+)
예제 코드
const valid = '12Aatab@';
const invalid = '1234ASD+';
const validatePassword = (str = '') => {
const { length: l } = str;
const strArr = str.split('');
// 길이 조건 확인
if(l < 6 || l > 20){
return false;
};
const specialCharacters = '!@#$%^&*()-+';
const alphabets = 'abcdefghijklmnopqrstuvwxyz';
const numbers = '0123456789';
const checkWith = (char, set) => set.includes(char);
const containsSpecialCharacter = strArr.some(char => checkWith(char, specialCharacters));
const containsLowercase = strArr.some(char => checkWith(char, alphabets));
const containsUppercase = strArr.some(char => checkWith(char, alphabets.toUpperCase()));
const containsNumber = strArr.some(char => checkWith(char, numbers));
return containsSpecialCharacter && containsLowercase && containsUppercase && containsNumber;
};
console.log(validatePassword(valid));
console.log(validatePassword(invalid));
출력 결과
콘솔에는 다음과 같이 출력됩니다.
true
false
코드 동작 원리
이 함수의 핵심 로직은 다음과 같습니다.
str.split('')으로 문자열을 개별 문자 배열로 변환합니다.먼저 길이 조건을 검사하고, 범위를 벗어나면 즉시
false를 반환합니다.배열 메서드
some()을 사용해 각 문자가 숫자·소문자·대문자·특수문자 집합에 포함되는지 확인합니다.some()은 조건을 만족하는 요소가 하나라도 있으면true를 반환하므로 반복문 없이 간결하게 처리할 수 있습니다.네 가지 포함 여부를 논리곱(&&)으로 연결해, 모든 조건이 충족될 때만 최종적으로
true를 반환합니다.
정규표현식을 활용한 대안
같은 로직은 정규표현식 하나로도 구현할 수 있습니다. 코드가 더 짧아지지만, 가독성과 유지보수 측면에서 팀의 코딩 스타일에 맞게 선택하면 됩니다.
const validatePasswordRegex = (str = '') => {
return /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()\-+]).{6,20}$/.test(str);
};
console.log(validatePasswordRegex(valid)); // true
console.log(validatePasswordRegex(invalid)); // false여기서 (?=.*...) 형태의 전방 탐색(lookahead)은 숫자, 소문자, 대문자, 특수문자가 각각 최소 한 번씩 등장하는지를 검사하고, 마지막의 {6,20}이 전체 길이 제한을 담당합니다.