67 비밀번호 강도 검사기 (Password Strength Checker)
제공된 비밀번호가 얼마나 강력한지 확인해 주는 웹사이트나 앱을 만들어 봅시다. 더 화려하게 만들고 싶다면, 비밀번호가 얼마나 강력한지를 측정할 수 있는 객관적인 지표를 도입해 보세요.
이 프로젝트는 문자열 분석과 복잡도 측정, 그리고 사용자 경험(UX)을 고려한 실시간 피드백 시스템을 익히기에 아주 좋습니다. 특히 최근 웹 보안과 비밀번호 정책을 반영하고, 무차별 대입 공격(Brute Force Attack)에 얼마나 견딜 수 있는지 평가하는 도구를 설계해 보세요.
67.1 주요 개발 포인트
- 비밀번호 복잡도 분석: 비밀번호의 길이, 대소문자 혼합 여부, 숫자와 특수문자 포함 여부를 검사합니다.
- 점수 측정 지표 (Scoring Metrics): 엔트로피(Entropy)나 zxcvbn 라이브러리 등을 활용하여 강력함을 수치화합니다.
- 실시간 피드백 시스템: 사용자가 비밀번호를 입력하는 동안 실시간으로 강도 바(Bar)의 색상을 바꾸거나 팁을 보여줍니다.
- 안전한 비밀번호 추천: 현재 비밀번호가 취약할 경우 더욱 강력한 대체 비밀번호를 추천해 주는 기능을 추가합니다.
- 비밀번호 유출 여부 확인 (Pwned Passwords): Have I Been Pwned API 등을 연동하여 과거에 유출된 적이 있는지 확인해 봅니다.
67.2 Python 구현 예시 (간단한 비밀번호 강도 계산 로직)
import string
def check_password_strength(password):
"""
비밀번호의 길이와 문자 구성을 분석하여 점수를 매깁니다.
"""
score = 0
feedback = []
# 1. 길이 검사
if len(password) >= 12:
score += 3
feedback.append("충분한 길이(12자 이상)입니다.")
elif len(password) >= 8:
score += 1
feedback.append("최소 길이는 넘었지만 더 길면 좋습니다.")
else:
feedback.append("비밀번호가 너무 짧습니다 (8자 이상 권장).")
# 2. 대소문자 혼합 검사
if any(c.isupper() for c in password) and any(c.islower() for c in password):
score += 2
feedback.append("대소문자가 혼합되어 있습니다.")
else:
feedback.append("대소문자를 혼합해 사용하세요.")
# 3. 숫자 포함 검사
if any(c.isdigit() for c in password):
score += 2
feedback.append("숫자가 포함되어 있습니다.")
else:
feedback.append("숫자를 하나 이상 포함하세요.")
# 4. 특수문자 포함 검사
if any(c in string.punctuation for c in password):
score += 3
feedback.append("특수문자가 포함되어 있습니다.")
else:
feedback.append("특수문자를 섞어 쓰면 훨씬 강력해집니다.")
# 최종 결과 판정
if score >= 8:
result = "강력함"
elif score >= 5:
result = "보통"
else:
result = "취약함"
print(f"\n[비밀번호 검사 결과: {result} ({score}/10)]")
for f in feedback:
print(f" - {f}")
return result
if __name__ == "__main__":
# 테스트 비밀번호 2가지 시뮬레이션
check_password_strength("12345")
print("-" * 30)
check_password_strength("MySecret@12345!")