Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Push API는 푸시 메시지를 웹 애플리케이션에 푸시 서비스를 통해 전송할 수 있게 해줍니다. 애플리케이션 서버는 웹 애플리케이션이나 사용자 에이전트가 비활성 상태일 때에도 언제든지 푸시 메시지를 보낼 수 있습니다. 푸시 서비스는 사용자 에이전트에 신뢰성 있고 효율적으로 전달함을 보장합니다. 푸시 메시지는 웹 애플리케이션의 오리진에서 실행되는 서비스 워커에 전달되며, 메시지의 정보를 사용해 로컬 상태를 업데이트하거나 사용자에게 알림을 표시할 수 있습니다.
이 명세는 웹 푸시 프로토콜과 함께 사용하도록 설계되었으며, 애플리케이션 서버 또는 사용자 에이전트가 푸시 서비스와 어떻게 상호작용하는지 설명합니다.
이 섹션은 이 문서가 출판된 시점의 상태를 설명합니다. 최신 W3C 출판물 목록과 이 기술 보고서의 최신 개정본은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.
이 문서는 웹 애플리케이션 작업 그룹에서 권고 트랙을 사용하여 워킹 드래프트로 출판되었습니다.
워킹 드래프트로 출판된다고 해서 W3C와 회원의 승인이나 지지를 의미하지 않습니다.
이 문서는 초안이며, 언제든지 다른 문서로 업데이트, 대체, 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 인용하는 것은 적절하지 않습니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹 산출물과 관련하여 공개된 특허 목록을 유지하며, 해당 페이지에는 특허 공개 방법도 포함되어 있습니다. 개인이 본인 소유의 특허가 필수 청구항을 포함한다고 믿는 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.
이 문서는 2025년 8월 18일 W3C 프로세스 문서에 따라 관리됩니다.
이 섹션은 규범적이지 않습니다.
Push API를 사용하면 웹 애플리케이션이 사용자 에이전트와 비동기적으로 통신할 수 있습니다. 이를 통해 애플리케이션 서버는 사용자가 웹 애플리케이션을 열 때까지 기다리지 않고, 시간에 민감한 정보가 알려지는 즉시 사용자 에이전트에 해당 정보를 제공할 수 있습니다.
여기에서 정의한 바와 같이, 푸시 서비스는 언제든지 푸시 메시지를 전달하는 기능을 지원합니다.
특히 푸시 메시지는 해당 웹 애플리케이션이 현재 브라우저 창에서 활성 상태가 아니더라도 웹 애플리케이션에 전달됩니다. 이는 사용자가 웹 애플리케이션을 닫더라도 푸시 메시지가 수신될 때 웹 애플리케이션을 다시 시작할 수 있어 여전히 이점을 얻을 수 있는 사용 사례와 관련됩니다. 예를 들어 푸시 메시지는 수신 중인 WebRTC 통화를 사용자에게 알리는 데 사용될 수 있습니다.
사용자 에이전트가 일시적으로 오프라인 상태일 때도 푸시 메시지를 전송할 수 있습니다. 이를 지원하기 위해 푸시 서비스는 사용자 에이전트를 위한 메시지를 사용자 에이전트가 사용 가능해질 때까지 저장합니다. 이는 웹 애플리케이션이 사용자가 오프라인 상태인 동안 발생한 변경 사항을 파악하는 사용 사례를 지원하며, 사용자 에이전트에 관련 정보를 적시에 제공할 수 있도록 합니다. 푸시 메시지는 사용자 에이전트에 연결할 수 있게 되어 메시지를 전달할 수 있을 때까지 푸시 서비스에 의해 저장됩니다.
Push API는 사용자 에이전트가 웹 애플리케이션을 적극적으로 사용하고 있는 동안에도 푸시 메시지가 안정적으로 전달되도록 보장합니다. 예를 들어 사용자가 웹 애플리케이션을 적극적으로 사용하고 있거나 웹 애플리케이션이 활성 워커, 프레임 또는 백그라운드 창을 통해 애플리케이션 서버와 활발하게 통신하는 경우가 이에 해당합니다. 이는 Push API의 주된 사용 사례가 아닙니다. 웹 애플리케이션은 애플리케이션 서버와 지속적인 통신을 유지할 필요를 피하기 위해 빈도가 낮은 메시지에 Push API를 사용하도록 선택할 수 있습니다.
푸시 메시징은 사용자 에이전트와 웹 애플리케이션 사이에 활성 통신 채널이 아직 설정되어 있지 않은 경우에 가장 적합합니다. 푸시 메시지를 전송하려면 Fetch API 또는 [WebSockets]와 같은 보다 직접적인 통신 방법에 비해 훨씬 더 많은 리소스가 필요합니다. 푸시 메시지는 일반적으로 직접 통신보다 지연 시간이 길며 사용 제한이 적용될 수도 있습니다. 대부분의 푸시 서비스는 전송할 수 있는 푸시 메시지의 크기와 수량을 제한합니다.
웹 푸시 프로토콜 [RFC8030]은 사용자 에이전트 또는 애플리케이션 서버와 푸시 서비스 간의 통신을 가능하게 하는 프로토콜을 설명합니다. 다른 프로토콜을 대신 사용할 수도 있지만, 본 명세는 해당 프로토콜의 사용을 가정합니다. 대체 프로토콜도 호환되는 의미론을 제공해야 합니다.
Content-Encoding
HTTP 헤더는
[RFC9110]의 8.4절에서 설명하며,
push
message의 페이로드에 적용된 콘텐츠 코딩을 나타낸다.
애플리케이션 서버는 웹 애플리케이션의 서버 측 구성 요소를 의미합니다.
푸시 메시지는 애플리케이션 서버에서 웹 애플리케이션으로 전송되는 데이터입니다.
푸시 메시지는 해당 메시지가 제출된 활성 워커와 연결된 푸시 구독에 전달됩니다. 서비스 워커가 현재 실행 중이 아니면, 전달을 위해 워커가 시작됩니다.
선언적 푸시 메시지는 푸시 메시지이며, 데이터가 사용자 에이전트가 이해할 수 있는 JSON 문서입니다. 사용자 에이전트는 각 수신되는 푸시 메시지를 기회적으로 파싱하여, 선언적 푸시 메시지인지 선언적 푸시 메시지 파서를 통해 판단합니다.
선언적 푸시 메시지는 서비스 워커의 개입 없이 알림을 생성하고 표시할 수 있습니다. 그럼에도 불구하고, 애플리케이션 서버가 원하면 서비스 워커가 개입할 수 있습니다. 이러한 경우, 푸시 메시지의 선언적 특성은 예를 들어 저장소 압박으로 서비스 워커가 제거된 경우 백업 역할을 합니다. 또한 알림 데이터를 전달하는 보다 객체 지향적인 방법을 제공합니다.
{
"web_push": 8030,
"notification": {
"title": "Ada emailed ‘London’",
"lang": "en-US",
"dir": "ltr",
"body": "Did you hear about the tube strikes?",
"navigate": "https://email.example/message/12"
}
}
선언적 푸시 메시지는 다음과 같은 멤버를 갖습니다:
web_push (필수)
반드시 8030이어야 하는 정수입니다. 선언적 푸시 메시지와 다른 JSON 문서를 구분하는 데 사용합니다.
notification (필수)
다음과 같은 멤버로 구성된 JSON 객체이며, 모두 알림 API의 기능과 유사하지만 때로는 조금 더 엄격한 타입을 가집니다.
title을 제외한 모든 멤버는
NotificationOptions
딕셔너리에서 파생되었고, 동기화하여 유지해야 합니다. [NOTIFICATIONS]
title (필수)
문자열.
dir
"auto", "ltr", 또는 "rtl".
lang
언어 태그를 담는 문자열.
body
문자열.
navigate (필수)
URL을 담는 문자열.
tag
문자열.
image
URL을 담는 문자열.
icon
URL을 담는 문자열.
badge
URL을 담는 문자열.
vibrate
32비트 부호 없는 정수의 배열.
timestamp
renotify
불리언.
silent
불리언.
requireInteraction
불리언.
NotificationOptions
딕셔너리와 일관성을 위해 require_interaction이 아닌 이름을 사용합니다.
data
임의의 JSON 값.
actions
다음과 같은 멤버를 가진 JSON 객체의 배열로, 모두
NotificationAction
딕셔너리에서 파생되었고 동기화하여 유지해야 합니다.
action (필수)
문자열.
title (필수)
문자열.
navigate (필수)
URL을 담는 문자열.
icon
URL을 담는 문자열.
mutable
불리언. true일 때 Notification
객체를 포함하는 push 이벤트가 서비스 워커(있는 경우)로 전달됩니다.
이 객체는
선언적 푸시 메시지에 의해 기술됩니다.
선언적 푸시 메시지 파서 결과는 튜플이며, notification(알림)과 mutable(불리언)로 구성됩니다.
선언적 푸시 메시지 파서는 바이트 시퀀스
bytes, origin
origin, URL
baseURL, 그리고
EpochTimeStamp
fallbackTimestamp를 받아 아래 단계들을 실행합니다. 실패 또는
선언적 푸시 메시지 파서
결과를 반환합니다.
message를 JSON 바이트를 Infra 값으로 파싱의 결과로 합니다. 예외가 발생하면 실패를 반환합니다.
message가 map이 아니면 실패를 반환합니다.
message["web_push"]가 존재하지 않거나 8030이 아니면 실패를 반환합니다.
message["notification"]이 존재하지 않으면 실패를 반환합니다.
notificationInput을 message["notification"]으로 합니다.
notificationInput이 map이 아니면 실패를 반환합니다.
notificationInput["title"]이 존재하지 않거나 문자열이 아니면 실패를 반환합니다.
notificationInput["navigate"]이 존재하지 않거나 문자열이 아니면 실패를 반환합니다.
notificationTitle을 notificationInput["title"]으로 합니다.
notificationOptions를
NotificationOptions
딕셔너리로 합니다.
notificationInput["dir"]이 존재하고 "auto",
"ltr", "rtl" 중 하나라면,
notificationOptions["dir"]
에 notificationInput["dir"]을 설정합니다.
notificationInput["lang"]이 존재하고 문자열이면,
notificationOptions["lang"]
에 notificationInput["lang"]을 설정합니다.
notificationInput["body"]이 존재하고 문자열이면,
notificationOptions["body"]
에 notificationInput["body"]을 설정합니다.
notificationOptions["navigate"]
에 notificationInput["navigate"](변환됨)을 설정합니다.
notificationInput["tag"]이 존재하고 문자열이면,
notificationOptions["tag"]
에 notificationInput["tag"]을 설정합니다.
notificationInput["image"]이 존재하고 문자열이면,
notificationOptions["image"]
에 notificationInput["image"](변환됨)을 설정합니다.
notificationInput["icon"]이 존재하고 문자열이면,
notificationOptions["icon"]
에 notificationInput["icon"](변환됨)을 설정합니다.
notificationInput["badge"]이 존재하고 문자열이면,
notificationOptions["badge"]
에 notificationInput["badge"](변환됨)을 설정합니다.
notificationInput["vibrate"]가 존재하고 각 항목이
32비트
부호 없는 정수인 리스트라면,
notificationOptions["vibrate"]
에 notificationInput["vibrate"]을 설정합니다.
notificationInput["timestamp"]가 존재하고
64비트
부호 없는 정수라면,
notificationOptions["timestamp"]
에 notificationInput["timestamp"]을 설정합니다.
notificationInput["renotify"]가 존재하고 불리언이면,
notificationOptions["renotify"]
에 notificationInput["renotify"]을 설정합니다.
notificationInput["silent"]가 존재하고 불리언이면,
notificationOptions["silent"]
에 notificationInput["silent"]을 설정합니다.
notificationInput["requireInteraction"]가 존재하고 불리언이면,
notificationOptions["requireInteraction"]
에 notificationInput["requireInteraction"]을 설정합니다.
notificationInput["data"]가 존재하면,
notificationOptions["data"]
에 Infra
값을 JSON 호환 JavaScript 값으로 변환한 결과를 설정합니다.
notificationInput["actions"]가 존재하고 리스트라면:
notificationActions를 « »로 합니다.
각
actionInput에 대해
notificationInput["actions"]:
actionNavigate를
actionInput["navigate"](변환됨)으로
합니다.
notificationAction을 NotificationAction
딕셔너리로,
«[ "action"
→ actionInput["action"],
"title"
→ actionInput["title"],
"navigate"
→ actionNavigate ]»로 합니다.
actionInput["icon"]이 존재하고 문자열이면
notificationAction["icon"]
에 actionInput["icon"](변환됨)을
설정합니다.
Append notificationAction을 notificationActions에 추가합니다.
notificationOptions["actions"]
에 notificationActions을 설정합니다.
notification을 알림 생성의 결과로, notificationTitle, notificationOptions, origin, baseURL, fallbackTimestamp를 인자로 하여 생성합니다. 예외가 발생하면 실패를 반환합니다.
notification의 navigation URL이 null이면 실패를 반환합니다.
notification의 actions의 navigation URL 중 하나라도 null이면 실패를 반환합니다.
mutable을 false로 합니다.
message["mutable"]가 존재하고 불리언이면,
mutable을 message["mutable"]로 설정합니다.
(notification, mutable)을 반환합니다.
푸시 구독은 웹 애플리케이션을 대신하여 사용자 에이전트와 푸시 서비스 사이에 설정된 메시지 전달 컨텍스트입니다.
푸시 구독에는 연결된 범위가 있으며, 이는 URL입니다.
푸시 구독은 연결된 창에서 액세스 가능한 범위를 가진 것으로 간주되며, 이때 해당 범위의 경로는 목록이고 그 크기가 1이며, 범위의 경로[0]은 빈 문자열입니다.
푸시 구독에는 연결된 푸시 엔드포인트가 있습니다. 이는 푸시 서비스가 노출하며 애플리케이션 서버가 푸시 메시지를 보낼 수 있는 절대 URL이어야 합니다. 푸시 엔드포인트는 푸시 구독을 고유하게 식별해야 합니다.
푸시 구독에는 연결된 구독 만료 시간이 있을 수 있습니다. 설정된 경우, 이는 1970년 1월 1일 00:00:00 UTC 이후의 밀리초 단위 시간으로, 해당 구독이 비활성화되는 시간이어야 합니다. 사용자 에이전트는 구독이 만료되기 전에 푸시 구독을 갱신하려고 시도하는 것이 좋습니다.
푸시 구독에는 연결된 P-256 ECDH 키 쌍과 인증 비밀값이 [RFC8291]에 따라 연결되어 있다.
사용자 에이전트가 어떤 이유로든 푸시 구독의 키를 변경해야 하고 해당 푸시 구독의 연결된 서비스 워커 등록 이 null이 아닌 경우, 사용자 에이전트는 해당 갱신을 푸시 구독에 반드시 수행해야 한다.
푸시 구독을
생성하려면, PushSubscriptionOptionsInit
optionsDictionary가 주어졌을 때:
PushSubscription으로 한다.
PushSubscriptionOptions
객체로 하고, 해당 속성을
optionsDictionary의 대응하는 멤버와 값으로 초기화한다.
options 속성을 options로 설정한다.
applicationServerKey
속성이 설정되어 있다면 options의 해당 속성을
포함한다. 모든 예외는 다시
던진다.
endpoint 속성을
푸시
구독의 푸시 엔드포인트로 설정한다.
expirationTime을
설정한다.
푸시 구독의 연결된 서비스 워커 등록은 서비스 워커 등록 중 그 범위 URL이 동일한 푸시 구독의 범위와 동일한 것이며, 존재하는 경우에 해당하고; 그렇지 않으면 null입니다.
푸시 구독의 연결된 서비스 워커 등록은 다음 경우에만 null일 수 있습니다 해당 구독에 창에서 접근 가능한 범위가 있을 때입니다.
반대로, 서비스 워커 등록의 연결된 푸시 구독은 그 푸시 구독 중 그 범위가 동일한 서비스 워커 등록의 범위 URL과 동일한 것이며, 존재하는 경우에 해당하고; 그렇지 않으면 null입니다.
사용자 에이전트 또는 푸시 서비스는 할 수 있습니다 갱신할 수 있습니다. 푸시 구독의 연결된 서비스 워커 등록이 null이 아닌 경우 언제든지 예를 들어 일정한 기간이 지났기 때문에 갱신하도록 선택할 수 있습니다.
이 경우 사용자 에이전트는 반드시 푸시
구독을 생성하는 단계를, 현재 PushSubscriptionOptions을
생성할 때 제공된
현재 푸시 구독에 대해 실행하고, 새 푸시
구독의
범위를 원래 구독의 범위로 설정해야 합니다.
새 푸시 구독은 원래 구독과 다른
키 쌍을 반드시 가져야 합니다.
성공하면, 사용자 에이전트는 이어서 반드시
"pushsubscriptionchange"
이벤트를 발생시켜야 하며, 서비스 워커
등록 중 푸시
구독과 연결된 것을 registration으로, 초기
PushSubscription 인스턴스 중
푸시 구독을 나타내는 것을 oldSubscription으로, 그리고
PushSubscription
인스턴스 중 새 푸시 구독을 나타내는 것을
newSubscription으로 사용합니다.
변경 사항이 애플리케이션 서버에 전파될 시간을 주기 위해, 사용자 에이전트는 갱신 후 잠시 동안 이전 푸시 구독에 대한 메시지를 계속 수신할 수 있습니다. 갱신된 푸시 구독에 대한 메시지가 수신되면, 모든 이전 푸시 구독은 반드시 비활성화되어야 합니다.
사용자 에이전트가 푸시 구독을 갱신할 수
없는 경우, 주기적으로
갱신을 다시 시도해야 합니다. 푸시 구독을 더 이상
사용할 수
없게 된 경우, 예를 들어 만료된 경우, 사용자 에이전트는 반드시
"pushsubscriptionchange" 이벤트를 발생시켜야 합니다. 이때 서비스 워커
등록 중
푸시 구독과 연결된 것을 registration으로, PushSubscription
인스턴스 중 비활성화되는 푸시 구독을 나타내는 것을
oldSubscription으로
그리고 null을 newSubscription으로 사용합니다.
푸시 구독이 비활성화되면, 사용자 에이전트와 푸시 서비스는 반드시 저장된 해당 구독의 세부 정보 사본을 모두 삭제해야 합니다. 이후 이 푸시 구독에 대한 푸시 메시지는 절대로 전달되어서는 안 됩니다.
푸시 구독에 창에서 접근 가능한 범위가 없으면 반드시 연결된 서비스 워커 등록이 등록 해제될 때 비활성화되어야 하지만, 푸시 구독은 더 일찍 비활성화할 수 있습니다. 비활성화될 수 있습니다.
푸시 구독에 창에서 접근 가능한 범위가 없으면 서비스 워커 등록이 지워질 때 제거됩니다.
푸시 서비스라는 용어는 애플리케이션 서버가 웹 애플리케이션에 푸시 메시지를 보낼 수 있도록 하는 시스템을 의미합니다. 푸시 서비스는 자신이 제공하는 푸시 엔드포인트 또는 엔드포인트를 푸시 구독에 대해 제공합니다.
사용자 에이전트는 푸시 서비스에 연결하여 푸시 구독을 생성합니다. 사용자 에이전트는 사용 가능한 푸시 서비스의 선택을 제한할 수 있습니다 . 그 이유에는 서비스 가용성(특정 국가의 방화벽이나 직장 등의 네트워크에서 서비스가 차단되는지 여부를 포함합니다), 신뢰성, 배터리 수명에 미치는 영향과 같은 성능 관련 고려 사항과 메타데이터를 특정 푸시 서비스로 보내거나 보내지 않도록 하는 합의가 포함됩니다.
Push API는 강력한 기능이며, 이름은 "push"로 식별됩니다.
Permissions 명세와의 통합을 위해, 이 명세에서는 PushPermissionDescriptor permission descriptor
type을 정의합니다.
WebIDLdictionary PushPermissionDescriptor : PermissionDescriptor {
boolean userVisibleOnly = false;
};
userVisibleOnly는 userVisibleOnly와 동일한
의미를 가집니다.
{name: "push", userVisibleOnly: false}는 더 강력한 권한이며,
{name: "push", userVisibleOnly: true}보다 우선합니다.
푸시 메시지의 내용은 암호화됩니다 [RFC8291]. 그러나 푸시 서비스는 여전히 애플리케이션 서버가 푸시 구독을 통해 사용자 에이전트로 보내는 메시지의 메타데이터에 노출됩니다. 여기에는 메시지의 타이밍, 빈도 및 크기가 포함됩니다. 사용자 에이전트가 허용하지 않을 수 있는 푸시 서비스 변경 외에는 패딩을 통해 겉으로 보이는 메시지 크기를 늘리는 것만이 알려진 완화 방법입니다.
푸시 메시지가 웹 애플리케이션과 동일한 출처를 가진 애플리케이션 서버에서 전송되었다는 보장은 없습니다. 애플리케이션 서버는 자신의 재량으로 푸시 구독을 사용하는 데 필요한 세부 정보를 제3자와 공유할 수 있습니다.
다음 요구 사항은 사용자의 개인정보 보호와 보안을 가능한 한 최대한 보호하고, 그 목표를 충족하는 범위에서 애플리케이션 서버와 사용자 간 통신의 무결성을 보호하기 위한 것입니다.
Push API는 개발자가 제공한 이벤트 핸들러를 실행하기 위해 서비스 워커 등록과 연결된 Service Worker를 활성화해야 할 수 있습니다. 이로 인해 네트워크 트래픽과 같은 리소스 사용이 발생할 수 있으며, 사용자 에이전트는 이를 다음 애플리케이션에 귀속하면 좋습니다: 푸시 구독을 생성한 웹 애플리케이션.
사용자
에이전트는 권한을 획득하거나 권한 상태를 결정할 때 PushSubscriptionOptions을 고려할 수 있습니다.
권한이 취소되면, 사용자 에이전트는 해당 권한으로 생성된 구독에 대해 다음 이벤트를 발생시킬 수
있습니다
"pushsubscriptionchange" 이벤트를 발생시키며, 이때
서비스 워커
등록 중 푸시 구독과 연결된 것을
registration으로, PushSubscription 인스턴스 중
푸시 구독을 나타내는 것을
oldSubscription으로, null을 newSubscription으로 사용합니다. 사용자
에이전트는 반드시
영향을 받는 구독을 병렬로 비활성화해야 합니다.
푸시 엔드포인트는 절대로 사용자의 정보를 푸시 서비스 이외의 행위자가 사용자의 기기, 신원 또는 위치 등으로부터 추론할 수 있도록 노출해서는 안 됩니다. 정확한 요구 사항은 [RFC8030]의 개인정보 보호 고려 사항을 참조하십시오.
비활성화된 푸시 구독의 푸시 엔드포인트는 새 푸시 구독에 재사용해서는 안 됩니다. 이는 사용자가 제거할 수 없는 영구 식별자가 생성되는 것을 방지합니다. 또한 한 푸시 구독의 세부 정보를 재사용하여 다른 푸시 메시지를 보내는 것도 방지합니다 푸시 구독으로.
이 섹션은 규범적이지 않습니다.
푸시 메시지는 애플리케이션 서버에서 웹 애플리케이션으로 다음과 같이 전송됩니다:
이 전체 프레임워크를 통해 애플리케이션 서버는 서비스 워커를 애플리케이션 서버의 이벤트에 응답하여 활성화할 수 있습니다. 이러한 이벤트에 대한 정보는 푸시 메시지에 포함될 수 있으며, 이를 통해 웹 애플리케이션은 네트워크 요청을 시작할 필요 없이 이러한 이벤트에 적절하게 대응할 수 있습니다.
아래 코드와 다이어그램은 Push API의 가상 사용 예를 보여줍니다.
이 섹션은 규범적이지 않습니다.
// https://example.com/serviceworker.js
this.onpush = event => {
console.log(event.data);
// 여기에서 데이터를 IndexedDB에 저장하거나, 열린 윈도우에 보내거나, 알림을 표시할 수 있습니다.
}
// https://example.com/webapp.js
// 비동기 함수 내부...
try {
const serviceWorkerRegistration = await navigator.serviceWorker.register(
"serviceworker.js"
);
const pushSubscription = await serviceWorkerRegistration.pushManager.subscribe();
// 애플리케이션 서버에 필요한 푸시 구독 정보가
// 이제 사용 가능하며, 예를 들어 XMLHttpRequest로 서버에 전송할 수 있습니다.
console.log(pushSubscription.endpoint);
console.log(pushSubscription.getKey("p256dh"));
console.log(pushSubscription.getKey("auth"));
} catch (err) {
// 프로덕션 환경에서는 에러 정보를
// 애플리케이션 서버에 보고하는 것도 의미 있을 수 있습니다.
console.log(error);
}
이 섹션은 규범적이지 않습니다.
PushSubscription에 포함된 필드는
애플리케이션 서버가 푸시 메시지를 보내는 데 필요한 모든
정보를 담고 있습니다.
Push API와 호환되는 푸시 서비스는 웹 푸시 프로토콜을 준수하는 푸시 엔드포인트를 제공합니다. 이러한
파라미터와 속성에는 다음과 같은 항목이 포함됩니다:
PushSubscription의 URL이며,
애플리케이션 서버가 푸시 메시지를 웹
애플리케이션에 전달하도록 요청할 수 있게 합니다.
getKey() 메서드는 PushSubscription에서
푸시 메시지를 암호화하고 인증하는 데 사용되는 키 자료를 가져오는 데 사용됩니다.
이 함수는
호출될 때마다 해당 키의 값을
포함하는 새로운 ArrayBuffer를 반환하며,
식별된 키가 존재하지 않으면 null을 반환합니다. 값
"p256dh"를 전달하면 타원 곡선
디피-헬먼(ECDH) 공개 키를
푸시 구독과 연결된 것으로 가져옵니다.
auth 값을 전달하면 애플리케이션 서버가
메시지를 인증하는 데 사용하는 인증 비밀값이 반환됩니다. 이러한 키는 애플리케이션
서버에서
푸시 구독의 메시지를 암호화하고 인증하는 데 사용되며,
이는
[RFC8291]에 설명되어 있습니다.
본 명세는 Window와
ServiceWorkerRegistration
객체에 대해
PushManagerAttribute 믹스인을 확장합니다.
[HTML]
[SERVICE-WORKERS]
WebIDL[SecureContext]
interface mixin PushManagerAttribute {
readonly attribute PushManager pushManager;
};
Window includes PushManagerAttribute;
ServiceWorkerRegistration includes PushManagerAttribute;
Window와
ServiceWorkerRegistration
객체는 연관된 PushManager
객체를 가집니다.
pushManager
getter의 단계는 this의 연관된
PushManager
객체를 반환하는 것입니다.
Window
객체에서 PushManager의 service worker registration은 null입니다.
ServiceWorkerRegistration
객체에서 PushManager의 service worker registration은
서비스 워커
등록 객체가 나타내는
ServiceWorkerRegistration
객체입니다.
PushManager 인터페이스는
푸시
서비스에 액세스하기 위한 작업을 정의합니다.
WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushManager {
[SameObject] static readonly attribute FrozenArray<DOMString> supportedContentEncodings;
Promise<PushSubscription> subscribe(optional PushSubscriptionOptionsInit options = {});
Promise<PushSubscription?> getSubscription();
Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
};
PushManager에는 연결된 서비스 워커
등록이 있으며, 이는 null이거나 서비스 워커
등록입니다.
supportedContentEncodings 속성은 푸시 메시지의 페이로드를 암호화하는 데 사용할
수 있는 지원되는
콘텐츠 코딩의 시퀀스를
노출합니다. 콘텐츠
코딩은 푸시
서비스에 푸시 메시지의 전송을 요청할 때 Content-Encoding 헤더 필드를 사용하여 표시됩니다.
사용자
에이전트는 [RFC8291]에 정의된 aes128gcm 콘텐츠 코딩을
반드시 지원해야 하며,
호환성을
위해 초안의 이전 버전에 정의된 콘텐츠 코딩을 지원할 수 있습니다.
subscribe() 메서드 단계는 다음과 같습니다:
/" 및
global의 연결된
Document의 URL과 함께 실행한 결과로 설정합니다.
https"가 아니면,
다음을 수행합니다
전역
태스크를 큐에 넣습니다. 네트워킹
태스크 소스에서 global을 사용하여 거부하도록
promise를 "NotAllowedError" DOMException으로 설정하고
이 단계들을 종료합니다.
userVisibleOnly"]
이 false이고 사용자
에이전트가 true일 것을 요구하면, 전역
태스크를 큐에 넣습니다. 네트워킹
태스크 소스에서 global을 사용하여 거부하도록 promise를 "NotAllowedError"
DOMException으로 설정하고
이 단계들을 종료합니다.
applicationServerKey"]
이 null이고
푸시 서비스가 null이 아니어야 한다고 요구하면, 전역
태스크를 큐에 넣습니다.
네트워킹
태스크 소스에서 global을 사용하여 거부하도록 promise를
"NotSupportedError" DOMException으로 설정하고
이 단계들을 종료합니다.
applicationServerKey"]
이 null이 아니면:
applicationServerKey"]
이 문자열이면,
그 값을 ArrayBuffer로
설정하며, 여기에는
options["applicationServerKey"]
을
base64url 인코딩 [RFC7515]으로 디코딩하여 얻은 옥텟 시퀀스가 포함됩니다.
InvalidCharacterError"
DOMException
으로 설정하고 이 단계들을 종료합니다.
applicationServerKey"]
이
P-256 곡선의 유효한 점을 나타내는지 확인합니다. 값이 유효하지 않으면, 전역
태스크를 큐에 넣습니다.
네트워킹
태스크 소스에서 global을 사용하여 거부하도록 promise를
"InvalidAccessError"
DOMException
으로 설정하고 이 단계들을 종료합니다.
InvalidStateError"
DOMException
으로 설정하고
이 단계들을 종료합니다.
denied"이면,
전역
태스크를 큐에 넣습니다.
사용자
상호작용 태스크 소스에서 global을 사용하여 거부하도록 promise를
"NotAllowedError"
DOMException
으로 설정하고 이 단계들을 종료합니다.
AbortError"
DOMException
으로 설정하고 이 단계들을 종료합니다.
options 속성과 비교합니다.
BufferSource
값의 내용은
참조가
아니라 동등성을 기준으로 비교합니다.
InvalidStateError"
DOMException
으로 설정하고 이 단계들을 종료합니다.
PushSubscription 중
subscription에 대응하는 것으로 설정합니다.
getSubscription() 메서드의 단계는 다음과 같습니다:
/" 및 global의
연결된
Document의 URL과 함께 실행한 결과로 설정합니다.
DOMException
으로 거부하며, 그 이름은 "AbortError"이고
이 단계들을 종료합니다.
PushSubscription 중
subscription에 대응하는 것으로 이행합니다.
permissionState() 메서드 단계는 다음과 같다:
promise를 새로운 프로미스로 한다.
병렬로:
state를 "push"의 권한 상태로 한다.
전역 태스크를 큐에 할당한다. 네트워킹 태스크 소스에서 global로 promise를 state로 resolve한다.
promise를 반환한다.
푸시 서비스를 사용할 권한은 영속적일 수 있으며, 유효한 권한이 있으면 이후 구독에 대해 다시 확인할 필요가 없습니다.
권한이 필요하다면 반드시 subscribe() 메서드를 호출하여 요청해야
합니다.
WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushSubscriptionOptions {
readonly attribute boolean userVisibleOnly;
[SameObject] readonly attribute ArrayBuffer? applicationServerKey;
};
userVisibleOnly 속성은 get 시 초기화된 값을 반환합니다.
applicationServerKey 속성은 get 시 초기화된 값을 반환합니다.
존재하는 경우, applicationServerKey
값에는 반드시 [DSS]에서 정의된 P-256 타원 곡선의 점이
포함되어야 하며,
인코딩은 [ANSI-X9-62]
부록 A에서 설명된 미압축(uncompressed) 형식(즉, 0x04 옥텟으로 시작하는 65 옥텟)이어야 한다. DOMString으로 제공되는 경우, 해당 값은 반드시
[RFC7515]에 따라 base64url 인코딩으로 인코딩되어야 한다.
사용자 에이전트는 필요에 따라
applicationServerKey
가 존재하지 않고, push
service가 동작상 필요로 하는 경우 구독 시도를 거부할 수 있다.
applicationServerKey
값은 [RFC8291]에서 메시지 암호화에 사용된 값과 반드시 달라야 한다.
WebIDLdictionary PushSubscriptionOptionsInit {
boolean userVisibleOnly = false;
(BufferSource or DOMString)? applicationServerKey = null;
};
userVisibleOnly 멤버는,
true로 설정된 경우 푸시
구독이 그 효과가 사용자에게 표시되는 푸시 메시지에만 사용됨을 나타냅니다
예를 들어 Web Notification을 표시하는 경우입니다. [NOTIFICATIONS]
PushSubscriptionOptionsInit은
추가 옵션을 나타내며, 다음과 연결됩니다:
푸시 구독. 사용자 에이전트는 그 재량에 따라
이러한 옵션을
사용자에게 명시적
권한을 요청할 때 고려할 수 있습니다.
옵션이 고려되는 경우,
사용자
에이전트는 수신되는 푸시 메시지에 해당 옵션을 적용하면 좋습니다.
이러한 옵션은 선택 사항이며, 사용자 에이전트는 할 수 있습니다 다음 중 일부만 지원하도록 선택할 수 있습니다. 사용자 에이전트는 지원하지 않는 옵션을 노출해서는 안 됩니다 .
일단 설정되면, 푸시 구독의 옵션은 변경할 수 없습니다. 기존 푸시
구독은 unsubscribe를 통해 구독 해제하여,
새 옵션을 가진 푸시 구독을 생성할 수 있습니다.
applicationServerKey 멤버는 사용자
에이전트가
푸시
서비스와 푸시 구독을 설정할 때 사용됩니다.
applicationServerKey
옵션에는 다음을 위한 타원 곡선 공개
키가 포함됩니다: 애플리케이션 서버. 이는 해당 애플리케이션 서버가
이 푸시
구독에 푸시 메시지를 보낼 때 [RFC8292]에 정의된 대로 자신을
인증하는 데 사용할 키입니다;
푸시
서비스는 해당 개인 키가
인증 토큰을 생성하는 데 사용되지 않으면 모든
푸시
메시지를 거부합니다.
PushSubscription 객체는 푸시 구독을 나타냅니다.
WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushSubscription {
readonly attribute USVString endpoint;
readonly attribute EpochTimeStamp? expirationTime;
[SameObject] readonly attribute PushSubscriptionOptions options;
ArrayBuffer? getKey(PushEncryptionKeyName name);
Promise<boolean> unsubscribe();
PushSubscriptionJSON toJSON();
};
dictionary PushSubscriptionKeys {
USVString p256dh;
USVString auth;
};
dictionary PushSubscriptionJSON {
USVString endpoint;
EpochTimeStamp? expirationTime = null;
PushSubscriptionKeys keys;
};
endpoint 속성을 가져올 때, 사용자 에이전트는 반드시
푸시
엔드포인트 중 푸시 구독과 연결된 것을 반환해야 합니다. 사용자
에이전트는
반드시 입력에 종속된 분기를 포함하지 않는 직렬화 방법을 사용해야 합니다
(즉,
상수 시간인 방법입니다).
expirationTime 속성을 가져올 때, 사용자
에이전트는 반드시
푸시 구독과 연결된 구독 만료 시간이
있으면 이를 반환하고, 그렇지 않으면 null을 반환해야 합니다.
options 속성을 가져올 때, 사용자 에이전트는 반드시
PushSubscriptionOptions 객체 중
푸시
구독과 연결된 옵션을 나타내는 것을 반환해야 합니다.
getKey(name)
메서드의 단계는 다음과 같습니다:
ArrayBuffer 객체로 둡니다.
p256dh"이면:
unsubscribe() 메서드는 호출되면 반드시
다음 단계들을 실행해야 합니다:
false로 이행하고 이 단계들을 종료합니다.
true로 이행합니다.
toJSON() 메서드는 호출되면 반드시
다음 단계들을 실행해야 합니다:
PushSubscriptionJSON 딕셔너리로 둡니다.
endpoint 속성을 가져온 결과로 설정합니다
this의.
expirationTime 결과로 설정합니다 this의.
PushSubscriptionKeys 딕셔너리로 둡니다.
getKey("p256dh")가
반환한 값을,
USVString으로.
getKey("auth")가
반환한 값을,
USVString으로.
PushSubscriptionJSON 딕셔너리는
PushSubscription의 JSON 타입을 나타냅니다. ECMAScript에서는 이를
JSON.stringify()
함수를 통해 JSON 문자열로 변환할 수 있습니다.
keys 레코드는 지원되는 각
PushEncryptionKeyName
항목에 대해 그 값을 URL-safe base64로 인코딩한
표현 [RFC4648]의 항목을 포함합니다.
PushSubscription의 옵션은
직렬화되지 않는다는 점에 유의하십시오.
푸시
메시지 암호화에 사용되는 암호화 키는 웹 애플리케이션에
getKey() 메서드 또는
PushSubscription의 직렬화기를 통해 제공됩니다. 각 키의 이름은
PushEncryptionKeyName
열거형의 값을 사용하여 지정됩니다.
WebIDLenum PushEncryptionKeyName {
"p256dh",
"auth"
};
p256dh 값은 [RFC8291]에 기술된 P-256 ECDH 디피-헬만 공개키를 가져오는 데 사용됩니다.
auth 값은 [RFC8291]에 기술된 인증 시크릿을
가져오는 데 사용됩니다.
WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushMessageData {
ArrayBuffer arrayBuffer();
Blob blob();
Uint8Array bytes();
any json();
USVString text();
};
PushMessageData 객체는 생성될 때 bytes (바이트 시퀀스)를 갖으며, 이는 생성 시 설정됩니다.
arrayBuffer() 메서드는 ArrayBuffer 객체를 반환하며,
내용은 this의 bytes입니다. ArrayBuffer 객체 생성 중 발생한 예외는
재throw됩니다.
blob() 메서드는 Blob 객체를 새로 반환하며,
내용은 this의 bytes입니다.
bytes() 메서드는 Uint8Array
객체를 새로 반환하며,
내부적으로 ArrayBuffer의 내용은
this의 bytes입니다. ArrayBuffer 객체 생성 중 발생한 예외는
재throw됩니다.
json() 메서드는 JSON 바이트를 자바스크립트 값으로
파싱한 결과를 this의 bytes에 대해 반환합니다.
text() 메서드는 UTF-8 디코드 결과를 this의 bytes에 대해 반환합니다.
object에서 바이트 시퀀스를 추출하려면 다음 단계를 실행합니다:
BufferSource
USVString
Service Worker 명세는 ServiceWorkerGlobalScope
인터페이스를 정의합니다
[SERVICE-WORKERS] 이 명세는 해당 인터페이스를 확장합니다.
WebIDL[Exposed=ServiceWorker, SecureContext]
partial interface ServiceWorkerGlobalScope {
attribute EventHandler onpush;
attribute EventHandler onpushsubscriptionchange;
};
onpush 속성은 이벤트 핸들러
IDL 속성이며,
해당 이벤트 핸들러 이벤트
타입은 "push"입니다. "push" 이벤트는 푸시 메시지가 푸시 구독에 수신되었음을 나타냅니다.
onpushsubscriptionchange 속성은 이벤트 핸들러
IDL
속성이며, 해당 이벤트 핸들러 이벤트
타입은
"pushsubscriptionchange"입니다.
WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushEvent : ExtendableEvent {
constructor(DOMString type, optional PushEventInit eventInitDict = {});
readonly attribute PushMessageData? data;
readonly attribute Notification? notification;
};
dictionary PushEventInit : ExtendableEventInit {
PushMessageDataInit? data = null;
Notification? notification = null;
};
typedef (BufferSource or USVString) PushMessageDataInit;
PushEvent
인터페이스 또는 PushEvent 인터페이스를
상속하는 인터페이스의 constructor가 호출되면, 일반적인 이벤트
구성
단계에 다음 단계가 포함되도록 확장됩니다:
data 멤버가 없으면, 이벤트의 data 속성에 null을
할당하고 이 단계를 종료합니다.data" 멤버에서 바이트 시퀀스를 추출한 결과로 설정합니다.data 속성에 PushMessageData 인스턴스를 새로 생성하여, bytes를 b로 할당합니다.
data 속성은 초기화된
값을 반환해야 합니다.
notification 속성은 초기화된 값을 반환해야 합니다.
사용자 에이전트가 푸시 메시지를 푸시 서비스로부터 수신하면, 다음 단계를 반드시 실행해야 합니다.
registration을 subscription의 연결된 서비스 워커 등록으로 설정합니다.
bytes를 null로 설정합니다.
푸시 메시지에 페이로드가 포함되어 있으면:
bytes가 null이 아니면:
baseURL을 subscription의 범위로 설정합니다.
origin을 baseURL의 출처로 설정합니다.
fallbackTimestamp를 현재 거칠게 조정된 벽시계 시간으로 설정합니다.
declarativeResult를 bytes, origin, baseURL 및 fallbackTimestamp가 주어졌을 때 선언적 푸시 메시지 파서를 실행한 결과로 설정합니다.
declarativeResult가 실패가 아니면:
notification을 declarativeResult의 알림으로 설정합니다.
notification의 서비스 워커 등록을 registration으로 설정합니다.
notificationShown을 false로 설정합니다.
declarativeResult의 변경 가능 여부가 true이고 registration이 null이 아니면:
result를 registration, null 및
notification을 나타내는 새로운 Notification
객체가 주어졌을 때 푸시 이벤트를
발생시킨
결과로 설정합니다.
result가 실패가 아니면, notificationShown을 result의 알림 표시 여부로 설정합니다.
notificationShown이 false이면, 알림 표시 단계를 notification 및 null과 함께 실행합니다.
registration이 null이면 이 단계를 중단합니다.
data를 바이트가
bytes가 null이 아닌 경우 bytes이고, 그렇지 않으면 null인 새로운 PushMessageData 객체로 설정합니다.
result를 registration, data 및 null이 주어졌을 때 푸시 이벤트를 발생시킨 결과로 설정합니다.
result가 실패이고 동일한 푸시 메시지가 서비스 워커 등록에 여러 번 전달되었지만 매번 실패했다면, 확인 처리를 푸시 메시지에 수행합니다.
푸시 이벤트 결과는 알림 표시 여부(불리언)로 구성된 튜플입니다.
서비스 워커
등록 registration,
PushMessageData 객체 또는 null인 data,
그리고 알림 또는 null인
notification이 주어졌을 때 푸시
이벤트를 발생시키려면 다음 단계를 실행합니다. 이 단계는 실패 또는 푸시 이벤트
결과를 반환합니다.
notificationResult를 null로 설정합니다.
registration의 showNotification()이
성공적으로 호출되었는지 여부를 false로 설정합니다.
다음 속성을 사용하여 registration에서 PushEvent를 사용하는
"push"라는 이름의 기능
이벤트를 발생시킵니다:
data
notification
그런 다음 dispatchedEvent와 함께 다음 단계를 병렬로 실행합니다:
dispatchedEvent의 수명 연장 프로미스에 있는 모든 프로미스가 해결될 때까지 기다립니다.
이들이 성공적으로 해결되지 않으면 notificationResult를 실패로 설정합니다.
그렇지 않으면 notificationResult를 registration의 showNotification()이
성공적으로 호출되었는지 여부로 설정합니다.
notificationResult가 null이 아니게 될 때까지 기다립니다.
notificationResult가 실패이면 실패를 반환합니다.
(notificationResult)를 반환합니다.
푸시 메시지를 승인한다는 것은 푸시 메시지 pushMessage가 주어졌을 때 pushMessage의 수신을 [RFC8030]에 따라 승인하는 것을 의미합니다.
푸시 메시지를 승인하면 푸시 서비스가 전달을 중지하고 메시지 전달 성공을 애플리케이션 서버에 보고합니다. 이는 동일한 푸시 메시지가 푸시 서비스에 의해 무기한 재시도되는 것을 방지합니다.
또한 승인한다는 것은 애플리케이션 서버가 잘못하여 푸시 메시지가 성공적으로 전달되었음을 나타내는 전달 확인을 받을 수도 있음을 의미합니다. 따라서 승인하기 전에 여러 번의 거부를 허용해야 합니다; 최소 세 번의 시도를 허용하는 것이 권장됩니다.
pushsubscriptionchange 이벤트는 푸시 구독의 변경을 나타냅니다 이는 애플리케이션의 제어 외부에서 발생한 것으로, 예를 들어 해당 구독이 갱신되거나, 취소되거나, 손실되었기 때문입니다.
"pushsubscriptionchange" 이벤트를 발생시키려면, 서비스 워커
등록 registration, newSubscription 및
oldSubscription이 주어졌을 때, 사용자
에이전트는 기능 이벤트를 발생시켜야 합니다
이름이 "pushsubscriptionchange"인 이벤트를
PushSubscriptionChangeEvent를 사용하여
registration에서 다음 속성과 함께 발생시킵니다:
newSubscription
oldSubscription
[WEB-BACKGROUND-SYNC]와 같은 더 신뢰할 수 있는 동기화 메커니즘을 사용하는 것을 고려하십시오 새 푸시 구독의 세부 정보를 애플리케이션 서버로 보낼 때 사용하십시오. 사용자는 신뢰할 수 없는 네트워크 환경에 놓일 수 있으며, 이로 인해 fetch가 실패할 수 있습니다.
WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushSubscriptionChangeEvent : ExtendableEvent {
constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {});
readonly attribute PushSubscription? newSubscription;
readonly attribute PushSubscription? oldSubscription;
};
newSubscription 속성은 get 시 초기화된 값을 반환합니다.
oldSubscription 속성은 get 시 초기화된 값을 반환합니다.
WebIDLdictionary PushSubscriptionChangeEventInit : ExtendableEventInit {
PushSubscription newSubscription = null;
PushSubscription oldSubscription = null;
};
newSubscription 멤버는 푸시 구독의 세부 정보를
나타내며,
pushsubscriptionchange 이벤트가 호출될 때 유효합니다.
새 푸시 구독을 설정할 수 없는 경우 값은
null이 됩니다. 예를 들어
웹 애플리케이션이 명시적 권한을 상실한 경우입니다.
oldSubscription 멤버는 더 이상 사용해서는
안 되는 푸시 구독의 세부 정보를 나타냅니다. 사용자 에이전트가
전체 세부 정보 집합을
제공할 수 없는 경우 값은 null이 됩니다. 예를 들어 데이터베이스가 부분적으로 손상된 경우입니다.
Push API는 푸시 서비스에서 받은 데이터를 직접적으로 표시하는 방법을 제공하지 않습니다. 대신 Push API는 다른 API, 주로 Notifications API Standard에 의존하여 사용자가 정보를 확인할 수 있게 합니다. 따라서 Push API 자체에는 접근성 요구사항이 없습니다. 하지만 [NOTIFICATIONS] 등 명세에서는 알림을 접근성 있게 표시하는 방법에 대한 가이드라인을 제공합니다.
또한, 접근성 있는 인터페이스를 제공하려면 푸시 메시지가 전달할 수 있는 것보다 더 많은 정보를 전달해야 할 수도 있습니다. 푸시 메시지는 소량의 콘텐츠나 식별자를 전달하는 데 가장 적합합니다. 더 큰 리소스는 서버에서 따로 가져와야 합니다.
비규범 섹션뿐만 아니라, 이 명세에 포함된 모든 작성 지침, 도표, 예시, 비고는 모두 비규범적입니다. 이 명세의 그 밖의 모든 내용은 규범적입니다.
이 문서에서 MAY, MUST, MUST NOT, SHOULD, SHOULD NOT과 같은 핵심 단어는 BCP 14 [RFC2119] [RFC8174] 에서 설명된 대로 해석되어야 하며, 반드시 대문자로 표시된 경우에만 해당합니다.
이 명세는 하나의 제품에 적용되는 준수 기준을 정의합니다. 즉, 이 명세에 포함된 인터페이스를 구현하는 사용자 에이전트가 그 대상입니다.
WebIDLdictionary PushPermissionDescriptor : PermissionDescriptor {
boolean userVisibleOnly = false;
};
[SecureContext]
interface mixin PushManagerAttribute {
readonly attribute PushManager pushManager;
};
Window includes PushManagerAttribute;
ServiceWorkerRegistration includes PushManagerAttribute;
[Exposed=(Window,Worker), SecureContext]
interface PushManager {
[SameObject] static readonly attribute FrozenArray<DOMString> supportedContentEncodings;
Promise<PushSubscription> subscribe(optional PushSubscriptionOptionsInit options = {});
Promise<PushSubscription?> getSubscription();
Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
};
[Exposed=(Window,Worker), SecureContext]
interface PushSubscriptionOptions {
readonly attribute boolean userVisibleOnly;
[SameObject] readonly attribute ArrayBuffer? applicationServerKey;
};
dictionary PushSubscriptionOptionsInit {
boolean userVisibleOnly = false;
(BufferSource or DOMString)? applicationServerKey = null;
};
[Exposed=(Window,Worker), SecureContext]
interface PushSubscription {
readonly attribute USVString endpoint;
readonly attribute EpochTimeStamp? expirationTime;
[SameObject] readonly attribute PushSubscriptionOptions options;
ArrayBuffer? getKey(PushEncryptionKeyName name);
Promise<boolean> unsubscribe();
PushSubscriptionJSON toJSON();
};
dictionary PushSubscriptionKeys {
USVString p256dh;
USVString auth;
};
dictionary PushSubscriptionJSON {
USVString endpoint;
EpochTimeStamp? expirationTime = null;
PushSubscriptionKeys keys;
};
enum PushEncryptionKeyName {
"p256dh",
"auth"
};
[Exposed=ServiceWorker, SecureContext]
interface PushMessageData {
ArrayBuffer arrayBuffer();
Blob blob();
Uint8Array bytes();
any json();
USVString text();
};
[Exposed=ServiceWorker, SecureContext]
partial interface ServiceWorkerGlobalScope {
attribute EventHandler onpush;
attribute EventHandler onpushsubscriptionchange;
};
[Exposed=ServiceWorker, SecureContext]
interface PushEvent : ExtendableEvent {
constructor(DOMString type, optional PushEventInit eventInitDict = {});
readonly attribute PushMessageData? data;
readonly attribute Notification? notification;
};
dictionary PushEventInit : ExtendableEventInit {
PushMessageDataInit? data = null;
Notification? notification = null;
};
typedef (BufferSource or USVString) PushMessageDataInit;
[Exposed=ServiceWorker, SecureContext]
interface PushSubscriptionChangeEvent : ExtendableEvent {
constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {});
readonly attribute PushSubscription? newSubscription;
readonly attribute PushSubscription? oldSubscription;
};
dictionary PushSubscriptionChangeEventInit : ExtendableEventInit {
PushSubscription newSubscription = null;
PushSubscription oldSubscription = null;
};
편집자들은 Firefox OS 푸시 메시지 솔루션을 구현한 Mozilla 및 Telefónica Digital 팀에 감사를 표하며, 이 문서에 중요한 기술적 기여를 해주신 다음 분들께도 깊은 감사의 뜻을 전합니다: Antonio Amaya, Miguel García Arribas, Ben Bangert, Kit Cambridge, José Manuel Cantera, JR Conlin, Albert Crespell, Matt Gaunt, Phil Jenvey, Guillermo López, Nikhil Marathe, John Mellor, Pınar Özlen, Fernando R. Sela, Shijun Sun, Doug Turner.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: