설명
Django 로그인 처리에서 실패 횟수 제한, 지연, 잠금 같은 제어 없이 authenticate와 login만 수행하면 비밀번호 대입 공격을 반복할 수 있습니다.
잠재적 영향
- 계정 비밀번호가 무차별 대입으로 추측될 수 있습니다.
- 인증 실패 이벤트를 탐지하거나 차단하기 어렵습니다.
해결 방법
- 계정, IP, 디바이스 기준으로 로그인 실패 횟수를 추적합니다.
django-ratelimit,django-axes같은 검증된 방어 계층을 적용합니다.
예시
로그인 함수 내부의 발췌 예시입니다. check_login_attempts는 애플리케이션이 구현하거나 검증된 방어 계층에 연결해야 하는 함수이며, 호출만 추가해도 시도 제한이 생기는 것은 아닙니다. 인증 실패 결과를 기록하고 다음 요청의 제한 판단에 반영해야 합니다.
변경 전
python
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
변경 후
python
if not check_login_attempts(request):
return None
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
설명:
- 변경 전: Django 로그인 처리에서 인증 실패 횟수 제한, 지연, 잠금, CAPTCHA 같은 제어 없이
authenticate와login만 수행하면 공격자가 비밀번호 대입 공격을 반복할 수 있습니다. - 변경 후: 로그인 실패 횟수를 계정, IP, 디바이스 기준으로 추적하고 임계치 초과 시 지연 또는 잠금을 적용합니다.