[Back-end] 랜덤 문자열을 이용하여 임시 비밀번호 생성하기

조성철 (JoSworkS)·2020년 5월 3일
0
post-thumbnail

랜덤 문자열을 생성하는 방법을 알아보고자 한다.

랜덤 문자열을 만드는 이유는 유저가 자신의 계정의 비밀번호가 기억나지 않을 때, 자신의 실제 사용되는 메일 계정으로 새로운 임시 비밀번호를 보내주기 위해서다.

랜덤 문자열 생성

랜덤 문자열을 만드는 방법은 다양하다. 여기서는 간단하면서도 많이 알려져 있는 아래 메소드들을 이용하는 방법을 이용하고자 한다.

  • Math.random()
  • Number.prototype.toString()
  • String.prototype.slice()

1. Math.random()

Math.random()은 0 이상 1 미만의 구간에서 근사적으로 균일한(approximately uniform) 부동소숫점 의사난수를 반환하며, 이 값은 사용자가 원하는 범위로 변형할 수 있다. 난수 생성 알고리즘에 사용되는 초기값은 구현체가 선택하며, 사용자가 선택하거나 초기화할 수 없다.
출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/random

예시

Math.random();  // 0.6222035460132946

위 예시와 같이 0 ~ 1 사이의 난수를 생성하게 된다. 생성된 난수는 'Number' 타입이기 때문에 먼저 문자열로 바꿔주는 작업이 필요하다.

2. Number.prototype.toString()

toString()은 특정한 Number 객체를 나타내는 문자열을 반환한다.

toString() 메소드는 메소드의 첫 번째 아규먼트를 파싱하여, 메소드는 특정 기수(radix)를 기준으로 한 진수 값의 문자열을 환원하기 위한 시도를 합니다. 진수를 나타내는 기수 값(radix) 이 10 이상의 값일 때는, 알파벳의 글자는 9보다 큰 수를 나타냅니다. 예를 들면, 16진수(base 16)는, 알파벳 f 까지 사용하여 표현됩니다.
출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/toString

예시

Math.random().toString(36)  // "0.uk02kso845o"

Number로 부터 상속받는 .toString() 메소드는 'Number' 객체를 문자열로 바꿔서 반환하는 메소드이다. 이를 이용하여 위에서 Math.random()으로 생성한 Number 객체를 문자열로 바꾼다.

참고로, 메소드의 매개변수로 수의 값을 나타내기 위해 사용되기 위한 진수의 기준을 정하는 2와 36사이의 정수를 옵션으로 넣을 수 있다.

여기서 모든 숫자와 모든 알파벳을 사용하기 위해 36진법을 옵션으로 넣는다.

  • 2 = 2진법: 0, 1
  • 36 = 36진법: 숫자 0~9, 알파벳 A~Z

3. String.prototype.slice()

slice() 메소드는 문자열의 일부를 추출하면서 새로운 문자열을 반환한다.
출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/slice

Math.random().toString(36).slice(2);  // "uk02kso845o"

36진수의 문자열로 변환된 난수는 소수이기 때문에 이를 제거하는 작업을 위해 String.prototype.slice() 메소드를 이용하여 앞 2자리인 '0'과 '.'을 제거한다.

랜덤 문자열로 비밀번호 변경

const changedUserData = await users.update(
  { password: randomString },
  {
    where: {
      email: '유저가 입력한 이메일 주소',
    },
  }
);

sequelize를 이용하여 Request로 받은 유저의 이메일 주소를 찾은 후, 생성한 랜덤 문자열로 바꾼다.

샘플 소스코드

// 임의 비밀번호 생성
const randomString = Math.random().toString(36).slice(2);

const changedUserData = await users.update(
  { password: randomString },
  {
    where: {
      email: '유저가 입력한 이메일 주소',
    },
  }
);

참고 자료

0개의 댓글