Hard lockout-after-N 이 제일 단순한 방어야. threat model 이 더 정교한 걸 요구할 때 알아둘 만한 기법이 셋 더 있어.
1. Exponential backoff — 늦추기, lockout 아님
"다섯 번 헛스윙이면 아웃" 대신, 실패가 이어질수록 시간 비용이 커지게 해. 사용자는 거의 못 느끼고, 공격자는 벽에 부딪혀.
2. Jitter — timing side channel 격퇴
0.5초 고정 지연 (Track 5) 이 *응답 시간* 으로 정보가 새는 걸 막아. 여기에 무작위 jitter 를 얹으면 (딱 0.5s 대신 0.4–0.6s) 시간을 통계로 공략하는 것까지 더 흐려져.
3. Honeypot 엔드포인트 — 정찰 발견
/wp-admin 이나 /.env 같은 가짜 엔드포인트를 추가해. 언제나 404 를 돌려주지만 "scanner detected" 이벤트를 로그하고, 원하면 source IP 를 blacklist 에 넣어.
하지 말 것
- "PIN 틀림" 과 "사용자 없음" 에 다른 에러를 주지 마. user enumeration 이 새거든. 언제나 같은 응답을 줘.
- 다중 사용자 시스템에서 username 만 잠그지 마. 공격자가 한 사용자한테 틀린 PIN 을 퍼부어 DOS 를 만들 수 있어. per-IP lockout 이 답이야.
- 남은 시도 횟수를 알려주지 마. ("3번 남았습니다") 공격자한테 공짜로 주는 정보야. "Invalid PIN" 만 보여줘.