
파이썬 랜덤 비밀번호 생성기는 입문자가 string, random, join을 한 번에 익히기 좋은 작은 프로젝트입니다. 다만 먼저 분명히 할 점이 있습니다. random으로 만드는 버전은 학습용으로는 좋지만, 실제 계정 비밀번호나 보안 토큰 생성에는 쓰면 안 됩니다.
파이썬 공식 문서도 random 모듈은 보안 목적에 적합하지 않다고 설명합니다. 실제 보안용은 secrets 모듈을 우선 써야 합니다. 이 글에서는 먼저 재미 프로젝트 버전으로 구조를 익히고, 마지막에 더 안전한 secrets 버전까지 정리하겠습니다.
먼저 결과부터 보기
가장 단순한 버전은 아래처럼 만들 수 있습니다.
import random
import string
length = 12
chars = string.ascii_letters + string.digits
password = ''.join(random.choice(chars) for _ in range(length))
print(password)이 코드는 잘 동작합니다. 하지만 이 상태에서는 왜 join을 쓰는지, 왜 string.ascii_letters를 더하는지, 왜 random은 학습용으로만 봐야 하는지까지는 잘 보이지 않습니다. 그래서 아래에서 단계별로 뜯어보겠습니다.
파이썬 랜덤 비밀번호 생성기의 재료
비밀번호 생성기는 생각보다 단순합니다. 사용할 문자 묶음을 준비하고, 그중에서 랜덤하게 문자를 뽑고, 원하는 길이만큼 반복한 뒤, 마지막에 하나의 문자열로 합치면 됩니다.
- <code>string.ascii_letters</code> : 영문 대소문자
- <code>string.digits</code> : 숫자
- <code>string.punctuation</code> : 특수문자
입문 단계에서는 특수문자까지 한꺼번에 넣기보다, 먼저 영문자와 숫자만으로 시작하는 편이 이해하기 쉽습니다.
random.choice 버전 만들기
먼저 한 글자씩 뽑는 방식부터 보겠습니다.
import random
import string
length = 10
chars = string.ascii_letters + string.digits
result = []
for _ in range(length):
result.append(random.choice(chars))
password = ''.join(result)
print(password)핵심은 세 줄입니다. chars는 뽑기 후보 모음이고, random.choice(chars)는 후보 중 한 글자를 뽑으며, ''.join(result)는 리스트를 문자열 하나로 합칩니다.
초보자가 자주 막히는 부분은 join입니다. 리스트를 바로 출력하면 ['a', 'B', '7']처럼 보이지만, 비밀번호는 aB7 같은 문자열이어야 하므로 마지막에 합쳐야 합니다.
random.choices를 쓰면 더 짧아진다
random.choices()를 쓰면 여러 글자를 한 번에 뽑을 수 있습니다.
import random
import string
length = 10
chars = string.ascii_letters + string.digits
password = ''.join(random.choices(chars, k=length))
print(password)여기서 k=length는 몇 개를 뽑을지 정하는 값입니다. 정리하면 random.choice(seq)는 한 개 뽑기, random.choices(seq, k=n)는 여러 개 뽑기입니다. 반복 구조를 익히고 싶으면 choice, 짧고 간단한 코드를 원하면 choices가 더 편합니다.
길이를 입력받는 버전으로 바꾸기
import random
import string
length = int(input('비밀번호 길이를 입력하세요: '))
chars = string.ascii_letters + string.digits
password = ''.join(random.choices(chars, k=length))
print('생성된 비밀번호:', password)이 단계에서 프로젝트다운 느낌이 조금 더 살아납니다. 다만 바로 실전에 쓰기에는 아쉬운 점도 있습니다. 예를 들어 길이를 1이나 2로 넣어도 그대로 생성되고, 숫자만 나오거나 대문자가 하나도 없을 수도 있습니다.
조금 더 그럴듯하게 개선하기
이번에는 최소 조건을 넣어보겠습니다. 소문자 1개 이상, 대문자 1개 이상, 숫자 1개 이상, 그리고 길이는 8 이상으로 잡아보겠습니다.
import random
import string
length = int(input('비밀번호 길이를 입력하세요(8 이상): '))
if length < 8:
print('길이는 8 이상이어야 합니다.')
else:
chars = string.ascii_letters + string.digits
while True:
password = ''.join(random.choices(chars, k=length))
if (
any(c.islower() for c in password)
and any(c.isupper() for c in password)
and any(c.isdigit() for c in password)
):
break
print('생성된 비밀번호:', password)이 버전에서 배울 수 있는 포인트가 많습니다. 입력값 검사, 무한 루프와 break, any()를 이용한 조건 확인, 랜덤 결과를 검증한 뒤 통과할 때만 종료하는 구조까지 함께 연습할 수 있습니다.
특수문자는 왜 바로 안 넣었을까
물론 특수문자도 넣을 수 있습니다. 예를 들어 chars = string.ascii_letters + string.digits + '!@#$%^&*'처럼 직접 선택한 문자만 더할 수 있습니다.
다만 입문 글에서는 string.punctuation 전체를 처음부터 넣지 않는 편이 설명이 더 깔끔할 때가 많습니다. 일부 문자는 터미널에서 읽기 불편하거나, 복사해서 붙여넣을 때 헷갈리기 쉽기 때문입니다. 그래서 처음에는 범위를 좁게 시작하고, 나중에 원하는 문자 집합으로 확장하는 편이 실용적입니다.
가장 중요한 구분: 장난감 버전과 실제 보안용
여기서 가장 중요한 이야기를 해야 합니다. random 기반 비밀번호 생성기는 학습용 프로젝트로는 좋습니다. 하지만 실제 계정 비밀번호, 초기 비밀번호, 재설정 토큰, 인증 링크 같은 보안 용도에는 적합하지 않습니다.
파이썬 공식 문서는 random 모듈이 의사난수 생성기이며 암호학 목적에는 적합하지 않다고 분명히 설명합니다. 실제 보안 관련 용도는 secrets 모듈을 쓰라고 안내합니다.
즉, 이 글의 random 버전은 개념 학습용이고, 실제 보안용 생성기는 secrets로 옮겨가야 합니다.
실제로는 secrets 버전을 먼저 떠올리자
import secrets
import string
length = 12
chars = string.ascii_letters + string.digits
password = ''.join(secrets.choice(chars) for _ in range(length))
print(password)구조는 거의 비슷합니다. 차이는 랜덤 한 글자를 뽑을 때 random.choice() 대신 secrets.choice()를 쓴다는 점입니다. 프로그램 구조는 같아도 목적에 따라 어떤 모듈을 골라야 하는지가 달라진다는 것을 배울 수 있습니다.
최소 조건까지 넣은 secrets 버전
import secrets
import string
length = 12
chars = string.ascii_letters + string.digits
while True:
password = ''.join(secrets.choice(chars) for _ in range(length))
if (
any(c.islower() for c in password)
and any(c.isupper() for c in password)
and any(c.isdigit() for c in password)
):
break
print(password)이 버전은 파이썬 secrets 문서의 레시피 방향과도 잘 맞습니다. 물론 실제 서비스에서는 생성한 비밀번호를 평문으로 저장하면 안 되고, 해시와 솔트 같은 저장 정책도 함께 설계해야 합니다. 하지만 그건 생성기 자체보다 더 큰 보안 주제이므로, 이 글에서는 여기까지만 다루겠습니다.
자주 하는 실수
- <code>random</code>을 실서비스 비밀번호 생성에 바로 쓰는 실수
- 문자를 뽑아 놓고 <code>join</code>으로 합치지 않는 실수
- 길이 검사 같은 기본 입력 검증을 빼먹는 실수
- 규칙이 필요한데 완전 랜덤만 믿는 실수
이 프로젝트로 같이 익히는 파이썬 기초
- 문자열 합치기 <code>''.join(…)</code>
- 모듈 가져오기 <code>import</code>
- 상수 활용 <code>string.ascii_letters</code>, <code>string.digits</code>
- 반복문과 조건문
- <code>any()</code>를 이용한 검사
- <code>while True</code> 와 <code>break</code>
작은 장난감 프로젝트가 좋은 이유는 문법을 따로따로 외우지 않아도, 하나의 결과물을 만들면서 자연스럽게 연결되기 때문입니다. 관련해서 파이썬 비교 문법 감각을 함께 정리하고 싶다면 파이썬 is와 == 차이 글도 같이 보면 도움이 됩니다.
마무리
파이썬 랜덤 비밀번호 생성기는 입문자가 만들기 좋은 작은 프로젝트입니다. 짧은 코드 안에 문자열, 랜덤 선택, 반복문, 조건 검사, 입력 처리까지 고르게 들어 있기 때문입니다.
다만 더 중요한 배움은 따로 있습니다. 코드가 된다는 것과, 실제 용도에 안전하다는 것은 다르다는 점입니다. 그래서 이 주제는 구조를 배우는 첫 버전은 random, 실제 보안용으로 생각할 때는 secrets, 규칙이 필요하면 생성 후 검사 단계를 추가한다고 기억하면 좋습니다.
공식 문서를 함께 보고 싶다면 random 문서, secrets 문서, string 문서를 참고하면 됩니다.