보안은 선택이 아니에요. 인터넷에 노출된 모든 WebSocket 서버는 무차별 대입 공격, 인젝션 시도, 연결 홍수, 자동화된 남용의 대상이에요. 이러한 위협에 대응하려면 일반적으로 외부 미들웨어를 추가하거나, 사용자 지정 필터링 로직을 작성하거나, 별도의 리버스 프록시를 배포해야 해요 — 이 모든 것이 복잡성을 추가하고 개발 속도를 늦춰요.
sgcWebSockets 2026.4.0에서 TsgcWSFirewall을 도입했어요 — WebSocket 서버에 직접 연결되는 전용 방화벽 컴포넌트로, GeoIP 국가 필터링, 적응형 위협 점수, 점진적 차단 에스컬레이션, 사용자 지정 규칙 엔진 등 15개 보호 모듈을 제공해요. 컴포넌트를 추가하고, 필요한 보호 모듈을 설정하고, 서버에 할당하면 애플리케이션이 보호돼요. 외부 종속성도, 미들웨어도, 일반적인 경우에 대한 사용자 지정 코드도 필요 없어요.
이 글에서는 전체 기능 세트를 다루고 Delphi에서 각 보호 모듈을 설정하는 방법을 보여줘요.
15개의 보호 모듈, 하나의 컴포넌트
방화벽은 15개의 독립적인 보호 모듈을 제공해요. 필요한 것만 활성화하세요 — 각 모듈은 독립적으로 또는 다른 모듈과 조합해서 작동해요.
|
IP 블랙리스트 CIDR 표기법을 사용해 특정 IP 주소나 전체 범위를 차단해요. 블랙리스트에 있는 IP의 연결은 애플리케이션 코드에 도달하기 전에 거부돼요. |
IP 화이트리스트 신뢰할 수 있는 IP 목록을 정의해요. 활성화되면 화이트리스트 주소는 다른 모든 보안 검사를 우회해요 — 내부 서비스 및 모니터링 도구에 이상적이에요. |
무차별 대입 보호 IP별 인증 실패 시도를 추적해요. 슬라이딩 시간 창 내에서 설정 가능한 임계값 이후 위반자를 자동으로 차단해요. |
|
SQL 인젝션 감지 들어오는 메시지에서 일반적인 SQL 인젝션 패턴을 검사해요. 불린 인젝션, UNION SELECT, 명령문 인젝션 등의 내장 감지 기능이 있어요. |
XSS 감지 메시지의 크로스 사이트 스크립팅 페이로드를 감지해요. 스크립트 태그, 이벤트 핸들러, JavaScript 프로토콜 URI, iframe 인젝션, CSS 표현식을 잡아내요. |
연결 속도 제한 IP 주소당 동시 연결 수를 제한해요. 단일 클라이언트가 서버 리소스를 소진하지 못하도록 방지해요. |
|
메시지 홍수 보호 단일 IP가 초당 보낼 수 있는 메시지 수를 제한해요. 메시지 홍수 및 서비스 거부 패턴으로부터 보호해요. |
페이로드 크기 제한 최대 크기 임계값을 초과하는 메시지를 거부해요. 과도한 페이로드로 인한 메모리 고갈을 방지해요. |
경로 탐색 감지 메시지의 디렉토리 탐색 시퀀스를 감지해요. 의도된 범위 밖의 파일에 접근하려는 시도를 차단해요. |
|
명령어 인젝션 감지 메시지의 OS 명령어 인젝션 패턴을 감지해요. 셸 메타문자와 일반적인 명령어 시퀀스를 차단해요. |
GeoIP 국가 필터링 지리적 출처를 기반으로 연결을 허용하거나 차단해요. CSV 데이터베이스 조회를 통한 차단 목록 및 허용 목록 모드를 지원해요. |
위협 점수 시스템 모든 위반 유형에 걸쳐 IP별로 가중치 점수를 누적해요. 임계값에 도달하면 자동 차단하며, 시간이 지남에 따라 자동으로 감소해요. |
|
점진적 차단 에스컬레이션 반복 위반마다 차단 기간을 늘려요. 지속적인 위반자에 대해 단기 차단에서 영구 차단으로 에스컬레이션해요. |
WebSocket 보호 WebSocket 출처를 검증하고, 프레임 크기 제한을 적용하며, 서브프로토콜을 필터링해요. 메시지 내용을 넘어서는 프로토콜 수준 보호예요. |
사용자 지정 규칙 엔진 조건과 액션으로 자체 방화벽 규칙을 정의해요. 위반 임계값, 시간 창 및 자동화된 응답을 만들어요. |
빠른 시작
방화벽을 설정하고 실행하는 데는 세 가지 단계만 필요해요: 생성, 설정, 할당.
var
oFirewall: TsgcWSFirewall;
oServer: TsgcWebSocketHTTPServer;
begin
oFirewall := TsgcWSFirewall.Create(nil);
oFirewall.Enabled := True;
// Enable the modules you need
oFirewall.Blacklist.Enabled := True;
oFirewall.Blacklist.IPs.Add('10.0.0.0/8');
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.SQLInjection.Enabled := True;
oFirewall.XSS.Enabled := True;
// Assign to any server component
oServer.Firewall := oFirewall;
oServer.Active := True;
end;
할당되면 방화벽이 자동으로 통합돼요: 이벤트 핸들러에 도달하기 전에 연결이 확인되고, 메시지가 실시간으로 스캔되며, 연결이 끊긴 클라이언트가 추적에서 등록 해제돼요 — 이벤트 처리 코드를 한 줄도 작성하지 않아도 돼요.
IP 블랙리스트 & 화이트리스트
블랙리스트는 특정 IP나 범위의 연결을 거부해요. 화이트리스트는 그 반대예요 — 메시지 필터링을 포함한 모든 다른 검사를 우회하는 신뢰할 수 있는 주소 집합을 정의해요.
둘 다 정확한 IP 주소와 범위 기반 필터링을 위한 CIDR 표기법을 지원해요:
// Blacklist: block entire subnets and specific IPs
oFirewall.Blacklist.Enabled := True;
oFirewall.Blacklist.IPs.Add('10.0.0.0/8'); // All 10.x.x.x
oFirewall.Blacklist.IPs.Add('172.16.0.0/16'); // All 172.16.x.x
oFirewall.Blacklist.IPs.Add('192.168.1.100'); // Single IP
// Whitelist: trusted IPs bypass everything
oFirewall.Whitelist.Enabled := True;
oFirewall.Whitelist.IPs.Add('192.168.1.1'); // Admin machine
oFirewall.Whitelist.IPs.Add('192.168.1.0/24'); // Internal network
우선순위. 화이트리스트가 활성화되면 먼저 확인해요. IP가 일치하면 연결이 즉시 허용돼요 — 블랙리스트, 차단, 속도 제한 및 메시지 필터는 모두 건너뛰어요.
무차별 대입 보호
무차별 대입 모듈은 슬라이딩 시간 창을 사용해 IP별 인증 실패 시도를 추적해요. IP가 창 내에서 최대 시도 횟수를 초과하면 설정 가능한 기간 동안 자동으로 차단돼요.
| 속성 | 기본값 | 설명 |
|---|---|---|
| MaxAttempts | 5 | 차단 전 실패 시도 횟수 |
| TimeWindowSec | 60 | 시도를 계산하기 위한 슬라이딩 창(초) |
| BanDurationSec | 300 | 차단 기간(초, 0 = 영구) |
// Ban after 3 failed logins within 60 seconds, for 10 minutes
oFirewall.BruteForce.Enabled := True;
oFirewall.BruteForce.MaxAttempts := 3;
oFirewall.BruteForce.TimeWindowSec := 60;
oFirewall.BruteForce.BanDurationSec := 600;
// Register failed attempts from your authentication handler
procedure TForm1.ServerAuthentication(Connection: TsgcWSConnection;
aUser, aPassword: String; var Authenticated: Boolean);
begin
Authenticated := ValidateCredentials(aUser, aPassword);
if not Authenticated then
oFirewall.RegisterFailedAttempt(Connection.IP);
end;
방화벽이 나머지를 자동으로 처리해요: 시도를 계산하고, 시간 창을 확인하며, 임계값에 도달하면 IP를 차단해요. 차단된 IP는 추가 처리 전에 연결 수준에서 거부돼요.
수동 차단 관리
자동 차단 외에도 언제든지 프로그래밍 방식으로 차단을 관리할 수 있어요:
// Ban an IP for 1 hour
oFirewall.BanIP('203.0.113.50', 3600);
// Permanent ban (duration = 0)
oFirewall.BanIP('198.51.100.10');
// Check ban status
if oFirewall.IsBanned('203.0.113.50') then
WriteLn('IP is banned');
// Remove a specific ban
oFirewall.UnbanIP('203.0.113.50');
// Clear all bans
oFirewall.ClearBans;
SQL 인젝션 감지
SQL 인젝션 모듈은 들어오는 모든 텍스트 메시지에서 일반적인 공격 패턴을 검사해요. 일치가 감지되면 설정 가능한 액션이 응답을 결정해요: 클라이언트 차단, 이벤트 기록 또는 통과 허용.
oFirewall.SQLInjection.Enabled := True;
oFirewall.SQLInjection.Action := faDeny; // faDeny, faLog, or faAllow
// Add custom patterns beyond the built-in set
oFirewall.SQLInjection.CustomPatterns.Add('WAITFOR DELAY');
oFirewall.SQLInjection.CustomPatterns.Add('BENCHMARK(');
내장 패턴
감지기는 가장 일반적인 SQL 인젝션 기술에 대해 대소문자를 구분하지 않는 검사를 포함해요:
- ' OR ', ' AND ' — 불린 인젝션
- UNION SELECT — 유니온 기반 인젝션
- '; DROP, '; DELETE, '; INSERT, '; UPDATE — 명령문 인젝션
- EXEC(, EXECUTE( — 명령어 실행
- xp_cmdshell — 확장 저장 프로시저
- CAST(, CONVERT( — 형식 변환 남용
- 1=1, 1'='1 — 동어 반복 인젝션
XSS 감지
XSS 모듈은 WebSocket 메시지에서 크로스 사이트 스크립팅 페이로드가 애플리케이션 로직에 도달하거나 다른 클라이언트에 전달되기 전에 감지해요.
oFirewall.XSS.Enabled := True;
oFirewall.XSS.Action := faDeny;
내장 감지 범위:
- , <strong style="color:#2c2c2c;">javascript: — Script injection
- onerror=, onload=, onclick=, onmouseover= — Event handler injection
- eval(, document.cookie — JavaScript evaluation and cookie theft
- — Element injection
- , expression( — SVG and CSS expression attacks
연결 속도 제한
단일 IP 주소가 보유할 수 있는 동시 연결 수를 제한해요. 악의적이거나 잘못 설정된 클라이언트가 과도한 연결을 열어 리소스를 고갈시키는 것을 방지해요.
// Allow up to 5 concurrent connections per IP
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.RateLimit.TimeWindowSec := 60;
연결 추적은 완전히 자동이에요: 방화벽이 연결 시 카운터를 증가시키고 연결 해제 시 감소시켜요. 새 연결이 제한을 초과하면 서버의 OnConnect 이벤트가 실행되기 전에 거부돼요.
메시지 홍수 보호
단일 IP가 초당 보낼 수 있는 메시지 수를 제한해요. 클라이언트가 서버나 다른 연결된 클라이언트를 압도하기 위해 빠르게 메시지를 보내는 서비스 거부 패턴으로부터 보호해요.
// Limit to 50 messages per second per IP
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
oFirewall.FloodProtection.Action := faDeny; // Disconnect offender
페이로드 크기 제한
클라이언트가 서버 메모리를 고갈시킬 수 있는 과도한 페이로드를 보내지 못하도록 최대 메시지 크기를 적용해요. 임계값을 초과하는 메시지는 처리 전에 거부돼요.
oFirewall.PayloadLimit.Enabled := True;
oFirewall.PayloadLimit.MaxSizeBytes := 65536; // 64 KB max
oFirewall.PayloadLimit.Action := faDeny;
경로 탐색 감지
경로 탐색 모듈은 들어오는 메시지에서 의도된 범위 밖의 파일에 접근하려는 디렉토리 탐색 시퀀스를 검사해요. 클라이언트 메시지에서 파일 경로나 리소스 식별자를 처리하는 애플리케이션에 중요해요.
내장 감지 범위:
- ../, ..\ — Relative path traversal
- %2e%2e, %252e — URL-encoded traversal
- /etc/passwd, /etc/shadow — Unix system file access
- cmd.exe, boot.ini — Windows system file access
oFirewall.PathTraversal.Enabled := True;
oFirewall.PathTraversal.Action := faDeny;
명령어 인젝션 감지
명령어 인젝션 모듈은 메시지의 OS 명령어 인젝션 패턴을 감지해요. 임의의 시스템 명령을 실행하는 데 사용되는 셸 메타문자와 일반적인 명령어 시퀀스를 잡아내요.
내장 감지 범위:
- ; |, &&, || — Shell command chaining
- $(command), `command` — Command substitution
- wget, curl, nc, netcat — Network utility invocation
- /bin/sh, /bin/bash, cmd /c — Shell spawning
oFirewall.CommandInjection.Enabled := True;
oFirewall.CommandInjection.Action := faDeny;
GeoIP 국가 필터링
IP-국가 변환을 사용해 지리적 출처에 따라 연결을 필터링해요. GeoIP 모듈은 두 가지 모드를 지원해요: BlockList(특정 국가 차단, 나머지 허용) 및 AllowList(특정 국가만 허용, 나머지 차단).
| 속성 | 설명 |
|---|---|
| Mode | gmBlockList or gmAllowList |
| Countries | ISO 3166-1 alpha-2 국가 코드(예: US, GB, DE) |
| DatabaseFile | IP-국가 변환을 위한 CSV 파일 경로 |
특정 국가 차단
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmBlockList;
oFirewall.GeoIP.Countries.Add('CN');
oFirewall.GeoIP.Countries.Add('RU');
oFirewall.LoadGeoIPDatabase('geoip.csv');
특정 국가만 허용
// Only allow connections from US, UK, and Germany
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmAllowList;
oFirewall.GeoIP.Countries.Add('US');
oFirewall.GeoIP.Countries.Add('GB');
oFirewall.GeoIP.Countries.Add('DE');
oFirewall.LoadGeoIPDatabase('geoip.csv');
GeoIP 데이터베이스. DB-IP 및 IP2Location과 같은 공급자에서 무료 IP-국가 CSV 데이터베이스를 사용할 수 있어요. 또는 OnResolveCountry 이벤트를 구현해 자체 변환 로직을 사용할 수 있어요.
위협 점수 시스템
위협 점수 시스템은 각 위반 유형에 가중치 점수를 할당하고 IP 주소별로 점수를 누적해요. 점수가 자동 차단 임계값을 초과하면 IP가 자동으로 차단돼요. 점수는 시간이 지남에 따라 감소하므로 일회성 사건이 영구적인 제재로 이어지지 않아요.
| 속성 | 기본값 | 설명 |
|---|---|---|
| AutoBanThreshold | 100 | IP가 자동으로 차단되는 점수 |
| DecayPerHour | 10 | 비활성 1시간마다 차감되는 점수 |
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;
점수 변화 모니터링
OnThreatScoreChanged 이벤트를 사용해 실시간으로 점수를 모니터링하고 자동 차단 임계값에 도달하기 전에 사용자 지정 액션을 취할 수 있어요.
procedure TForm1.FirewallThreatScoreChanged(Sender: TObject;
const aIP: string; const aOldScore, aNewScore: Integer);
begin
if aNewScore >= 50 then
LogToFile(Format('[%s] Threat score elevated: %d -> %d',
[aIP, aOldScore, aNewScore]));
end;
점진적 차단 에스컬레이션
고정된 차단 기간 대신 에스컬레이션 모듈이 반복 위반마다 차단 기간을 늘려요. 첫 번째 위반자는 단기 차단을 받고, 지속적인 위반자는 영구 차단으로 에스컬레이션돼요.
oFirewall.BanEscalation.Enabled := True;
oFirewall.BanEscalation.Levels.Add('300'); // 5 minutes
oFirewall.BanEscalation.Levels.Add('1800'); // 30 minutes
oFirewall.BanEscalation.Levels.Add('7200'); // 2 hours
oFirewall.BanEscalation.Levels.Add('86400'); // 24 hours
oFirewall.BanEscalation.Levels.Add('0'); // permanent
팁. 최대 효과를 위해 점진적 에스컬레이션을 위협 점수 시스템과 결합하세요. 위협 점수는 여러 위반 유형에서 불량 행위자를 식별하고, 에스컬레이션은 반복 위반자가 점점 더 심각한 결과에 직면하도록 해요.
WebSocket 전용 보호
메시지 수준 스캔 외에도 방화벽은 WebSocket 연결에 특화된 프로토콜 수준 보호를 제공해요: 출처 검증, 프레임 크기 적용, 서브프로토콜 필터링.
// Validate the Origin header to prevent cross-site hijacking
oFirewall.WebSocket.Enabled := True;
oFirewall.WebSocket.AllowedOrigins.Add('https://www.example.com');
oFirewall.WebSocket.AllowedOrigins.Add('https://app.example.com');
// Enforce maximum frame size (bytes)
oFirewall.WebSocket.MaxFrameSize := 131072; // 128 KB
// Only allow specific subprotocols
oFirewall.WebSocket.AllowedSubProtocols.Add('graphql-ws');
oFirewall.WebSocket.AllowedSubProtocols.Add('mqtt');
사용자 지정 규칙 엔진
사용자 지정 규칙 엔진을 사용해 조건과 자동화된 액션으로 자체 방화벽 규칙을 정의할 수 있어요. 각 규칙은 시간 창 내의 위반 임계값과 임계값 초과 시 취할 액션을 지정해요.
| 속성 | 설명 |
|---|---|
| Name | 규칙에 대한 설명적인 이름 |
| MinViolations | 규칙을 트리거하는 데 필요한 위반 횟수 |
| TimeWindowSec | 위반을 계산하기 위한 슬라이딩 창(초) |
| ActionType | 취할 액션: raDeny, raAllow, raBan, 또는 raLog |
| BanDurationSec | ActionType이 raBan일 때 차단 기간 |
액션 유형:
| 액션 | 동작 |
|---|---|
raDeny |
클라이언트를 즉시 연결 해제 |
raAllow |
액션 없음(규칙이 추적되지만 적용되지 않음) |
raBan |
지정된 기간 동안 IP 차단 |
raLog |
OnViolation 이벤트만 실행 |
var
vRule: TsgcFirewallRuleItem;
begin
oFirewall.CustomRules.Enabled := True;
vRule := TsgcFirewallRuleItem(oFirewall.CustomRules.Rules.Add);
vRule.Name := 'Block high-risk IPs';
vRule.MinViolations := 5;
vRule.TimeWindowSec := 300;
vRule.ActionType := raBan;
vRule.BanDurationSec := 3600;
end;
실시간 통계
방화벽은 활성 연결, 총 차단 시도, 위반 유형별 수에 대한 실시간 카운터가 있는 Stats 객체를 제공해요. 모니터링 대시보드를 만들거나 주기적인 요약을 기록하는 데 사용하세요.
WriteLn('Active: ', oFirewall.Stats.ActiveConnections);
WriteLn('Blocked: ', oFirewall.Stats.TotalBlocked);
WriteLn('SQL Injection: ', oFirewall.Stats.GetViolationCount(fvSQLInjection));
영구 차단
기본적으로 차단은 메모리에 저장되고 재시작 시 지워져요. SaveBansToFile과 LoadBansFromFile을 사용해 서버 재시작 시에도 차단을 유지할 수 있어요.
// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
// Restore bans on startup
oFirewall.LoadBansFromFile('bans.dat');
액션 모드
SQL 인젝션, XSS 및 홍수 보호 모듈은 위반이 감지될 때 세 가지 설정 가능한 액션을 지원해요:
| 액션 | 동작 | 사용 사례 |
|---|---|---|
faDeny |
클라이언트 차단 및 연결 해제 | 프로덕션 서버 |
faLog |
OnViolation 이벤트를 실행하지만 연결 허용 | 모니터링, 테스트, 단계적 배포 |
faAllow |
액션 없음 | 설정을 제거하지 않고 모듈을 일시적으로 비활성화 |
팁. faDeny로 전환하기 전에 실제 트래픽에 방화벽이 어떻게 반응하는지 관찰하기 위해 프로덕션에서 faLog로 시작하세요. 이렇게 하면 초기 배포 중 합법적인 사용자를 차단하지 않아요.
이벤트 — 로깅 & 재정의
이벤트는 방화벽 결정에 대한 완전한 가시성과 필요할 때 이를 재정의하는 기능을 제공해요.
OnViolation — 보안 로깅
감지된 모든 위반에서 실행돼요. 보안 로그 작성, 알림 전송 또는 모니터링 대시보드 피드에 사용하세요.
procedure TForm1.FirewallViolation(Sender: TObject;
const aIP: string;
const aViolationType: TsgcFirewallViolationType;
const aDetails: string);
begin
LogToFile(Format('[%s] Firewall: %s - %s',
[aIP, ViolationTypeToStr(aViolationType), aDetails]));
end;
위반 유형 포함:
| 유형 | 트리거 조건 |
|---|---|
fvBlacklist |
IP가 블랙리스트에 있음 |
fvBruteForce |
실패 시도 임계값 초과 |
fvRateLimit |
연결 속도 제한 초과 |
fvFlood |
메시지 홍수 감지 |
fvSQLInjection |
SQL 인젝션 패턴 감지 |
fvXSS |
XSS 패턴 감지 |
fvGeoIP |
국가 필터에 의해 연결 차단 |
fvPathTraversal |
경로 탐색 패턴 감지 |
fvCommandInjection |
명령어 인젝션 패턴 감지 |
fvPayloadSize |
메시지가 최대 페이로드 크기 초과 |
fvOrigin |
WebSocket 출처가 허용 목록에 없음 |
fvFrameSize |
WebSocket 프레임이 최대 크기 초과 |
fvThreatScore |
위협 점수가 자동 차단 임계값 초과 |
fvCustomRule |
사용자 지정 규칙 임계값 초과 |
OnFiltered — 결정 재정의
연결이나 메시지가 차단되려 할 때 실행돼요. Allow 매개변수를 사용해 런타임에 방화벽의 결정을 재정의할 수 있어요.
procedure TForm1.FirewallFiltered(Sender: TObject;
const aIP: string; const aReason: string;
var Allow: Boolean);
begin
// Override: always allow the office IP even if rate-limited
if aIP = '203.0.113.10' then
Allow := True;
end;
OnResolveCountry — 사용자 지정 GeoIP 변환
GeoIP 모듈이 IP 주소를 국가 코드로 변환해야 할 때 실행돼요. 내장 CSV 데이터베이스 대신(또는 추가로) 자체 변환 로직을 구현하는 데 사용하세요.
procedure TForm1.FirewallResolveCountry(Sender: TObject;
const aIP: string; var aCountryCode: string);
begin
aCountryCode := MyGeoIPLookup(aIP);
end;
OnThreatScoreChanged — 점수 모니터링
IP의 위협 점수가 변경될 때마다 실행돼요. 자동 차단 임계값에 도달하기 전에 사용자 지정 임계값, 알림 또는 단계적 응답을 구현하는 데 사용하세요.
procedure TForm1.FirewallThreatScoreChanged(Sender: TObject;
const aIP: string; const aOldScore, aNewScore: Integer);
begin
if aNewScore >= 50 then
SendAlert(Format('IP %s threat score: %d', [aIP, aNewScore]));
end;
서버 통합
방화벽은 세 가지 서버 컴포넌트 모두와 작동해요. 단일 방화벽 인스턴스를 여러 서버에서 공유할 수도 있어요.
| 컴포넌트 | 설명 |
|---|---|
TsgcWebSocketHTTPServer |
WebSocket + HTTP 서버 (Indy 기반) |
TsgcWebSocketServer |
순수 WebSocket 서버 (Indy TCP) |
TsgcWebSocketServer_HTTPAPI |
HTTP.SYS 커널 드라이버를 사용하는 WebSocket 서버 |
할당되면 통합이 자동이에요. 방화벽은 세 지점에서 가로채요:
- 새 연결 시: 블랙리스트, 화이트리스트, 차단, GeoIP, 속도 제한 및 WebSocket 출처를 확인해요. 차단된 경우 OnConnect 이벤트 전에 거부해요.
- 메시지 수신 시: SQL 인젝션, XSS, 명령어 인젝션, 경로 탐색, 페이로드 크기 및 홍수 제한을 확인해요. 위반 시 클라이언트 연결을 해제해요.
- 연결 해제 시: 내부 추적 카운터에서 연결을 등록 해제해요.
완전한 예제
핵심 보호 모듈과 새로운 고급 기능이 활성화된 완전히 설정된 WebSocket 서버예요.
uses
sgcWebSocket_Server, sgcWebSocket_Server_Firewall;
var
oFirewall: TsgcWSFirewall;
oServer: TsgcWebSocketHTTPServer;
begin
oFirewall := TsgcWSFirewall.Create(nil);
oServer := TsgcWebSocketHTTPServer.Create(nil);
Try
// IP filtering
oFirewall.Blacklist.Enabled := True;
oFirewall.Blacklist.IPs.Add('10.0.0.0/8');
oFirewall.Whitelist.Enabled := True;
oFirewall.Whitelist.IPs.Add('192.168.1.0/24');
// Brute force: ban after 3 failures in 60s, for 10 minutes
oFirewall.BruteForce.Enabled := True;
oFirewall.BruteForce.MaxAttempts := 3;
oFirewall.BruteForce.BanDurationSec := 600;
// Message security
oFirewall.SQLInjection.Enabled := True;
oFirewall.XSS.Enabled := True;
// Rate limiting and flood protection
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
// Payload size limit
oFirewall.PayloadLimit.Enabled := True;
oFirewall.PayloadLimit.MaxSizeBytes := 65536;
// GeoIP: block specific countries
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmBlockList;
oFirewall.GeoIP.Countries.Add('CN');
oFirewall.GeoIP.Countries.Add('RU');
oFirewall.LoadGeoIPDatabase('geoip.csv');
// Threat scoring with auto-ban
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;
// Progressive ban escalation
oFirewall.BanEscalation.Enabled := True;
oFirewall.BanEscalation.Levels.Add('300');
oFirewall.BanEscalation.Levels.Add('3600');
oFirewall.BanEscalation.Levels.Add('86400');
oFirewall.BanEscalation.Levels.Add('0');
// Restore persistent bans
oFirewall.LoadBansFromFile('bans.dat');
// Events
oFirewall.OnViolation := FirewallViolation;
oFirewall.OnFiltered := FirewallFiltered;
oFirewall.OnThreatScoreChanged := FirewallThreatScoreChanged;
// Assign to server and start
oServer.Port := 443;
oServer.Firewall := oFirewall;
oServer.Active := True;
WriteLn('Server running with firewall protection.');
ReadLn;
// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
Finally
oServer.Active := False;
oServer.Free;
oFirewall.Free;
End;
end;
스레드 안전
방화벽 컴포넌트는 완전히 스레드 안전해요. 모든 공개 메서드는 내부 크리티컬 섹션을 사용해 추적 데이터에 대한 동시 접근을 보호해요. 20개의 동시 스레드로 100,000개의 작업을 수행해 오류 없이, 메모리 누수 없이 스트레스 테스트됐어요.
컴포넌트는 외부 동기화 없이 여러 서버 인스턴스에서 안전하게 공유되고 서버 이벤트 핸들러, 타이머 스레드, 백그라운드 작업자 등 어떤 스레드에서도 접근할 수 있어요.
중요 참고 사항
- 텍스트 메시지만. SQL 인젝션 및 XSS 감지는 텍스트 메시지를 스캔해요. 바이너리 메시지는 스캔되지 않아요.
- 영구 차단.
SaveBansToFile과LoadBansFromFile을 사용해 서버 재시작 시에도 차단을 유지하세요. 이 호출 없이는 차단이 메모리에만 저장되고 재시작 시 지워져요. - 화이트리스트 우선순위. 화이트리스트에 있는 IP는 메시지 수준 필터링을 포함한 모든 검사를 우회해요. 주의해서 사용하세요.
- RegisterFailedAttempt. 무차별 대입 모듈은 인증 핸들러에서
RegisterFailedAttempt를 호출해야 해요. 나머지는 모두 자동이에요. - GeoIP 데이터베이스. 국가 변환을 위해
LoadGeoIPDatabase로 CSV 데이터베이스를 로드하거나, 사용자 지정 조회 로직을 위해OnResolveCountry이벤트를 구현하세요. - 위협 점수 감소. 점수는 시간이 지남에 따라 자동으로 감소해요. 트래픽 패턴에 맞게
DecayPerHour를 조정하세요 — 트래픽이 많은 서버는 거짓 양성을 피하기 위해 더 빠른 감소가 유리할 수 있어요. - 에디션 가용성. 방화벽 컴포넌트는 sgcWebSockets의 Professional, Enterprise 및 All-Access 에디션에서 사용할 수 있어요.
