sgcWebSockets 2026.6 — 방화벽의 봇 탐지

· 컴포넌트

“IP로 봇을 식별할 수 있나요?”는 서버 측 필터링에 대해 우리가 가장 자주 받는 질문 중 하나입니다. 솔직한 답은 이렇습니다. IP 단독으로는 출발점일 뿐 결론이 아닙니다 — 하지만 잘 선택된 몇 가지 신호와 결합하면 신뢰할 수 있는 출발점이 됩니다. sgcWebSockets 2026.6은 TsgcWebSocketFirewall 컴포넌트에 정확히 그 일을 하는 새로운 봇 탐지 모듈을 추가하여, 네 가지 독립적인 신호를 사용해 연결하는 모든 IP를 분류합니다.

봇 탐지는 여러분이 이미 알고 있는 방화벽 기능들 — 블랙리스트 / 화이트리스트, GeoIP, 무차별 대입 공격, 속도 제한, 위협 점수 산정 — 옆에 자리하며, 동일한 컴포넌트 속성 설계를 따릅니다. 이 글에서는 봇 탐지가 어떻게 작동하는지와 어떻게 연결하는지를 설명합니다.

네 가지 신호, 하나의 분류

이 모듈은 각 IP를 네 가지 독립적인 신호에 대해 평가하고 단일 TsgcBotClassification 값으로 해석합니다:

결과는 여섯 가지 값 중 하나입니다:

TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
  bcSuspectedBot, bcBlocklisted, bcHuman);

IP 단독 탐지에는 실질적인 한계가 있습니다 — 주소는 CGNAT 뒤에서 공유되고, 순환되며, 정교한 봇은 주거용 프록시 풀 안에 숨습니다. 그래서 봇 탐지는 절대적인 진실이 아니라 좋은 1차 점수를 제공하도록 설계되었습니다. 바로 이 때문에, 설계상 봇 탐지는 결코 단독으로 연결을 차단하지 않습니다.

봇 탐지 활성화

모든 것은 새로운 BotDetection 속성 아래에 있습니다. 원하는 신호를 켜고 파일 기반 신호는 해당 데이터를 가리키도록 지정하세요:

uses
  sgcWebSocket_Server_Firewall;

var
  oFirewall: TsgcWebSocketFirewall;
begin
  oFirewall := TsgcWebSocketFirewall.Create(nil);

  oFirewall.BotDetection.Enabled := True;

  // 1. Verified crawler IP ranges  (file lines: CIDR,botname)
  oFirewall.BotDetection.KnownBotsFile := 'C:\firewall\known-bots.csv';

  // 2. Datacenter / hosting ranges  (file lines: CIDR,asn-name)
  oFirewall.BotDetection.Datacenter.Enabled := True;
  oFirewall.BotDetection.Datacenter.ASNFile := 'C:\firewall\datacenter-ranges.csv';

  // 3. Forward-confirmed reverse DNS verification
  oFirewall.BotDetection.ReverseDNS.Enabled := True;

  // 4. DNSBL reputation lookups
  oFirewall.BotDetection.DNSBL.Enabled := True;
  oFirewall.BotDetection.DNSBL.Zones.Add('zen.spamhaus.org');

  // Resolution tuning
  oFirewall.BotDetection.CacheDurationSec := 3600;   // cache a verdict for 1h
  oFirewall.BotDetection.DNSTimeoutMS     := 2000;

  oServer.Firewall := oFirewall;
end;

두 가지 파일 기반 신호는 방화벽의 GeoIP 데이터베이스를 구동하는 것과 동일한 빠른 이진 탐색 CIDR 엔진을 재사용하므로, 큰 범위 목록조차 마이크로초 단위로 해석됩니다.

Reverse DNS와 DNSBL은 accept 스레드를 결코 차단하지 않습니다

Reverse DNS와 DNSBL은 실시간 DNS 쿼리입니다 — 연결 수락 스레드에서 이를 인라인으로 실행하는 것은 스스로 초래한 서비스 거부가 될 것입니다. 대신, 봇 탐지는 이를 백그라운드 작업자 스레드에서 해석하고 모든 분류를 캐시에서 제공합니다. 캐시 미스가 발생하면 해당 IP는 해석을 위해 큐에 들어가고 현재 호출은 즉시 bcUnknown을 반환합니다. 조회가 완료되면 캐시가 갱신되고 OnBotDetected 이벤트가 발생합니다. CacheDurationSec 속성은 IP가 다시 검사되기 전에 판정이 얼마나 오래 재사용되는지를 제어합니다.

분류 전용: OnBotDetected

