sgcWebSockets 2026.6: gRPC, OpenAPI 서버, Kafka 및 네이티브 TLS

· 릴리스

sgcWebSockets 2026.6은 이 라이브러리 역사상 가장 규모가 큰 릴리스 중 하나입니다. 세 가지 완전히 새로운 클라이언트(네이티브 gRPC 클라이언트, Apache Kafka 클라이언트, 독립형 OpenAPI 3 서버), 모바일 및 데스크톱 앱을 OpenSSL 없이 배포할 수 있게 해주는 두 가지 네이티브 운영체제 TLS 백엔드, 방화벽의 분류 전용 봇 탐지 엔진, AI 에이전트를 위한 MCP stdio 전송, 일련의 포스트 양자 암호화 프리미티브, 그리고 WebSocket 및 HTTP 서버 전반에 걸친 광범위한 보안 강화 작업을 제공합니다.

이 글은 각 기능에 대한 짧은 Delphi 코드 조각과 모든 기능을 심도 있게 다루는 전용 글로의 링크를 곁들여, 주요 내용을 안내하는 가이드 투어입니다.

HTTP/2 기반 gRPC 클라이언트

새로운 TsgcGRPCClient는 기존 TsgcHTTP2Client 위에 구축된 네이티브 gRPC 클라이언트로, 배포해야 할 외부 gRPC 런타임이 없습니다. 네 가지 RPC 패턴(단항, 서버 스트리밍, 클라이언트 스트리밍, 양방향 스트리밍), 압축 및 콘텐츠 타입을 위한 채널 옵션, 기본 및 호출별 메타데이터, 데드라인, 지수 백오프를 사용한 자동 재시도, 클라이언트 측 부하 분산(Pick First 및 Round Robin), gRPC Health Checking, Server Reflection, 인터셉터, 그리고 OpenTelemetry 메트릭을 지원합니다.

uses
  sgcHTTP2, sgcGRPC_Client, sgcGRPC_Classes, sgcGRPC_Types;

var
  HTTP2: TsgcHTTP2Client;
  GRPC: TsgcGRPCClient;
  oResponse: TsgcGRPCResponse;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.Host := 'grpc.example.com';
  HTTP2.Port := 443;
  HTTP2.TLS  := True;

  GRPC := TsgcGRPCClient.Create(nil);
  GRPC.Client := HTTP2;

  // metadata is sent on every call (auth, tracing...)
  GRPC.DefaultMetadata.Add('authorization', 'Bearer eyJ...');

  // unary call: the request is your serialized protobuf message as TBytes
  oResponse := GRPC.Call('helloworld.Greeter', 'SayHello', RequestBytes);
  if oResponse.StatusCode = grpcOK then
    Memo1.Text := oResponse.DataString
  else
    ShowMessage('gRPC error: ' + oResponse.StatusMessage);
end;

제네릭 클라이언트 외에도 2026.6은 여덟 가지 Google Cloud 서비스를 위한 타입이 지정된 gRPC 인터페이스를 제공하며, 각각 protobuf 요청 및 응답 클래스와 서비스 계정 JWT 인증을 갖추고 있습니다: Pub/Sub, Speech-to-Text, Translation, Vision, Natural Language, Cloud Storage, BigQuery Storage 및 Vertex AI. 전체 설명: Delphi용 gRPC 클라이언트.

독립형 OpenAPI 3 서버

TsgcWSAPIServer_OpenAPI는 OpenAPI 3 명세를 실행 중인 REST 서버로 변환합니다. 명세를 로드하거나(또는 RTTI 속성을 통해 Delphi 클래스에서 생성), 이를 TsgcWebSocketHTTPServer에 연결하면 라우팅, 요청 검증, Swagger UI 및 CORS를 별도 설정 없이 바로 사용할 수 있습니다. 검증 실패 시 RFC 7807 problem+json이 자동으로 반환됩니다.

uses
  sgcWebSocket, sgcWebSocket_Classes,
  sgcWebSocket_Server_API_OpenAPI,
  sgcHTTP_OpenAPI_Server;

