1차 Project
WeeteWeete
를 진행하면서 비밀번호를 잃어버린 사용자를 위해 비밀번호를 재생성해 발급하는 기능을 구현하고자 했다. 처음에는 여느 웹사이트와 같이 사용자의 아이디와 함께 휴대폰 인증이나 이메일 인증을 통해 비밀번호를 찾거나 재생성하려 했다. 하지만 어려운 기능에 시간을 많이 투자해 프로젝트 진행을 방해하지 않도록 인증 API를 사용하지 않고 난수를 이용해 임시 비밀번호를 재발급하기로 하였다.
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
> '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
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해준다.
임시 비밀번호를 사용자에게 발급하기 위해 사용자의 이메일과 이름을 요청받고, Member
Class에서 존재가 확인되면 영 대/소문자와 숫자 중 랜덤한 10개의 요소를 반환하기로 했다.
string_pool = string.ascii_letters + string.digits
temp_password = ''.join(secrets.choice(string_pool) for i in range(10))
난수가 제대로 작동하는지 확인해본 결과는 다음과 같다.
이번에 구현한 기능에서는 단순하게 영 대/소문자와 숫자 중 랜덤하게 10개를 뽑아냈다. 따라서 10개의 요소가 모두 숫자일수도 있는 가능성이 있어서 보안에 취약할 수 있는 단점이 존재한다. 보통 웹사이트는 특수기호까지 포함하여 그 중 2~3가지를 반드시 포함하여 8~10자리 이상의 비밀번호를 요구한다.
이번 프로젝트의 필수적인 기능들을 구현하고 시간이 남는다면 특수기호를 포함하는 복잡한 랜덤 비밀번호 재생성 기능을 구현하고 싶다.
DecimalField
로 설정해 소수점까지 표현할 수 있어야 한다.Is_New
와 같은 신상품 여부도 보통 Normalization 한다.stock
, 주문량은quantity
와 같이 직관적인 변수이름을 설정해준다.참고자료
[Python] 난수로 임시비밀번호 생성하기
Python Docs - String Module
Python Docs - Secrest Module