반응형
금일 회사에서 임시 비밀번호가 필요한 로직을 만들었다.
추후에 도우이 될 것 같아서 간단하게 len 길이만큼 무작위로 대문자, 소문자, 숫자, 특수문자가 들어간 임시 비밀번호를 생성하는 로직을 기록한다.
const sets = { upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', lower: 'abcdefghijklmnopqrstuvwxyz', number: '0123456789', symbol: '!@#$%^&*()', }
랜덤 생성을 위해선 정규식을 사용하지 않고, 문자열 집합이 필요함.
const allChars = sets.upper + sets.lower + sets.number + sets.symbol; const getRandomChar = (chars) => chars[Math.floor(Math.random() * chars.length)]; // 최소 하나씩 포함 let pw = [ getRandomChar(sets.upper), getRandomChar(sets.lower), getRandomChar(sets.number), getRandomChar(sets.symbol) ];
임시 비밀번호에 대문자, 소문자, 숫자, 특수문자가 하나씩은 무조건 포함할 수 있도록 했음.
for (let i=pw.length; i<len; i++) { pw.push(getRandomChar(allChars)); }
남은 길이만큼 대문자, 소문자, 숫자, 특수문자 중에 하나씩 골라서 len 길이만큼 넣음.
for (let i=pw.length-1; i>0; i--) { const j = Math.floor(Math.random() * (i+1)); [pw[i], pw[j]] = [pw[j], pw[i]]; /* let tmp = pw[i]; pw[i] = pw[j]; pw[j] = tmp; [pw[i], pw[j]] = [pw[j], pw[i]] 와 동일함 */ }
Fisher-Yates 셔플 알고리즘으로 무작위로 순서를 변경해줌.
[최종코드]
function createTmpPw(len) { const sets = { upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', lower: 'abcdefghijklmnopqrstuvwxyz', number: '0123456789', symbol: '!@#$%^&*()', } const allChars = sets.upper + sets.lower + sets.number + sets.symbol; const getRandomChar = (chars) => chars[Math.floor(Math.random() * chars.length)]; // 최소 하나씩 포함 let pw = [ getRandomChar(sets.upper), getRandomChar(sets.lower), getRandomChar(sets.number), getRandomChar(sets.symbol) ]; // 나머지 문자 랜덤으로 채움 for (let i=pw.length; i<len; i++) { pw.push(getRandomChar(allChars)); } // Fisher-Yates Shuffle for (let i=pw.length-1; i>0; i--) { const j = Math.floor(Math.random() * (i+1)); [pw[i], pw[j]] = [pw[j], pw[i]]; } return pw.join(''); }
반응형
'웹 디자인 > JavaScript' 카테고리의 다른 글
tui-grid header checkbox render 만들기 (0) | 2025.01.13 |
---|---|
자바스크립트 배열 내 모든 숫자의 합 구하기 (for, forEach, reduce) (0) | 2023.08.16 |
Notepad++ 로 자바스크립트 실행해보기 (0) | 2023.06.13 |
자바스크립트 변수 선언 키워드 var let const 차이 (0) | 2023.02.11 |
자바스크립트 정규표현식(Regular Expression) 기초 패턴 정리 (1) | 2022.08.27 |