TsgcWebPush_Client › 메서드 › SendNotification
aes128gcm으로 페이로드를 암호화하고, 요청에 VAPID 서명을 하며, 브라우저 구독 엔드포인트에 POST합니다.
procedure SendNotification(const aPushSubscription : TsgcHTTP_API_WebPush_PushSubscription; const aText: string);
| Name | Type | 설명 |
|---|---|---|
aPushSubscription | const TsgcHTTP_API_WebPush_PushSubscription | 등록 시 브라우저가 반환한 구독 레코드입니다. per-message 콘텐츠 암호화 키를 도출하는 데 사용되는 Endpoint(POST할 푸시 서비스 URL), PublicKey(user-agent P-256 공개 키, p256dh, Base64URL 인코딩) 및 AuthSecret(16바이트 auth secret, Base64URL 인코딩)을 전달합니다. |
aText | const string | 브라우저에 전달할 평문 페이로드입니다(일반적으로 Service Worker가 해석하는 JSON 문서). 값은 UTF-8로 인코딩되고 전송되기 전에 aes128gcm으로 암호화됩니다. 빈 문자열은 페이로드 없는 알림을 보냅니다. |
단일 호출 Web Push 전송(RFC 8030 + RFC 8291)입니다. 이 메서드는 VAPID 키가 구성되어 있고 aPushSubscription에 Endpoint, PublicKey 및 AuthSecret이 포함되어 있는지 검증합니다. 사용자 에이전트 공개 키에 대해 ECDH 공유 비밀을 계산하고, HKDF로 콘텐츠 암호화 키와 nonce를 도출하고, aes128gcm으로 aText를 암호화하고, PEM 개인 키로 서명된 VAPID JWT(ES256)를 빌드하여 이를 Authorization 헤더로 추가하고, DER 공개 키를 Crypto-Key 헤더에 넣고, 바이너리 암호문을 구독 엔드포인트에 POST합니다. 키가 누락되면 EsgcWebSocketException이 발생합니다. 푸시 서비스는 성공 시 201/202를, 구독이 만료되어 삭제해야 할 때 404/410을, 스로틀링이 적용될 때 429를 반환합니다.
var
oSubscription: TsgcHTTP_API_WebPush_PushSubscription;
begin
oSubscription := TsgcHTTP_API_WebPush_PushSubscription.Create;
try
oSubscription.Endpoint := 'https://fcm.googleapis.com/fcm/send/...';
oSubscription.PublicKey := 'BASE64URL_P256DH';
oSubscription.AuthSecret := 'BASE64URL_AUTH';
sgcWebPush_Client1.VAPID.PEM.PrivateKey.Text := '-----BEGIN PRIVATE KEY-----...';
sgcWebPush_Client1.VAPID.DER.PrivateKey := 'BASE64URL_PRIVATE_KEY';
sgcWebPush_Client1.VAPID.DER.PublicKey := 'BASE64URL_PUBLIC_KEY';
sgcWebPush_Client1.VAPID.Details.MailTo := 'info@esegece.com';
sgcWebPush_Client1.SendNotification(oSubscription,
'{"title":"eSeGeCe","body":"Hello from sgcWebSockets!"}');
finally
oSubscription.Free;
end;
end;