var
  WSServer: TsgcWebSocketHTTPServer;
  FOpenAPI: TsgcWSAPIServer_OpenAPI;
begin
  WSServer := TsgcWebSocketHTTPServer.Create(nil);
  WSServer.Port := 8080;

  FOpenAPI := TsgcWSAPIServer_OpenAPI.Create(nil);
  FOpenAPI.OnRequest := OnOpenAPIRequest;
  FOpenAPI.OnValidationError := OnOpenAPIValidationError;

  FOpenAPI.OpenAPIOptions.Endpoint.ServeSpec := True;
  FOpenAPI.OpenAPIOptions.Endpoint.ServeSwaggerUI := True;
  FOpenAPI.OpenAPIOptions.CORS.Enabled := True;
  FOpenAPI.OpenAPIOptions.Validation.ValidateRequest := True;

  FOpenAPI.LoadFromFile('petstore.json');
  FOpenAPI.Server := WSServer;

  WSServer.Active := True;
  // Swagger UI:   http://localhost:8080/docs
  // Raw spec:     http://localhost:8080/openapi.json
end;

자세히 보기: Delphi용 OpenAPI 서버.

Apache Kafka 클라이언트

TsgcWSPClient_Kafka는 Java나 librdkafka 종속성 없이 원시 TCP를 통해 바이너리 Kafka 와이어 프로토콜로 통신하는 네이티브 Apache Kafka 클라이언트입니다. 메시지를 생산 및 소비하고, 구독 및 폴링하며, 컨슈머 그룹, 토픽 및 오프셋을 관리할 수 있습니다.

uses
  sgcWebSocket, sgcWebSocket_Protocols, sgcKafka_Classes;

var
  oClient: TsgcWebSocketClient;
  oKafka: TsgcWSPClient_Kafka;
begin
  oClient := TsgcWebSocketClient.Create(nil);
  oClient.Specifications.RFC6455 := False; // raw TCP, native Kafka protocol
  oClient.Host := '127.0.0.1';
  oClient.Port := 9092;

  oKafka := TsgcWSPClient_Kafka.Create(nil);
  oKafka.Client := oClient;
  oKafka.KafkaOptions.ClientId := 'my-delphi-app';
  oKafka.OnKafkaConnect := OnKafkaConnect;
  oKafka.OnKafkaMessage := OnKafkaMessage;
  oKafka.OnKafkaProduce := OnKafkaProduce;

  oClient.Active := True; // connect to the broker
end;

자세히 보기: Delphi용 Apache Kafka 클라이언트.

Android 및 Apple의 네이티브 TLS, 배포할 OpenSSL 불필요

두 가지 새로운 TLS 백엔드는 핸드셰이크를 OpenSSL 대신 운영체제를 통해 수행하므로, 앱은 Android에서 libssl.so / libcrypto.so를, iOS 및 macOS에서 .dylib를 배포하지 않아도 됩니다. 둘 다 TLSOptions.IOHandler를 통해 플랫폼별로 선택되며, 이미 사용 중인 동일한 TLSOptions API(사용자 정의 CA, 클라이언트 인증서, ALPN)를 재사용합니다.

Android(iohAndroidTLS)는 JNI를 통해 플랫폼 javax.net.ssl.SSLEngine으로 TLS를 실행하고, 호스트 이름 검증과 함께 Android 시스템 신뢰 저장소를 기준으로 검증하며, TLS 1.3을 협상하고 Android 10 이상에서 ALPN을 지원합니다. RAD Studio XE8 이상이 필요합니다.

uses
  sgcWebSocket, sgcWebSocket_Types;

WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAndroidTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;

Apple(iohAppleTLS)은 macOS 10.14 이상 및 iOS 12 이상에서 TLS 1.3을 위해 Network.framework를 자동으로 선택하고, 이전 시스템에서는 Secure Transport(TLS 1.2)로 폴백합니다. SNI 및 호스트 이름 검증과 함께 시스템 신뢰 저장소를 사용하며, 사용자 정의 검증을 위해 OnAppleTLSVerifyPeer 이벤트를 노출합니다. RAD Studio XE6 이상이 필요합니다.

