웹 푸시 알림 구독
웹사이트 방문자에게 푸시 알림을 발송하려면 먼저 브라우저의 알림 권한(Push Notification Permission)을 획득해야 합니다.
비볼디는 이 과정을 간소화한 JavaScript SDK를 제공하며, 스크립트를 <head>...</head> 태그에 삽입하는 것만으로 권한 요청과 구독 데이터 저장이 자동으로 처리됩니다.
권한을 허용한 사용자 정보는 대시보드의 [푸시 메시지 → 웹사이트 푸시 발송] 페이지에서 확인할 수 있으며, 이후 푸시 메시지 발송 시 구독자 전체에게 메시지가 전송됩니다.
<html>
<head>
<title>example page</title>
<script src="https://opencdn.vivoldi.com/js/webpush.min.js?v=202507301"></script>
<script>
const apiKey = 'oc3w9m4ytso9mv5e8yse9XXXXXXXXXX';
// Public Key of the domain registered on the “Push Message -> Domain Management” page.
const publicKey = 'XXXXXYTRlpG8mXXXXXiuBZ6BtjyOfgPsDArFYWF2PxZbY4egmDNias1gEfN_5wftScr39K8BbcjXXXXX';
const params = {apiKey:apiKey, publicKey:publicKey};
// Display notification permission pop-up (the pop-up will not appear if permission has already been granted)
function showNotificationPermission() {
webpush.register(params);
}
</script>
</head>
<body>
<button type="button" onclick="showNotificationPermission()">Permission Request</button>
</body>
</html>
'use strict';const a0_0x5374e1=a0_0xe038;(function(_0x1227c0,_0x51a60b){const _0x31ab77=a0_0xe038,_0x20d84d=_0x1227c0();while(!![]){try{const _0x12de05=parseInt(_0x31ab77(0x189))/0x1+-parseInt(_0x31ab77(0x188))/0x2+-parseInt(_0x31ab77(0x175))/0x3+parseInt(_0x31ab77(0x196))/0x4+parseInt(_0x31ab77(0x191))/0x5*(parseInt(_0x31ab77(0x179))/0x6)+parseInt(_0x31ab77(0x190))/0x7*(-parseInt(_0x31ab77(0x18a))/0x8)+parseInt(_0x31ab77(0x181))/0x9*(parseInt(_0x31ab77(0x173))/0xa);if(_0x12de05===_0x51a60b)break;else _0x20d84d['push'](_0x20d84d['shift']());}catch(_0x40c5f5){_0x20d84d['push'](_0x20d84d['shift']());}}}(a0_0x3c7d,0xc9d27));function a0_0xe038(_0x596680,_0x1be660){const _0x3c7dc3=a0_0x3c7d();return a0_0xe038=function(_0xe03880,_0x22c065){_0xe03880=_0xe03880-0x170;let _0x16ce5f=_0x3c7dc3[_0xe03880];return _0x16ce5f;},a0_0xe038(_0x596680,_0x1be660);}function a0_0x3c7d(){const _0x45d9ad=['waitUntil','notification','20673aXYLrA','navigator','title','focus','icon','toLowerCase','image','168378lbyyZD','193689SqVukM','41896sLUVSk','macintosh','close','registration','userAgent','body','1253fKQvUq','2054765fkWElD','install','includes','openWindow','badge','4620004XrYmFj','notificationclick','ko-KR','url','showNotification','parse','바로가기','window','platform','mac','actions','1490bVkBER','action','1993722LznGRH','navigate','button','activate','12Yewkpl','push','matchAll','data','then','addEventListener'];a0_0x3c7d=function(){return _0x45d9ad;};return a0_0x3c7d();}self['addEventListener'](a0_0x5374e1(0x192),_0x220cef=>{self['skipWaiting']();}),self[a0_0x5374e1(0x17e)](a0_0x5374e1(0x178),_0x4e57ea=>{const _0x4e29f9=a0_0x5374e1;_0x4e57ea[_0x4e29f9(0x17f)](clients['claim']());}),self[a0_0x5374e1(0x17e)](a0_0x5374e1(0x17a),function(_0x5b8772){const _0x578b75=a0_0x5374e1,_0x6a0810=JSON[_0x578b75(0x19b)](_0x5b8772[_0x578b75(0x17c)]['text']()),_0x41c647=navigator['language'],_0x3709b8=_0x41c647==='ko'||_0x41c647===_0x578b75(0x198),_0x398015=self[_0x578b75(0x182)]['platform']['toLowerCase']()[_0x578b75(0x193)](_0x578b75(0x171)),_0x570dee=self[_0x578b75(0x182)]['userAgent']['toLowerCase']()[_0x578b75(0x193)](_0x578b75(0x18b)),_0x417e2c={'tag':'renotify','renotify':!![],'body':_0x6a0810[_0x578b75(0x18f)],'icon':_0x6a0810[_0x578b75(0x185)],'badge':_0x6a0810[_0x578b75(0x195)],'requireInteraction':!![],'vibrate':[0x12c,0x64,0x190,0xc8,0x1f4],'data':_0x6a0810,'actions':[{'action':'go','type':_0x578b75(0x177),'title':_0x3709b8?_0x578b75(0x19c):'GO'},{'action':_0x578b75(0x18c),'type':'button','title':_0x3709b8?'닫기':'CLOSE'}]};_0x6a0810[_0x578b75(0x187)]&&(_0x417e2c[_0x578b75(0x187)]=_0x6a0810[_0x578b75(0x187)]),(_0x398015||_0x570dee)&&delete _0x417e2c[_0x578b75(0x172)],_0x5b8772['waitUntil'](self[_0x578b75(0x18d)][_0x578b75(0x19a)](_0x6a0810[_0x578b75(0x183)],_0x417e2c));}),self[a0_0x5374e1(0x17e)](a0_0x5374e1(0x197),function(_0x278188){const _0x1737d2=a0_0x5374e1;_0x278188['notification'][_0x1737d2(0x18c)]();const _0x381024=self['navigator'][_0x1737d2(0x170)][_0x1737d2(0x186)]()[_0x1737d2(0x193)]('mac'),_0x419533=self[_0x1737d2(0x182)][_0x1737d2(0x18e)][_0x1737d2(0x186)]()[_0x1737d2(0x193)](_0x1737d2(0x18b));if(_0x381024||_0x419533)_0x278188[_0x1737d2(0x17f)](clients[_0x1737d2(0x17b)]({'type':_0x1737d2(0x19d)})[_0x1737d2(0x17d)](_0x55a8eb=>{const _0x25611a=_0x1737d2;_0x55a8eb['length']>0x0?(_0x55a8eb[0x0][_0x25611a(0x176)](_0x278188[_0x25611a(0x180)][_0x25611a(0x17c)][_0x25611a(0x199)]),_0x55a8eb[0x0][_0x25611a(0x184)]()):clients[_0x25611a(0x194)](_0x278188[_0x25611a(0x180)]['data'][_0x25611a(0x199)]);}));else switch(_0x278188[_0x1737d2(0x174)]){case'go':_0x278188[_0x1737d2(0x17f)](clients[_0x1737d2(0x194)](_0x278188[_0x1737d2(0x180)][_0x1737d2(0x17c)][_0x1737d2(0x199)]));break;case _0x1737d2(0x18c):break;default:_0x278188['waitUntil'](clients[_0x1737d2(0x194)](_0x278188[_0x1737d2(0x180)][_0x1737d2(0x17c)][_0x1737d2(0x199)]));}});
푸시 알림 적용 방법
-
1
대시보드의 [개발자 API] 메뉴에서
API Key를 생성하고, [푸시 메시지 → 도메인 관리]에서 도메인을 등록한 뒤publicKey를 확인하세요. -
2
웹페이지 로드 직후 자동 실행은 브라우저에 의해 차단될 수 있습니다.
webpush.register()는 버튼 클릭 등 사용자 상호동작에서 호출하세요. -
3
sw.min.js파일을 저장해 사이트 루트 경로에 업로드하세요. 예:https://example.com/sw.min.js
샘플 페이지에서 “Permission Request” 버튼을 클릭해 알림 권한 팝업이 표시되는지 확인하고,
허용하면 대시보드 [웹사이트 푸시 발송] 페이지에서 구독 데이터를 확인할 수 있습니다.
웹 푸시 구독이란 무엇인가요?
웹 푸시 구독은 사용자가 브라우저에서 알림을 허용한 후, 해당 사용자에게 푸시 메시지를 전송할 수 있도록 등록하는 과정입니다.
- 브라우저 알림 권한 요청
- 사용자 구독 정보 생성
- 푸시 메시지 수신 대상 등록
즉, 푸시 발송의 시작 단계입니다.
웹 푸시 동작 흐름
웹 푸시는 다음과 같은 단계로 동작합니다.
- 사용자에게 알림 권한 요청
- 사용자가 허용
- 브라우저에 구독 정보 생성
- 서버에 구독 정보 등록
- 이후 푸시 메시지 발송 가능
언제 푸시 알림 구독 기능을 사용하나요?
웹사이트 방문자가 사이트를 떠난 후에도 지속적으로 재방문을 유도하고 싶을 때 사용합니다.
브라우저의 알림 권한(Push Notification Permission)을 허용한 사용자는 별도의 앱 설치 없이도 웹사이트로부터 공지사항, 프로모션, 개인화된 알림 등을 수신할 수 있어 고객 유지(Retention)와 전환율 향상에 매우 효과적입니다.
웹 푸시 알림 적용을 위한 필수 구성 요소
비볼디 푸시 알림을 성공적으로 연동하기 위해서는 다음 세 가지 핵심 요소가 필요합니다.
- API Key 및 Public Key: 대시보드에서 생성한 고유 키값을 SDK 스크립트에 포함하여 비볼디 서버와 통신합니다.
- JavaScript SDK: 웹페이지의 구간에 삽입되어 알림 권한 요청 팝업을 제어합니다.
- 서비스 워커(sw.min.js): 브라우저 백그라운드에서 푸시 메시지를 수신하기 위한 필수 파일로, 반드시 사이트의 루트(Root) 경로에 업로드해야 합니다.
사용자 알림 권한 요청 및 주의사항
브라우저 정책에 따라 알림 권한 요청은 사용자의 클릭과 같은 직접적인 상호작용이 있을 때 실행하는 것이 권장됩니다.
예시 코드의 webpush.register() 함수를 버튼 이벤트와 연결하여 자연스러운 구독 유동(Flow)을 설계하세요.
권한을 한 번 거부한 사용자는 브라우저 설정에서 직접 변경하기 전까지 다시 팝업이 표시되지 않으므로, 적절한 시점에 권한 요청을 하는 것이 중요합니다.
구독 수가 곧 발송 가능한 대상
권한을 허용한 방문자 수가 곧 푸시 메시지를 받을 수 있는 대상입니다.
예를 들어 100명이 권한을 허용했다면, 이후 푸시 메시지 발송 시 해당 100명 전원에게 메시지가 전달됩니다.
구독 현황은 대시보드에서 실시간으로 확인할 수 있으며, 구독자가 많을수록 푸시 알림의 도달 범위가 넓어집니다.
방문자가 권한을 거부한 경우에는 푸시 메시지를 받을 수 없습니다.
활용 예시
수집된 구독자 리스트를 바탕으로 타겟팅된 메시지를 발송하여 서비스 공지나 특별 혜택을 효과적으로 전달해 보세요.
- 마케팅 메시지 발송: 신규 이벤트, 할인, 공지 전달
- 사용자 재방문 유도: 서비스 재접속을 유도하는 알림
- 실시간 알림 시스템: 주문 상태, 이벤트 진행 알림