복잡도가 어느 정도 확보된 비밀번호 사용은 일반적인 보안 요구 사항입니다. 이 글에서는 Python의 정규 표현식 모듈인 re를 활용해, 주어진 비밀번호가 특정 수준의 복잡도 조건을 만족하는지 검증하는 방법을 예제와 함께 살펴봅니다.
정규 표현식 구성 이해하기
예제에서 사용할 정규 표현식은 다음과 같은 조건을 한 번에 검사합니다.
- (?=.*[a-z]) : 최소 하나의 소문자 포함
- (?=.*[A-Z]) : 최소 하나의 대문자 포함
- (?=.*\d) : 최소 하나의 숫자 포함
- (?=.*[@$!%*#?&]) : 최소 하나의 특수문자 포함
- {8,18} : 비밀번호 전체 길이는 8자 이상 18자 이하
여기서 ?= 는 '긍정형 전방 탐색(lookahead)'으로, 문자열 전체를 재배치하지 않으면서 각 조건의 존재 여부만 확인하는 역할을 합니다.
예제 1 – 유효한 비밀번호 검사
먼저 유효한 비밀번호로 인정받기 위해 필요한 조건들을 만족하는 정규 표현식을 작성합니다. 그다음 re 모듈의 search 함수를 사용해 주어진 비밀번호를 해당 조건과 비교합니다. 아래 예제의 복잡도 요건은 '최소 한 개의 대문자, 한 개의 숫자, 한 개의 특수문자를 포함하고, 길이는 8자 이상 18자 이하'입니다.
import re
pswd = 'XdsE83&!'
reg = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!#%*?&]{8,18}$"
# 정규식 컴파일
match_re = re.compile(reg)
# 정규식 검색
res = re.search(match_re, pswd)
# 조건 검증
if res:
print("Valid Password")
else:
print("Invalid Password")출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Valid Password
비밀번호 XdsE83&!는 대문자, 소문자, 숫자, 특수문자를 모두 포함하고 있으며 길이 조건도 충족하므로 유효한 것으로 판정됩니다.
예제 2 – 조건을 충족하지 않는 비밀번호
이번에는 필수 조건 중 일부를 충족하지 않는 비밀번호를 사용해 봅니다. 예를 들어 숫자가 포함되어 있지 않은 경우, 프로그램은 해당 비밀번호를 유효하지 않은 것으로 판단합니다.
import re
pswd = 'XdsEfg&!'
reg = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?& ])[A-Za-z\d@$!#%*?&]{8,18}$"
# 정규식 컴파일
match_re = re.compile(reg)
# 정규식 검색
res = re.search(match_re, pswd)
# 조건 검증
if res:
print("Valid Password")
else:
print("Invalid Password")출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Invalid Password
비밀번호 XdsEfg&!에는 숫자가 없기 때문에 (?=.*\d) 조건을 만족하지 못하고, 따라서 유효하지 않은 비밀번호로 처리됩니다.
마무리
이처럼 re 모듈과 전방 탐색 기반의 정규 표현식을 조합하면 몇 줄의 코드만으로도 비밀번호 복잡도 검증 로직을 손쉽게 구현할 수 있습니다. 실제 서비스에서는 허용 가능한 특수문자 범위나 길이 정책을 프로젝트의 보안 요구 사항에 맞게 조정하여 사용하는 것이 좋습니다.