uses
  sgcWebSocket, sgcWebSocket_Types;

WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAppleTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;

자세히 보기: 네이티브 Android TLS네이티브 Apple TLS.

방화벽 봇 탐지

TsgcWebSocketFirewall은 알려진 봇 CIDR 목록, 데이터센터 ASN 범위, 정방향 확인 역방향 DNS(FCrDNS) 및 DNSBL 조회를 사용하여 클라이언트를 검증된 검색 엔진 크롤러, 데이터센터 범위 또는 차단 목록에 등록된 주소로 분류하는 IP 기반 봇 탐지 모듈을 갖추게 되었습니다. 이는 분류 전용입니다: 결과는 새로운 OnBotDetected 이벤트와 GetBotClassification 메서드를 통해 노출되므로, 방화벽이 대신 연결을 차단하는 것이 아니라 사용자가 그 결과로 무엇을 할지 결정합니다.

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

이번 릴리스는 또한 방화벽에 완전한 IPv6를 제공합니다: /128까지의 블랙리스트 및 화이트리스트 CIDR 매칭, GeoLite2 IPv6 국가 차단, IPv6 봇 범위 및 ip6.arpa 역방향 DNS / DNSBL. IPv6 CIDR이 32비트 연산으로 평가되어(그래서 모든 IPv6 클라이언트와 일치하던) 오랫동안 존재하던 버그가 수정되었습니다. 자세히 보기: 방화벽의 봇 탐지.

MCP stdio 전송

Model Context Protocol 서버와 클라이언트는 이제 새로운 TsgcAI_MCP_Server_Stdio 호스트를 통해 표준 입력/출력으로 실행될 수 있으므로, Delphi MCP 서버를 Claude Code와 같은 AI 에이전트가 로컬 하위 프로세스로 생성할 수 있습니다. 도구는 HTTP 서버에서와 정확히 동일하게 등록됩니다.

uses
  SysUtils, sgcAI_MCP_Server, sgcAI_MCP_Classes, sgcAI_MCP_Types;

var
  oServer: TsgcAI_MCP_Server_Stdio;
  oTool: TsgcAI_MCP_Tool;
begin
  oServer := TsgcAI_MCP_Server_Stdio.Create(nil);
  try
    oServer.ServerInfo.Name := 'MyDelphiServer';
    oServer.ServerInfo.Version := '1.0';

    oTool := oServer.MCPServer.Tools.AddTool('add', 'Adds two numbers');
    oTool.InputSchema.Properties.AddProperty('a', True, aimcpjtNumber);
    oTool.InputSchema.Properties.AddProperty('b', True, aimcpjtNumber);

    oServer.MCPServer.OnMCPRequestTool := OnRequestTool;

    // read JSON-RPC from stdin, write responses to stdout, blocks until EOF
    oServer.Run;
  finally
    oServer.Free;
  end;
end.

자세히 보기: 서버 및 클라이언트를 위한 MCP stdio 전송.

기본적으로 강화됨

2026.6은 서버에서 일련의 서비스 거부 및 프로토콜 준수 문제를 해결하고, 새로운 제한을 안전한 기본값을 가진 속성으로 노출합니다.

WebSocket 서버는 이제 MaxMessageSize(기본값 64 MB, 0 = 무제한)로 메시지 메모리를 제한하여, 과도하게 큰 메시지, 끝없는 단편화, permessage-deflate "zip bomb"를 close 1009로 거부합니다. 새로운 SecurityOptions.EnforceWebSocketVersionSecurityOptions.ValidateWebSocketKey는 RFC 6455 핸드셰이크를 검증하며, 둘 다 기본적으로 활성화되어 있습니다.

oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 80;
// accept messages up to 16 MB, reject anything larger with close 1009
oServer.MaxMessageSize := 16 * 1024 * 1024;
oServer.Active := True;

