본문 바로가기
C.W.K.
Stream
Lesson 07 of 10 · published

비밀번호 검증 패턴

~8 min · practical, password, stacked-lookahead

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

여러 검증 규칙을 같은 위치에 겹치기

비밀번호가 여덟 글자 이상이고 소문자, 대문자, 숫자를 하나씩 포함해야 한다고 해 보자. 전방 탐색을 쓰면 가능한 문자 순서를 모두 나열하지 않고 각 조건을 독립적으로 적을 수 있어.

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
  • ^에서 모든 검사를 시작해.
  • 세 전방 탐색이 소문자, 대문자, 숫자의 존재를 각각 확인해.
  • .{8,}가 실제 문자를 여덟 개 이상 소비해.
  • $는 끝을 검사하지만 엔진에 따라 마지막 줄바꿈 직전에도 성공할 수 있어. 엄격한 검증에는 전체 일치 API를 써.

조건을 더하거나 빼기 쉬워

특수 문자가 필요하면 (?=.*[!@#$%^&*])를 더하고, 공백을 금지하려면 (?!.*\s)를 더해. 각 검사가 독립적이라 규칙의 뜻을 따로 읽을 수 있어.

검증 코드는 전체 일치로 마무리해

전방 탐색은 조건을 확인할 뿐 입력 전체를 소비하지 않아. 마지막 본 패턴이 전체 입력을 덮는지 확인하고, Python에서는 fullmatch처럼 전체 일치를 보장하는 API를 사용해.

Code

비밀번호 검증기·python
import re

# 8+ 글자, 소/대/숫자
weak = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$')
bool(weak.match('Aa1aaaaa'))   # True
bool(weak.match('aaaaaaaaa'))  # False (대문자/숫자 없음)
bool(weak.match('Aa1'))        # False (너무 짧음)

# 강력: 12+ 글자, 소/대/숫자/특수, 공백 없음
strong = re.compile(
    r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])(?!.*\s).{12,}$'
)
bool(strong.match('Pippa@1234abc'))   # True
bool(strong.match('Pippa@1234'))      # False (10 글자만)
bool(strong.match('Pippa @1234abc'))  # False (공백)

# 가독 위해 VERBOSE 로 조립
password = re.compile(r'''
    ^                       # 시작
    (?=.*[a-z])             # 소문자 하나 이상
    (?=.*[A-Z])             # 대문자 하나 이상
    (?=.*\d)                # 숫자 하나 이상
    (?=.*[!@#$%^&*])        # 특수 하나 이상
    (?!.*\s)                # 공백 없음
    .{12,}                  # 총 12+ 글자
    $                       # 끝
''', re.VERBOSE)

External links

Exercise

4~20자이며 영문자로 시작하고 숫자를 하나 이상 포함하되 하이픈은 허용하지 않는 사용자 이름 검증기를 전방 탐색으로 작성해. pippa1, p1ppa, pippa, 1pippa, pippa-1의 성공과 실패 이유를 각각 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.