깔끔한 3-state machine 이야. fresh, warned, locked. PIN 시도 하나가 그 source IP 의 state 를 한 칸씩 밀어.
| State | Counter 범위 | 다음 시도에 일어나는 일 |
|---|---|---|
| Fresh | fail_count = 0 | PIN 검증. 실패하면 1 로 증가 |
| Warned | 1 ≤ fail_count < max_retry | PIN 검증. 실패하면 증가, 성공하면 0 으로 리셋 |
| Locked | fail_count ≥ max_retry | bcrypt 전에 거부. IP 를 blacklist 에 넣고, admin 이 풀어줘야 함 |
"성공 시 reset" trade
로그인에 성공하면 counter 를 되돌리는 건 친절이야. 오타 몇 번 내고 맞혀도 잠기지 않으니까. 동시에 *안전*하기도 해. 공격자는 PIN 을 모르니 성공으로 counter 를 되돌릴 수가 없거든. 되돌리려면 맞혀야 하는데, 맞힌 순간 이미 들어온 거라 brute force 를 더 할 이유가 없어.