sgcWebSockets 2025.10.0 릴리스는 클라이언트와 서버 컴포넌트 모두에 강화된 인증 계층을 적용해 Model Context Protocol(MCP) 연결성을 한 단계 향상시켜요. 이 글은 새 기능이 엔터프라이즈급 접근 제어와 Delphi 팀이 sgcWebSockets에서 기대하는 빠른 개발 워크플로를 어떻게 결합하는지 설명해요.
새로운 기능
- 이중 적용: 클라이언트 라이브러리가 서버가 검증하는 헤더를 자동으로 포함해, 검색과 적용 사이의 간격을 줄여요.
- 전송 인식: 요청이 클래식 HTTP를 사용하든 SSE 같은 스트리밍 전송을 사용하든 상관없이 인증이 작동해요.
- 상용 준비성: 기성 속성, 검증 훅, 텔레메트리 이벤트가 규제 워크로드 감사 비용을 줄여줘요.
MCP Client
MCP 클라이언트는 MCPOptions.AuthenticationOptions 속성을 통해 모든 보안 설정을 노출해요. 제로 트러스트 또는 테넌트 기반 정책을 충족하기 위해 API 키 또는 사용자 정의 헤더 흐름을 독립적으로 활성화하면 컴포넌트가 각 HTTP POST와 SSE 업그레이드 중에 필요한 헤더를 주입해요.
- 사용자 정의 헤더 인증으로 독점 헤더/값 쌍(예:
X-Tenant또는X-Region)을 설정할 수 있어요. - API 키/Bearer 토큰 지원이 표준
Authorization: Bearer헤더를 자동으로 형식화해 게이트웨이 및 API 관리 레이어와의 호환성을 보장해요. - 세션 전파가 요청 간에 MCP 세션 식별자를 동기화 상태로 유지해 관찰 가능성을 단순화해요.
- 스트리밍 준비: 전송이
aimcptrHttpStreamable로 전환되면 즉시 클라이언트가 동일한 인증 헤더를 보존하는 SSE 스레드를 시작해요.
하트비트, 클라이언트 메타데이터, HTTP/TLS 사용자 정의와 함께 개발자 속도를 희생하지 않고도 MCP 대화를 조직의 규정 준수 체크리스트에 맞출 수 있어요.
MCP Server
서버는 전용 엔드포인트, 전송, MCP 설정 객체로 클라이언트 컨트롤을 미러링해요. 요청이 도착하면 컴포넌트가 들어오는 모든 헤더를 검증하고 자격 증명이 누락되거나 잘못된 경우 설명적인 오류를 발생시켜요. 검증이 요청이 비즈니스 로직에 진입하기 전에 이루어지므로 오용을 조기에 차단하고 코드를 도메인 가치에 집중할 수 있어요.
- 중앙화된 헤더 검증으로 필요한 헤더/값 쌍이 없거나 일치하지 않으면 요청을 즉시 거부해요.
- Bearer 토큰 검증으로 서버 측 API 키가 클라이언트가 사용하는
Authorization헤더와 일치하는지 확인해요. - 통합 이벤트: 초기화, 세션 생명주기, 프롬프트/리소스/도구 핸들러가 계속 사용 가능해 실시간으로 인증된 세션에 반응할 수 있어요.
비즈니스 및 기술적 장점
- 판매 가능한 보안: 고객은 인증된 AI 자동화를 요구하며, MCP 인증은 RFP나 규정 준수 설문에 즉시 답할 수 있는 솔루션을 제공해요.
- 운영 효율성: 관리자가 분산된 코드 변경 대신 간단한 컴포넌트 속성으로 자격 증명을 관리해요.
- 확장 가능한 거버넌스: 테넌트별 헤더로 단일 바이너리를 유지하면서도 세션을 특정 백엔드로 라우팅하거나 속도 제한을 적용하기 쉬워요.
- 미래 대비: 인증 코드가 핵심 MCP 전송의 일부이므로 새 프로토콜 추가 시 동일한 보호 장치를 자동으로 상속해요.
Delphi Example
다음 스니펫은 단일 설정 루틴으로 Delphi에서 클라이언트와 서버 모두에 MCP 인증을 활성화하는 방법을 보여줘요. 자격 증명 값을 자신의 환경에 맞게 조정하세요.
procedure SetupMCPInfrastructure;
var
MCPClient: TsgcWSAPIClient_MCP;
MCPServer: TsgcWSServer_API_MCP;
begin
MCPClient := TsgcWSAPIClient_MCP.Create(nil);
MCPServer := TsgcWSServer_API_MCP.Create(nil);
try
// Client configuration
MCPClient.MCPOptions.HttpOptions.URL := 'https://mcp.example.com/api';
MCPClient.MCPOptions.AuthenticationOptions.ApiKey.Enabled := True;
MCPClient.MCPOptions.AuthenticationOptions.ApiKey.Value := 'YOUR_API_KEY';
MCPClient.MCPOptions.AuthenticationOptions.CustomHeader.Enabled := True;
MCPClient.MCPOptions.AuthenticationOptions.CustomHeader.Header := 'X-Tenant';
MCPClient.MCPOptions.AuthenticationOptions.CustomHeader.Value := 'Retail';
MCPClient.MCPOptions.ClientInfo.Name := 'RetailAgent';
MCPClient.MCPOptions.ClientInfo.Version := '2025.10.0';
MCPClient.MCPOptions.HeartBeat.Enabled := True;
MCPClient.MCPOptions.HeartBeat.Interval := 30;
MCPClient.OnMCPInitialize := HandleMCPInitialize;
MCPClient.OnMCPListTools := HandleMCPTools;
MCPClient.Initialize;
MCPClient.ListTools;
// Server configuration
MCPServer.EndpointOptions.Endpoint := '/mcp';
MCPServer.MCPOptions.AuthenticationOptions.ApiKey.Enabled := True;
MCPServer.MCPOptions.AuthenticationOptions.ApiKey.Value := 'YOUR_API_KEY';
MCPServer.MCPOptions.AuthenticationOptions.CustomHeader.Enabled := True;
MCPServer.MCPOptions.AuthenticationOptions.CustomHeader.Header := 'X-Tenant';
MCPServer.MCPOptions.AuthenticationOptions.CustomHeader.Value := 'Retail';
MCPServer.OnMCPInitialize := HandleServerInitialize;
MCPServer.OnMCPRequestTool := HandleToolRequest;
MCPServer.Active := True;
finally
MCPClient.Free;
MCPServer.Free;
end;
end;
