환경 설정
PushHub를 사용하기 위해서는 먼저 도메인 인증과 기본 설정이 필요합니다.
아래 단계를 따라 순차적으로 설정을 진행해 주세요.
PushHub에서 프로젝트를 생성한 후, 도메인과 푸시 아이콘을 등록합니다.
- 웹사이트 도메인: 푸시 알림을 사용할 사이트 주소 (예: https://yourdomain.com)
- 푸시 아이콘 이미지: 푸시 알림에 표시될 아이콘
권장: PNG, 정사각형, 128×128 이상
도메인 소유 인증을 위해 아래의 HTML 파일을 다운로드하고, 해당 도메인의 루트 경로에 업로드해야 합니다.
https://yourdomain.com/pushhub-verification.html
푸시 알림을 수신하려면 아래 파일들을 반드시 업로드해야 합니다.
① Firebase Service Worker
firebase-messaging-sw.js
파일을 도메인 루트 경로에 업로드하세요.
https://yourdomain.com/firebase-messaging-sw.js
② PushHub SDK 추가
<script src="https://pushhub.co.kr/pushhub_sdk.js"></script> <script> PushHub.init({ apiKey: "YOUR_API_KEY", // 프로젝트 API 키 projectId: "YOUR_PROJECT_ID", // 프로젝트 ID userId: "YOUR_SITE_USER_ID", // 로그인 사용자 ID (푸시 수신자 기준) phone: "", // 사용자 전화번호 (선택) memo: "" // 사용자 메모 (선택) }); </script>
※ 모든 페이지에 적용되어야 사용자 구독이 원활하게 처리됩니다.
권한 프롬프트 설정
사용자가 알림 권한을 허용할 수 있도록 표시되는 프롬프트 UI를 설정합니다.
PushHub는 기본적으로 3가지 유형의 프롬프트를 지원합니다.
화면 하단에서 슬라이드로 등장하는 기본 안내 형태입니다.
- 버튼 1/2 텍스트 입력 가능
- 표시 시간 설정 가능 (초 단위)
종 모양 아이콘이 고정되어 클릭 시 권한 요청을 유도합니다.
- 아이콘 위치, 색상 커스터마이징
- 토글 텍스트 표시 여부 설정 가능
개발자가 직접 디자인한 버튼/링크 클릭 시 권한을 요청합니다.
- 텍스트 및 배경색 자유 설정
- 설명 메시지 포함 가능
PushHub init 코드 예시
아래 코드를 참고하여 프로젝트에 맞는 프롬프트 타입을 설정하세요.
프롬프트 미리보기
아래 스타일을 참고하여 프로젝트에 맞는 프롬프트 타입을 설정하세요.
알림을 받고 싶다면 알림 설정을 수락해주세요
📢 사용자가 직접 권한 초기화하는 방법
- Chrome: 주소창 왼쪽 자물쇠 아이콘 → "사이트 설정" → 알림 권한 "허용/차단/초기화"
- Firefox: 주소창 옆 아이콘 클릭 → 권한 → "알림" 항목 초기화
- Safari: 환경설정 → 웹사이트 탭 → 알림 → 해당 도메인 삭제
환영 알림 설정
사용자가 알림 권한을 허용한 직후 자동으로 푸시 알림을 발송할 수 있습니다.
이 알림은 구독 확인 메시지 또는 앱/서비스 소개 메시지로 활용할 수 있습니다.
enabled
: 구독 직후 환영 알림을 보낼지 여부 (boolean)title
: 푸시 제목message
: 푸시 메시지 내용clickLinkUrl
: 클릭 시 이동할 URL (선택)openInNewTab
: 새 탭으로 열지 여부 (boolean)
API 인증
PushHub API는 API Key 기반 인증을 사용합니다.
모든 요청에는 아래와 같은 방식으로 Authorization 헤더를 포함해야 합니다.
발급된 API 키는 PushHub 관리자 페이지 > API 키 관리 메뉴에서 확인 가능합니다.
토큰 등록 및 갱신
이 API는 사용자가 알림 수신을 허용할 때 자동으로 호출되며, 디바이스 정보를 등록하거나 기존 토큰을 갱신합니다.
신규 등록된 디바이스에는 설정된 환영 메시지가 자동 발송될 수 있습니다.
※ 별도로 수동 호출하거나 수정할 수 없습니다.
PushHub.init()
내 설정을 기반으로 동작합니다.
apiKey
, projectId
, userId
에러 응답 설명
token
, projectId
, apiKey
중 하나라도 누락된 경우{"error": "도메인 인증이 완료되지 않았습니다."}
{ "success": true, "message": "신규 디바이스 토큰이 등록 되었습니다.", "token": "abc123tokenvalue" }
토큰 전체 삭제
특정 사용자(user_id
)에 등록된 모든 디바이스 토큰을 삭제합니다.
일반적으로 사용자가 알림 수신을 철회하거나, 모든 디바이스 연결을 해제할 때 사용됩니다.
DELETE
/tokens/<user_id>
Authorization 헤더 (API Key)
경로 파라미터
-
필수
user_id
: 토큰을 삭제할 대상 사용자 ID (string)
에러 응답 설명
user_id
가 제공되지 않은 경우.{ "success": true, "message": "test_user에 해당하는 모든 토큰이 삭제되었습니다." }
특정 토큰 삭제
특정 사용자(user_id
)의 디바이스 중 하나의 token
을 선택하여 삭제합니다.
알림 수신 해제를 개별 디바이스 단위로 처리하거나, 수동 제거 시 사용됩니다.
DELETE
/tokens/<user_id>/<token>
Authorization 헤더 (API Key)
경로 파라미터
-
필수
user_id
: 토큰을 삭제할 대상 사용자 ID (string) -
필수
token
: 삭제할 디바이스 토큰 값 (string)
에러 응답 설명
user_id
또는 token
이 누락된 경우.user_id
및 token
조합이 존재하지 않거나 이미 삭제된 경우.{ "success": true, "message": "지정된 토큰이 삭제되었습니다." }
토큰 목록 조회
특정 사용자(user_id
)에 등록된 모든 디바이스 토큰 정보를 조회합니다.
이 정보는 개별 푸시 발송 대상 필터링 등에 활용됩니다.
GET
/tokens/<user_id>
Authorization 헤더 (API Key)
경로 파라미터
-
필수
user_id
: 토큰을 조회할 대상 사용자 ID (string)
에러 응답 설명
user_id
가 제공되지 않은 경우.{ "success": true, "devices": [ { "browser": "Chrome", "created_at": "2025-04-16 17:27", "device_id": 317, "device_info": "Chrome on Windows", "ip_address": "192.168.0.1", "is_subscribed": 1, "last_active_at": "2025-04-16 18:50", "platform": "web", "token": "abc123...", "token_updated_at": "2025-04-16 18:50" } ] }
사용자 등록
새 사용자를 프로젝트에 등록합니다. user_id는 고유해야 하며, 이미 존재하는 경우 오류가 반환됩니다.
POST
/users/create
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
user_id
: 사용자 ID (고유값) -
선택
phone
: 사용자 전화번호 -
선택
memo
: 사용자 메모
에러 응답 설명
{"success": false, "error": "이미 존재하는 사용자 ID입니다."}
{ "user_id": "test123", "phone": "010-1234-1234", "memo": "VIP 고객님" }
{ "success": true, "message": "사용자 정보가 등록되었습니다.", 'project_user_id': 101, "user": { "memo": "VIP 고객님", "phone": "010-1234-1234", "user_id": "test123" } }
사용자 수정
기존 사용자의 전화번호 또는 메모 정보를 수정합니다.
project_user_id
를 기준으로 수정되며, 존재하지 않는 사용자인 경우 404 에러가 반환됩니다.
POST
/users/update
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
project_user_id
: 수정 대상 사용자 ID (고유값) -
선택
phone
: 전화번호 -
선택
memo
: 메모
에러 응답 설명
{ "project_user_id": 101, "phone": "010-1234-1234", "memo": "VIP 고객님" }
{ "success": true, "message": "사용자 정보가 수정되었습니다." 'project_user_id': 101, "user": { "memo": "VIP 고객님", "phone": "010-1234-1234" } }
사용자 삭제
지정한 project_user_id
에 해당하는 사용자를 삭제합니다.
해당 사용자와 연결된 모든 디바이스 정보도 함께 제거됩니다.
DELETE
/users/delete/<project_user_id>
Authorization 헤더 (API Key)
경로 파라미터
-
필수
project_user_id
: 삭제 대상 사용자 ID (고유값)
에러 응답 설명
project_user_id
가 누락된 경우{ "success": true, "message": "사용자 정보가 삭제되었습니다." }
사용자 상세 조회
지정된 project_user_id
에 해당하는 사용자 정보를 조회합니다.
사용자 ID, 전화번호, 메모 등을 반환합니다.
GET
/users/get/<project_user_id>
Authorization 헤더 (API Key)
경로 파라미터
-
필수
project_user_id
: 삭제 대상 사용자 ID (고유값)
에러 응답 설명
project_user_id
가 누락된 경우{ "success": true, "created_at": "2025-04-18 10:26", "memo": "VIP 고객", "phone": "010-1234-5678", "project_user_id": 387, "success": true, "updated_at": "2025-04-18 10:26", "user_id": "john123" }
사용자 목록 조회
프로젝트에 등록된 사용자 목록을 조회합니다. 검색 필터를 통해 ID 또는 전화번호로 조회가 가능합니다.
결과는 페이징 처리가 되어 있으며, 각 사용자의 디바이스 등록 수 및 플랫폼 정보도 함께 반환됩니다.
GET
/users/list
Authorization 헤더 (API Key)
쿼리 파라미터
-
선택
search_type
: 검색 기준 (user_id 또는 phone) -
선택
keyword
: 검색어 -
선택
page
: 페이지 번호 (기본값: 1)
에러 응답 설명
{ "success": true, "total": 2, "pagination": { "page": 1, "per_page": 20, "total_pages": 1 }, "users": [ { "project_user_id": 101, "user_id": "john123", "phone": "010-1234-5678", "memo": "VIP 고객", "created_at": "2025-04-01 10:00", "updated_at": "2025-04-10 16:00", "device_count": 2, "platforms": "web,android" } ] }
그룹 등록 StarterBiz
새 그룹을 프로젝트에 등록합니다. group_name은 고유해야 하며, 동일한 이름이 이미 존재할 경우 오류가 반환됩니다.
POST
/groups/create
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
group_name
: 그룹 이름 (고유값) -
선택
memo
: 그룹 메모
에러 응답 설명
{"success": false, "error": "이미 존재하는 그룹 이름입니다."}
{ "group_name": "VIP 고객", "memo": "광고 반응률 높은 사용자 그룹" }
{ "success": true, "message": "그룹 정보가 등록되었습니다.", "group_id": 102, "group": { "group_name": "VIP 고객", "memo": "광고 반응률 높은 사용자 그룹" } }
그룹 수정 StarterBiz
기존 그룹의 이름 또는 메모 정보를 수정합니다.
group_id
를 기준으로 수정되며, 존재하지 않는 그룹인 경우 404 에러가 반환됩니다.
POST
/groups/update
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
group_id
: 수정 대상 그룹 ID (고유값) -
필수
group_name
: 그룹 이름 -
선택
memo
: 그룹에 대한 메모
에러 응답 설명
{ "group_id": 102, "group_name": "VIP 고객", "memo": "광고 반응률 높은 사용자 그룹" }
{ "success": true, "message": "그룹 정보가 수정되었습니다.", "group_id": 102, "group": { "group_name": "VIP 고객", "memo": "광고 반응률 높은 사용자 그룹" } }
그룹 삭제 StarterBiz
지정한 group_id
에 해당하는 그룹을 삭제합니다.
해당 그룹에 포함된 사용자 연결 정보도 함께 제거됩니다.
DELETE
/groups/delete/<group_id>
Authorization 헤더 (API Key)
경로 파라미터
-
필수
group_id
: 삭제 대상 그룹 ID (고유값)
에러 응답 설명
group_id
가 누락된 경우{ "success": true, "message": "123 그룹이 삭제되었습니다." }
그룹 상세 조회 StarterBiz
지정된 group_id
에 해당하는 그룹 정보를 조회합니다.
그룹 이름 및 메모 등의 정보를 반환합니다.
GET
/groups/get/<group_id>
Authorization 헤더 (API Key)
경로 파라미터
-
필수
group_id
: 조회할 그룹의 고유 ID (고유값)
에러 응답 설명
group_id
가 누락된 경우{ "success": true, "group_id": 10, "group_name": "VIP 고객", "memo": "자주 이용하는 고객 그룹", "created_at": "2025-04-01 10:00", "updated_at": "2025-04-10 16:00" }
그룹 목록 조회 StarterBiz
프로젝트에 등록된 그룹 목록을 조회합니다. 검색 필터를 통해 그룹명, 메모, 사용자 ID 또는 전화번호로 필터링이 가능합니다.
결과는 페이징 처리되며, 각 그룹의 사용자 수 정보도 함께 반환됩니다.
GET
/groups/list
Authorization 헤더 (API Key)
쿼리 파라미터
-
선택
search_type
: 검색 기준 (group_name, memo, user_id, phone) -
선택
keyword
: 검색어 -
선택
page
: 페이지 번호 (기본값: 1)
에러 응답 설명
{ "success": true, "total": 2, "pagination": { "page": 1, "per_page": 20, "total_pages": 1 }, "groups": [ { "group_id": 10, "group_name": "VIP 고객", "memo": "자주 이용하는 고객 그룹", "created_at": "2025-04-01 10:00", "updated_at": "2025-04-10 16:00", "user_count": 5 }, { "group_id": 11, "group_name": "내부 테스트", "memo": "테스트용 그룹", "created_at": "2025-04-05 09:45", "updated_at": "2025-04-10 16:00", "user_count": 2 } ] }
그룹 사용자 등록 StarterBiz
선택한 그룹에 사용자를 등록합니다. 이미 등록된 사용자는 무시되며, 오류 없이 무시 처리됩니다.
POST
/group/users/create
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
group_id
: 등록할 그룹 ID -
필수
project_user_ids
: 등록할 사용자 ID 배열([101, 102, ...])
에러 응답 설명
{ "group_id": 102, "project_user_ids": [101, 102, 103] }
{ "success": true, "message": "사용자가 그룹에 등록되었습니다." }
그룹 사용자 삭제 StarterBiz
지정한 group_id
와 사용자 ID 배열에 해당하는 사용자들을 그룹에서 제거합니다.
POST
/group/users/delete
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
group_id
: 대상 그룹 ID -
필수
project_user_ids
: 삭제할 사용자 ID 배열([101, 102, ...])
에러 응답 설명
{ "group_id": 102, "project_user_ids": [101, 103] }
{ "success": true, "message": "사용자가 그룹에서 삭제되었습니다." }
그룹 사용자 목록 조회 StarterBiz
지정된 group_id
에 속한 사용자 목록을 조회합니다.
결과에는 사용자 ID, 전화번호, 메모, 등록일자 정보가 포함되며, 페이징은 적용되지 않습니다.
GET
/group/users/list
Authorization 헤더 (API Key)
쿼리 파라미터
-
필수
group_id
: 조회 대상 그룹의 고유 ID
에러 응답 설명
{ "success": true, "total": 2, "group_users": [ { "project_user_id": 101, "user_id": "john123", "phone": "010-1234-5678", "memo": "VIP 고객", "created_at": "2025-04-01 10:00" }, { "project_user_id": 102, "user_id": "kimtester", "phone": "010-0000-1111", "memo": "", "created_at": "2025-04-02 11:00" } ] }
사용자 푸시 발송
선택한 사용자들에게 푸시 메시지를 전송합니다.
즉시 발송 또는 예약 발송이 가능합니다.
POST
/send/user
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
user_ids
: 발송 대상 사용자 ID 배열([101, 102, ...])
-
필수
title
: 푸시 제목 -
필수
message
: 푸시 메시지 내용 -
선택
link
: 클릭 시 이동할 링크 (https://로 시작해야 함) -
선택
send_type
:immediate
(기본값) 또는scheduled
-
선택
scheduled_at
: 예약 발송 시간 (ISO 포맷, 예:2025-04-19T14:00:00
)
에러 응답 설명
{"success": false, "message": "링크는 https://로 시작해야 합니다."}
{"success": false, "message": "예약 시간은 현재보다 이후여야 합니다."}
{ "user_ids": [101, 102], "title": "알림 제목입니다", "message": "이것은 알림 메시지입니다.", "link": "https://example.com", "send_type": "immediate" }
{ "success": true, "message": "2건의 푸시가 전송되었습니다.", "push_group_id": 456, "total_count": 3, "success_count": 2, "fail_count": 1, "push": { "title": "알림 제목입니다", "message": "이것은 알림 메시지입니다.", "link": "https://example.com" } }
그룹 사용자 푸시 발송
선택한 그룹에 속한 모든 사용자에게 푸시 메시지를 전송합니다.
즉시 발송 또는 예약 발송이 가능합니다.
POST
/send/group
Authorization 헤더 (API Key)
요청 파라미터 (JSON)
-
필수
group_id
: 발송 대상 그룹 ID -
필수
title
: 푸시 제목 -
필수
message
: 푸시 메시지 내용 -
선택
link
: 클릭 시 이동할 링크 (https://로 시작해야 함) -
선택
send_type
:immediate
(기본값) 또는scheduled
-
선택
scheduled_at
: 예약 발송 시간 (ISO 포맷, 예:2025-04-19T14:00:00
)
에러 응답 설명
{"success": false, "message": "링크는 https://로 시작해야 합니다."}
{"success": false, "message": "예약 시간은 현재보다 이후여야 합니다."}
{ "group_id": 102, "title": "알림 제목입니다", "message": "이것은 그룹 알림 메시지입니다.", "link": "https://example.com", "send_type": "immediate" }
{ "success": true, "message": "2건의 푸시가 전송되었습니다.", "group_id": 102, "push_group_id": 457, "total_count": 3, "success_count": 2, "fail_count": 1, "push": { "title": "알림 제목입니다", "message": "이것은 알림 메시지입니다.", "link": "https://example.com" } }
발송 상태 보고
특정 push_group_id
에 대한 푸시 발송 결과를 요약 조회합니다.
총 발송 수, 성공 수, 실패 수, 실제 수신된 수, 수신 누락 수(성공했지만 수신확인 안된 건) 정보를 포함합니다.
GET
/report/summary
Authorization 헤더 (API Key)
쿼리 파라미터
-
필수
push_group_id
: 조회 대상 푸시 그룹 ID
에러 응답 설명
{ "success": true, "total": 1000, "success_count": 980, "fail_count": 20, "received_count": 0, "received_count": 760, "missed_count": 220 }
발송 결과 조회
지정된 push_group_id
에 대한 발송 결과 목록을 조회합니다.
각 항목에는 사용자 ID, 전화번호, 플랫폼, 성공 여부, 실패 사유, 발송일시 및 수신일시 정보가 포함됩니다.
결과는 페이징 처리되어 반환됩니다.
GET
/report/logs
Authorization 헤더 (API Key)
쿼리 파라미터
-
필수
push_group_id
: 조회 대상 푸시 그룹 ID -
선택
page
: 페이지 번호 (기본값: 1) -
선택
is_success
: 전송 성공 여부 ( Y [성공], N [실패] / 생략 시 전체 조회 )
에러 응답 설명
{"success": false, "error": "유효한 page 값을 입력하세요 (1 이상의 정수)."}
{ "success": true, "total": 3, "pagination": { "page": 1, "per_page": 20, "total_pages": 1 }, "push_group_id": 457, "is_success": null, "logs": [ { "push_log_id": 640, "user_id": "john123", "phone": "010-1234-5678", "platform": "web", "is_success": 1, "fail_reason": null, "sent_at": "2025-04-17 14:30", "received_at": "2025-04-17 14:30" }, { "push_log_id": 641, "user_id": "ascim13", "phone": "010-1542-7777", "platform": "web", "is_success": 1, "fail_reason": null, "sent_at": "2025-04-17 14:30", "received_at": null }, { "push_log_id": 642, "user_id": "kimtester", "phone": "010-0000-1111", "platform": "android", "is_success": 0, "fail_reason": "InvalidToken", "sent_at": "2025-04-17 14:31", "received_at": null } ] }
미수신 사용자 조회
push_group_id
에 포함된 사용자 중 푸시 전송은 성공했지만 수신 확인이 되지 않은 사용자 목록을 조회합니다.
결과는 페이징 처리되어 반환되며, 사용자 ID, 전화번호, 플랫폼, 메시지 ID, 발송일시 등을 포함합니다.
GET
/report/missed
Authorization 헤더 (API Key)
쿼리 파라미터
-
필수
push_group_id
: 조회 대상 푸시 그룹 ID -
선택
page
: 페이지 번호 (기본값: 1)
에러 응답 설명
{"success": false, "error": "유효한 page 값을 입력하세요 (1 이상의 정수)."}
{ "success": true, "total": 1, "pagination": { "page": 1, "per_page": 20, "total_pages": 1 }, "push_group_id": 457, "missed": [ { "push_log_id": 641, "user_id": "ascim13", "phone": "010-1542-7777", "platform": "web", "sent_at": "2025-04-17 14:31", "resend_at": null } ] }
미수신 푸시 재발송 Biz
발송에는 성공했지만 수신되지 않은 푸시 메시지를 다시 전송합니다.
재전송은 기존 발송 이력의 push_log_id
를 기반으로 수행되며, 발송 실패이거나 이미 수신된 푸시는 재전송할 수 없습니다.
POST
/report/resend/<push_log_id>
Authorization 헤더 (API Key)
에러 응답 설명
{"success": false, "error": "해당 푸시는 이미 수신되어 재전송할 수 없습니다."}
{"success": false, "error": "해당 사용자의 토큰이 없습니다."}
{ "success": true, "message": "푸시가 재전송되었습니다.", "push_group_id": 123, "sent_at": "2025-04-17 19:00", "push": { "title": "알림 제목입니다", "message": "푸시 메시지입니다.", "link": "https://example.com" } }