C.W.K.
Stream
Lesson 02 of 05 · published

Lockout 사이클 — Counter, Threshold, Blacklist

~15 min · lockout, state-machine, rate-limit

Level 0Greenhorn
0 XP0/53 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

깨끗한 3-state machine: fresh, warned, locked. 각 PIN 시도가 그 source IP 에 대한 state 진행시켜.

StateCounter 범위다음 시도에 일어나는 일
Freshfail_count = 0PIN 검증; 실패 → 1로 증가
Warned1 ≤ fail_count < max_retryPIN 검증; 실패 → 증가; 성공 → 0 리셋
Lockedfail_count ≥ max_retrybcrypt 전 거부; IP blacklist 추가; admin release 해야

"성공 시 reset" trade

성공 로그인 시 counter reset 은 친절 — 정당한 오타 몇 번 후 맞춰도 lockout X. *안전*하기도 — 공격자가 PIN 모르니까 추측 성공으로 counter reset 못 함. 그러려면 추측 성공해야 하는데, 그 시점엔 이미 auth 성공해서 brute force 더 안 필요.

Code

POST /login 안의 주석 달린 lockout 사이클·python
# POST /login 안 (풀버전은 Track 5)

# 이미 locked? 검증조차 X — bcrypt 비용 절약.
if attempt_count(ip) >= MAX_RETRY:
    blacklist(ip, "exceeded_retry")
    return Response("Locked out", status_code=429)

# 검증
if not verify_pin(input_pin, stored_hash):
    increment_attempt(ip)               # counter bump
    await asyncio.sleep(0.5)            # constant time
    return Response("Invalid PIN", status_code=401)

# 성공
clear_attempts(ip)                      # counter reset
issue_session(ip)

External links

Exercise

/login 엔드포인트 stress 테스트: 틀린 PIN 10번 POST 하는 작은 스크립트. 시도 5 후 IP 가 reason='exceeded_retry' 로 security_blacklist 에 나타나야 함. 시도 6 후 HTTP 429. DB 가 state machine 반영 확인.

Progress

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

댓글 0

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

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