HTTP 서버는 MaxRequestBodySize(기본값 64 MB)와 StrictRequestParsing(기본값 True, Content-Length와 Transfer-Encoding을 모두 포함하는 요청을 거부)을 추가합니다. 정적 파일 제공의 경로 탐색(path traversal)이 수정되었고, HTTP/2 Rapid Reset(CVE-2023-44487)은 연결별 RST_STREAM 및 컨트롤 프레임 제한으로 완화되며, DocumentRoot 파일은 이제 메모리에 전체를 로드하는 대신 공유 TFileStream으로 디스크에서 스트리밍되므로, 파일 크기나 연결 수와 관계없이 서버 RAM이 일정하게 유지됩니다.

oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 80;
oServer.MaxRequestBodySize := 16 * 1024 * 1024;  // 16 MB, reject larger with 413
oServer.Active := True;

자세히 보기: WebSocket 서버 강화HTTP 서버 강화.

포스트 양자 및 AEAD 암호화

하이브리드 포스트 양자 핸드셰이크를 구축하는 애플리케이션을 위해, 2026.6은 ML-KEM-768 캡슐화 및 역캡슐화(sgcKEM_MLKEM768_Encapsulate / Decapsulate, OpenSSL 3.5 이상)를, 동일한 TBytes API 형태를 공유하는 P-256 기반의 고전적 ECDH-as-KEM(sgcKEM_ECDH_P256_Encapsulate / Decapsulate)과 함께 추가하므로, 코드를 변경하지 않고도 고전적 KEM과 포스트 양자 KEM 사이를 전환할 수 있습니다.

새로운 sgcSSL_AEAD 유닛은 AES-128-GCM, AES-256-GCM 및 ChaCha20-Poly1305를 위한 제네릭 AEAD 프리미티브(sgcAEAD_Encrypt / sgcAEAD_Decrypt)를 제공하며, 호출자가 제공하는 12바이트 nonce와 임의의 AAD를 사용합니다. sgcAEAD_EncryptPrefixed / sgcAEAD_DecryptPrefixed 래퍼는 Bouncy Castle GCM, JOSE A256GCM, libsodium 및 대부분의 HPKE 스타일 프로토콜에서 사용하는 자체 포함형 "nonce(12) || ciphertext || tag(16)" blob을 생성하고 소비합니다.

uses
  sgcSSL_AEAD;

var
  vKey, vPlain, vBlob, vOut: TBytes;
begin
  // vKey: 32 bytes from KEM Decapsulate + HKDF
  vBlob := sgcAEAD_EncryptPrefixed(aeadAES256GCM, vKey, vPlain, nil);
  vOut  := sgcAEAD_DecryptPrefixed(aeadAES256GCM, vKey, vBlob, nil);
end;

계정 다운로드 API

eSeGeCe 계정의 새로운 REST API를 통해 로그인하고, 구독으로 이용할 권리가 있는 파일을 스크립트나 CI에서 바로 나열하고 다운로드할 수 있습니다. OpenAPI 3.0으로 설명되어 있으며, sgcOpenAPI 기반으로 구축된 바로 사용 가능한 Delphi 클라이언트를 함께 제공합니다.

curl -X POST https://www.esegece.com/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"YOUR_USERNAME","password":"YOUR_PASSWORD"}'

자세히 보기: 계정 API로 다운로드 자동화하기.

이번 릴리스의 기타 변경 사항

업그레이드

2026.6은 기존 2026.x 프로젝트를 위한 드롭인 업그레이드입니다. 서버 강화는 안전한 기본값과 함께 제공되므로, 주의해야 할 유일한 점은 64 MB 기본값인 MaxMessageSize / MaxRequestBodySize입니다: 애플리케이션이 정당하게 더 큰 페이로드를 교환하는 경우, 이전 동작과 일치하도록 제한을 높이거나(또는 무제한을 위해 0으로 설정) 하십시오.

활성 구독을 보유한 고객은 고객 영역이나 esegece.com/products/websockets/download에서 새 빌드를 다운로드할 수 있습니다.

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