TIL 36 | Create Random Password

임종성·2021년 8월 3일
0

Project

목록 보기
4/7
post-thumbnail

1차 Project WeeteWeete를 진행하면서 비밀번호를 잃어버린 사용자를 위해 비밀번호를 재생성해 발급하는 기능을 구현하고자 했다. 처음에는 여느 웹사이트와 같이 사용자의 아이디와 함께 휴대폰 인증이나 이메일 인증을 통해 비밀번호를 찾거나 재생성하려 했다. 하지만 어려운 기능에 시간을 많이 투자해 프로젝트 진행을 방해하지 않도록 인증 API를 사용하지 않고 난수를 이용해 임시 비밀번호를 재발급하기로 하였다.

String Module

Python에는 자체적으로 Built-in Module이 존재하는데, string도 그 중 하나이다. 일반적인 문자열 연산에 이용되는 모듈로, 이 모듈에 정의된 상수는 다음과 같다.


import string

string.digits 			 
> '0123456789'
string.ascii_lowercase 		 
> 'abcdefghijklmnopqrstuvwxyz'
string.ascii_uppercase 		 
> 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.ascii_letters		 # lowercase와 uppercase의 합 
> 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
stirng.punctuation
> '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

Secret Module

secrets 또한 Python이 제공하는 모듈로, 비밀 관리를 위한 안전한 난수를 생성하는 기능을 가지고 있다. 그 중 우리가 사용할 것은 choice method다.

secrets.choice(sequence)는 Non-Empty Sequence에서 무작위로 선택된 요소를 반환한다.


import secrets

string = 'abcdefghi'
print(secrets.choice(string))  # output : 'b'
print(secrets.choice(string))  # output : 'h'
print(secrets.choice(string))  # output : 'g'

위와 같이 문자열이 주어지면 그 중 랜덤한 요소를 선택해 return해준다.

Simple Password with English & Digits

임시 비밀번호를 사용자에게 발급하기 위해 사용자의 이메일과 이름을 요청받고, Member Class에서 존재가 확인되면 영 대/소문자와 숫자 중 랜덤한 10개의 요소를 반환하기로 했다.

string_pool = string.ascii_letters + string.digits
temp_password = ''.join(secrets.choice(string_pool) for i in range(10))

난수가 제대로 작동하는지 확인해본 결과는 다음과 같다.

Additional Thoughts

이번에 구현한 기능에서는 단순하게 영 대/소문자와 숫자 중 랜덤하게 10개를 뽑아냈다. 따라서 10개의 요소가 모두 숫자일수도 있는 가능성이 있어서 보안에 취약할 수 있는 단점이 존재한다. 보통 웹사이트는 특수기호까지 포함하여 그 중 2~3가지를 반드시 포함하여 8~10자리 이상의 비밀번호를 요구한다.

이번 프로젝트의 필수적인 기능들을 구현하고 시간이 남는다면 특수기호를 포함하는 복잡한 랜덤 비밀번호 재생성 기능을 구현하고 싶다.


8/3 Project Review

  • Order 관련 Model을 작성할때 Order, Order_Item, Order_Status로 Table을 나누어 각각 전체 주문과 상세 주문, 그리고 주문의 상태(결제 전, 배송중, 반품 등)를 나타내야 한다.
  • Price, Discount와 같은 가격은 보통 DecimalField로 설정해 소수점까지 표현할 수 있어야 한다.
  • Is_New와 같은 신상품 여부도 보통 Normalization 한다.
  • 재고 수량은 stock, 주문량은quantity와 같이 직관적인 변수이름을 설정해준다.

참고자료
[Python] 난수로 임시비밀번호 생성하기
Python Docs - String Module
Python Docs - Secrest Module

profile
어디를 가든 마음을 다해 가자

0개의 댓글