봇 탐지는 분류 전용입니다. 봇 탐지는 결코 스스로 연결을 거부하지 않습니다 — 이벤트를 발생시키고, 방화벽 통계(새로운 fvBot 카운터)를 갱신하며, 정책 결정은 여러분에게 맡깁니다. 이렇게 하면 잘못 분류된 검증된 크롤러가 조용히 버려지는 일을 막을 수 있습니다.

procedure TForm1.FirewallBotDetected(Sender: TObject; const aIP: string;
  aClassification: TsgcBotClassification; const aBotName: string);
begin
  case aClassification of
    bcVerifiedCrawler:
      DoLog(aIP + ' is a verified crawler: ' + aBotName);
    bcDatacenter:
      DoLog(aIP + ' originates from a datacenter / hosting range');
    bcBlocklisted:
      DoLog(aIP + ' is listed on a DNSBL');
  end;
end;

GetBotClassification을 사용하여 언제든지 판정을 요청할 수도 있습니다 — 연결을 필터링하기보다 응답을 맞춤화하는 데 유용합니다:

if oFirewall.GetBotClassification(vClientIP) = bcVerifiedCrawler then
  // serve a lightweight, cache-friendly variant to the crawler
  ServeStaticSnapshot
else
  ServeFullApp;

판정에 따른 조치: 사용자 지정 규칙 엔진

실제로 차단을 원할 때는 방화벽의 기존 사용자 지정 규칙 엔진을 통해 명시적으로 선택합니다. 모든 TsgcFirewallRuleItem은 새로운 BotType 속성을 얻습니다. 이를 설정하면 해당 규칙은 분류가 그 값과 동일한 연결과 일치합니다. 그런 다음 이미 가지고 있는 모든 규칙 메커니즘을 재사용하여 거부, 차단 또는 로깅할 수 있습니다.

var
  oRule: TsgcFirewallRuleItem;
begin
  oFirewall.CustomRules.Enabled := True;

  // Ban any IP listed on a DNSBL for one hour
  oRule := oFirewall.CustomRules.Rules.Add as TsgcFirewallRuleItem;
  oRule.Name           := 'ban-blocklisted-bots';
  oRule.BotType        := bcBlocklisted;
  oRule.ActionType     := raBan;
  oRule.BanDurationSec := 3600;
end;

이 분리 — 봇 탐지 모듈에서의 수동적 분류, 여러분이 작성한 규칙을 통해서만 이루어지는 능동적 시행 — 는 이 기능이 여러분이 유지하고 싶었던 트래픽을 차단하여 결코 놀라게 하지 않음을 의미합니다.

여러분만의 판정 가져오기: OnResolveBot

이미 위협 인텔리전스 서비스, 내부 평판 캐시 또는 상용 봇 완화 피드를 운영하고 있다면 OnResolveBot 이벤트를 할당하세요. 이 이벤트가 설정되면 여러분의 핸들러가 판정을 제공하고 내장된 해석기 단계는 비켜섭니다 — 방화벽이 GeoIP의 OnResolveCountry에 대해 이미 사용하는 것과 동일한 재정의 패턴입니다.

procedure TForm1.FirewallResolveBot(Sender: TObject; const aIP: string;
  var aClassification: TsgcBotClassification; var aBotName: string);
begin
  // Consult your own threat feed instead of the built-in resolver
  if MyThreatFeed.IsMaliciousBot(aIP) then
  begin
    aClassification := bcBlocklisted;
    aBotName        := 'internal-threat-feed';
  end;
end;

데모

Demos\04.WebSocket_Other_Samples\13.Firewall의 방화벽 데모에는 새로운 봇 탐지 탭이 있어, 각 신호를 켜고, 알려진 봇 및 데이터센터 범위 파일을 로드하고, DNSBL 영역을 구성하고, 실시간 “Classify IP” 테스터를 사용해 임의의 주소에 대한 판정을 확인할 수 있습니다 — 모든 분류가 이벤트 로그로 스트리밍됩니다.

이용 가능 여부

봇 탐지는 sgcWebSockets 2026.6에 포함되며 즉시 추가할 수 있는 기능입니다. BotDetection 속성은 기본적으로 비활성화되어 있으므로, 켜기 전까지 기존 프로젝트는 영향을 받지 않습니다. 이 기능은 Delphi(7부터 13까지), C++Builder 및 .NET 에디션에서 사용할 수 있습니다.

활성 구독을 보유한 고객은 고객 영역에서 새 빌드를 다운로드할 수 있습니다. 평가판 사용자는 업데이트된 설치 프로그램을 esegece.com/products/websockets/download에서 받을 수 있습니다.

질문, 피드백 또는 마이그레이션 도움이 필요하신가요? 문의하기 — 코드를 작성한 사람들로부터 답변을 받게 됩니다.