sgcWebSockets 2026.1.0부터 Azure AMQP 1.0이 SAS 토큰과 JWT를 사용한 CBS 인증을 지원해요.
Azure Service Bus는 초기 SASL 핸드셰이크 후 발신자와 수신자를 인증하기 위해 AMQP를 통해 CBS(Claims-Based Security)를 구현해요. 클라이언트가 $cbs 노드에 관리 링크를 열고 Shared Access Signature(SAS) 토큰이나 Microsoft Entra ID에서 발급한 JSON Web Token(JWT)이 포함된 put-token 요청을 보내요. 브로커가 토큰을 검증하면 인증이 토큰의 수명 동안 캐시되어 애플리케이션이 큐, 토픽, 구독에 대해 발신자와 수신자 링크를 생성할 수 있어요.
Azure CBS 작동 방식
Azure Service Bus는 초기 SASL 핸드셰이크 후 발신자와 수신자를 인증하기 위해 AMQP를 통해 CBS를 구현해요. 클라이언트가 $cbs 노드에 관리 링크를 열고 SAS 토큰이나 Microsoft Entra ID에서 발급한 JWT가 포함된 put-token 요청을 보내요. 브로커가 토큰을 검증하면 인증이 토큰의 수명 동안 캐시되어 애플리케이션이 큐, 토픽, 구독에 대해 발신자와 수신자 링크를 생성할 수 있어요.
sgcWebSockets 2026.1.0의 AMQP1 클라이언트는 Delphi 개발자에게 자연스러운 두 가지 헬퍼 메서드를 통해 이 흐름을 자동화해요:
- CreateAzureCbsSasToken은 CBS 발신자/수신자 링크 쌍을 설정하고, 대상 엔티티에 대한 SAS 토큰을 생성하여 $cbs에 게시해요. 공유 액세스 정책으로 인증할 때 사용해요.
- CreateAzureCbsJWT는 동일한 CBS 교환을 따르지만 JWT를 $cbs에 보내기 전에 클라이언트 자격 증명 그랜트를 사용하여 Microsoft Entra ID(Azure AD)에서 액세스 토큰을 받아요.
두 메서드 모두 활성 AMQP 연결이 필요하며 다음 매개변수를 받아요:
- aName: 내부적으로 생성된 CBS 링크 쌍의 식별자.
- aNameSpace 및 aEntityName: Service Bus 네임스페이스(.servicebus.windows.net 접미사 제외)와 토큰 대상을 구성하는 데 사용되는 큐, 토픽, 구독 경로.
- aKeyName / aKeyValue: SAS 토큰을 위한 공유 액세스 정책 이름과 키. 컴포넌트가 servicebus.windows.net:sastoken 토큰 타입을 사용하여 토큰에 서명하고 보내요.
- aTenant, aApplicationId, aSecret: 클라이언트 자격 증명 흐름으로 JWT를 요청하는 데 사용되는 Microsoft Entra(Azure AD) 디렉터리 ID, 애플리케이션(클라이언트) ID, 클라이언트 시크릿.
- aListeningPort(JWT): OAuth 2.0 리디렉션을 위한 로컬 HTTP 포트(제공하지 않으면 기본값 8080).
- aExpiration 및 aTimeout: 발급된 토큰의 수명(초) 및 CBS 협상의 최대 대기 시간(밀리초).
- aRaiseIfError: True로 설정하면 토큰 획득 또는 CBS 응답이 실패할 경우 예외가 발생해요.
다음 예제는 메시지를 보내기 전에 CBS로 인증하는 방법을 보여줘요.
// ... create TCP client
oClient := TsgcWebSocketClient.Create(nil);
oClient.Specifications.RFC6455 := False;
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Port := 5671;
oClient.TLS := True;
// ... create AMQP1 protocol client
oAMQP1 := TsgcWSClient_AMQP1.Create(nil);
oAMQP1.Specifications.RFC6455 := False;
oAMQP1.AMQPOptions.Authentication.AuthType := amqp1authSASLAnonymous;
oAMQP1.Client := oClient;
// ... connect and publish SAS token through CBS
oClient.Active := True;
// ... wait till the connection is active and send the authentication
oAMQP1.CreateAzureCbsSasToken('cbs', 'esegece', 'queue1',
'RootManageSharedAccessKey', 'BhJ78+w8kMXhS/eE/nBy0cRzodx9tipbi+ASbAXIaH8=',
3600, 10000, True);
다음 예제는 JWT를 사용한 Microsoft Entra ID(Azure AD) 인증에만 집중해요. 메시지를 보내거나 받기 위한 링크를 생성하기 전에 클라이언트 자격 증명 흐름으로 토큰을 요청하고 $cbs에 게시하는 방법을 보여줘요.
oClient := TsgcWebSocketClient.Create(nil);
oClient.Specifications.RFC6455 := False;
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Port := 5671;
oClient.TLS := True;
// ... create AMQP1 protocol client
oAMQP1 := TsgcWSClient_AMQP1.Create(nil);
oAMQP1.Specifications.RFC6455 := False;
oAMQP1.AMQPOptions.Authentication.AuthType := amqp1authSASLAnonymous;
oAMQP1.Client := oClient;
// ... connect and publish JWT through CBS
oClient.Active := True;
// ... wait till the connection is active and send the authentication
oAMQP1.CreateAzureCbsJWT('cbs', 'esegece', 'queue1',
'00000000-0000-0000-0000-000000000000', // Tenant ID
'11111111-1111-1111-1111-111111111111', // Application ID
'client-secret', 8080, 3600, 10000, True);
