
윈도우 규칙은 언제나 기준값과 씨름합니다. 너무 낮으면 정상 사용자가 걸리고, 너무 높으면 느린 공격자가 빠집니다. 그런데 기준값이 1인데도 오탐이 거의 없는 신호가 있습니다. 정상 사용자라면 절대 닿을 일이 없는 객체에 누군가 닿았을 때입니다. 이것이 미끼 객체입니다.
미끼 객체(honeytoken, canary)는 진짜처럼 존재하지만 어떤 정상 경로로도 노출되지 않는 데이터입니다.
원리는 단순합니다. 정상 사용자는 자기 주문 번호를 화면에서 눌러서 엽니다. 화면에 없는 번호에 닿는 방법은 번호를 스스로 만들어 넣는 것뿐입니다. 그게 열거입니다.

실험실 앱(lab/data.py)은 주문 1,365건 중 27건(2%)을 미끼로 만들었습니다. 주인은 로그인할 수 없는 계정 u999이고, 번호는 실제 주문과 섞어 무작위로 배치했습니다. 번호만 봐서는 구별되지 않습니다.
if oid in DECOYS:
# 어느 화면에도 나오지 않는 번호. 접근 자체가 신호다.
sec_event(request, "honeytoken_access", object=oid)
미끼 주문도 응답은 다른 남의 주문과 똑같이 404입니다. 공격자는 미끼를 밟았는지 모릅니다.
3부 실험에서 이름표가 붙은 2시간 분량(모의 시각) 트래픽을 흘렸습니다. 미끼 규칙의 결과입니다. 기준은 "한 번이라도 닿으면 경보"입니다.
| 공격 | 미끼에 처음 닿은 요청 | 걸린 시간(모의 시각) |
|---|---|---|
| 빠른 열거(0.2초 간격) | 13번째 | 2.4초 |
| 느린 열거(90초 간격) | 28번째 | 2,430초(약 40분) |
| IP를 바꾸는 열거 | 45번째 | 44초 |
| 계정을 바꾸는 열거 | 7번째 | 12초 |
| 정상 사용자 150명 | 경보 0건 |
눈여겨볼 곳이 두 군데입니다.
느린 열거를 잡았습니다. 60초 윈도우 규칙은 90초 간격 공격을 어떤 기준값에서도 잡지 못했습니다(14편). 미끼는 시간이 아니라 닿은 번호로 판단하니 속도와 상관이 없습니다. 대신 걸린 시간이 40분입니다. 미끼 비율이 2%면 평균 50개쯤 넘겨야 하나를 밟습니다. 운이 나쁘면 더 걸립니다.
IP와 계정을 바꿔도 잡았습니다. 미끼는 세는 규칙이 아니라서 공격자가 기준을 쪼개도 소용이 없습니다. 계정을 바꾸는 열거에서는 그 순간의 계정 하나만 드러나지만, IP와 함께 보면 묶을 수 있습니다.
미끼의 오탐은 거의 언제나 우리 쪽 코드에서 옵니다.
숨은 링크(사람 눈에는 안 보이는 링크를 페이지에 넣어 크롤러를 잡는 방법)도 같은 원리입니다. 다만 검색 엔진 크롤러, 화면 낭독기, 접근성 도구가 닿을 수 있어 오탐 관리가 더 까다롭습니다.
모든 링크는 2026-10-30에 확인했습니다.
lab/results/run-shadow-redis/detectors_default.json의 honeytoken 행(2026-10-30 실행, 13·14편)lab/data.py(시드 고정, 미끼 비율 2%)이전 글 방어선 1-②: 신원별 슬라이딩 윈도우로 열거·퍼징 잡기
다음 글 방어선 1-④: 단계적 대응과 섀도 모드
시리즈 전체 목록 해킹 시도를 몇 초 안에 잡는 서버 전체 목록