Django 로그인 시도 제한 부재

Django 로그인 시도 제한 부재

설명

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, 디바이스 기준으로 추적하고 임계치 초과 시 지연 또는 잠금을 적용합니다.

참조