
어느 날 주문 조회 API 로그를 보니, 한 계정이 주문 번호를 1씩 올려 가며 300번 조회했습니다. 응답은 전부 404였습니다. 막기는 했습니다. 그런데 누가, 언제부터, 무엇을 찔러 봤는지는 아무도 몰랐습니다. 이 시리즈는 이런 시도를 몇 초 안에 알아채고, 필요하면 자동으로 늦추거나 막는 방법을 다룹니다. 그리고 그 방법이 정말 효과가 있는지 직접 재 봅니다.
검색해 보면 이런 설명이 자주 나옵니다. 이 시리즈의 출발점이 된 원문도 비슷합니다.
모든 요청을 eBPF와 OpenTelemetry로 모아 Kafka에 넣고, Flink로 실시간 분석한다. 앱 안의 RASP가 JWT의 사용자 ID와 경로의 ID를 비교해 IDOR을 잡고, 요청 패턴의 Jaccard 유사도가 90%를 넘으면 퍼징으로 본다. 걸리면 IP를 블랙리스트에 넣는다.
큰 그림은 맞습니다. 도구 하나로 끝나지 않고 수집 → 분석 → 차단 층으로 나눠야 합니다. 네트워크 앞단(WAF)만으로는 IDOR을 알 수 없고, 앱 안의 정보가 필요합니다. 같은 주체의 반복은 슬라이딩 윈도우(최근 N초 동안의 횟수를 계속 세는 방식)로 셉니다.
그런데 세부를 그대로 옮기면 곤란한 곳이 많습니다.
| 원문의 주장 | 문제 | 이 시리즈의 입장 |
|---|---|---|
| IDOR은 탐지로 막는다 | 탐지는 사후입니다. IDOR의 해결은 모든 객체 접근의 인가 검사입니다 | 막기가 먼저, 탐지는 막은 결과를 센다 |
JWT.sub != Path.ID면 IDOR | 주문·문서 ID는 사용자 ID가 아닙니다 | 신호는 인가 결정 결과(허용/거부). 소유권은 DB만 안다 |
| 같은 IP로 세서 차단 | 공격자는 IP를 바꾸고, 정상 사용자는 IP를 나눠 씁니다(CGNAT) | 신원(계정·세션·API 키) 먼저, IP는 보조 |
| Jaccard 90%↑면 퍼징 | 정상 페이지 넘기기도 같은 모양입니다. 90%의 근거가 없습니다 | 검증 실패(400·422), 서로 다른 거부 객체 수가 더 강한 신호 |
| eBPF는 오버헤드 0으로 L7까지 본다 | 0이 아니고, TLS는 소켓에서 암호문입니다 | eBPF의 제자리는 런타임 보안 |
| Kafka + Flink가 표준 | 작은 팀에는 운영 부담이 탐지 이득보다 큽니다 | 지연 예산으로 고른다 |
| 차단 = 블랙리스트 등록 | 영구 차단은 오탐 비용이 크고 되돌리기가 없습니다 | 단계적 대응, TTL, 섀도 모드로 먼저 재기 |
표의 오른쪽은 이 시리즈의 주장입니다. 주장만 하지 않으려고, 3부에서 작은 실험실을 만들어 숫자로 확인합니다. 예를 들어 JWT.sub != Path.ID 규칙은 실험에서 공격 다섯 종류를 첫 요청에 잡았지만, 정상 사용자 150명 중 146명에게도 경보를 울렸습니다.

방어 수단을 도구 이름이 아니라 얼마나 빨리 반응해야 하는가로 나눕니다. 이 시리즈는 이것을 네 개의 방어선이라고 부릅니다.
네 방어선이 내린 결정은 결정 API 한 곳에 모입니다. 결정은 TTL(만료 시간)이 붙은 차단 목록이나 세션 폐기 같은 모양이고, 방어선 0·1·2가 이것을 읽어 적용합니다. 그래서 상관 분석이 몇 분 늦게 찾아낸 공격자도 다음 요청부터는 앞쪽 방어선에서 걸립니다.
원칙은 다섯 가지입니다.

JWT.sub != Path.ID, IP 기준 차단, "오버헤드 0 eBPF"는 그대로 쓰면 안 됩니다. 3부에서 숫자로 확인합니다.모든 링크는 2026-10-30에 확인했습니다.
lab/(README에 재현 명령)다음 글 공격은 어디서 보이나: IDOR·열거·퍼징·로그인 공격·봇
시리즈 전체 목록 해킹 시도를 몇 초 안에 잡는 서버 전체 목록