/
562.txt
387 lines (312 loc) · 14.4 KB
/
562.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
[21]
[DFN[[RUBYB[プッシュメッセージ][push message]]]]は、
[[プッシュ配信]]されるメッセージです。
* 仕様書
[REFS[
- [1] [CITE@en[RFC 8030 - Generic Event Delivery Using HTTP Push]], [TIME[2020-03-09 00:13:33 +09:00]] <https://tools.ietf.org/html/rfc8030>
- [20] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dfn-push-message>
- [24] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dom-pushmanager-supportedcontentencodings>
- [28] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#pushmessagedata-interface>
- [23] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#events>
]REFS]
* 意味
[2]
[[Web Push]] の定義では、
[DFN[[RUBYB[プッシュメッセージ][push message]]]]は、
[[アプリケーションサーバー]]から[[利用者エージェント]]へと[[プッシュサービス]]を介して送られる[[メッセージ]]です。
[SRC[>>1 1.1.]]
[22]
[[Push API]] の定義では、
[DFN[[RUBYB[プッシュメッセージ][push message]]]]は[[アプリケーションサーバー]]から
[[Webアプリケーション]]に送信されるデータです。
[SRC[>>20]]
[3]
[[RFC 8030]] がただ「message」とのみ書いているときでも、多くは[[プッシュメッセージ]]とみられます。
* 状態
[6] [[プッシュメッセージ]]は、それが送信された (受信した) こと自体が情報になります。
それに加えて、付随する情報がいくつかあります。
[FIG(list members)[ [38] [[プッシュメッセージ]]
: [F[有効期限][TTL (プッシュメッセージ)]] :
[[プッシュメッセージ]]には、
必ず有効期限があります。
[[アプリケーションサーバー]]は、
[CODE[TTL:]]
[[HTTPヘッダー]]で有効期限を指定できます。
期限到来後、未配送の[[プッシュメッセージ]]は捨てられます。
同時に[[プッシュメッセージ資源]]も削除されるかもしれません。
([[アプリケーションサーバー]]が指定し、
[[プッシュサービス]]が適宜修正します。)
: [F[緊急度][Urgency (プッシュメッセージ)]] :
[[アプリケーションサーバー]]は、
[CODE[Urgency:]]
[[HTTPヘッダー]]で緊急度を指定できます。
([[アプリケーションサーバー]]が指定し、
[[プッシュサービス]]が保持します。)
: [F[データ][PushMessageData]] :
([[アプリケーションサーバー]]と[[利用者エージェント]]は暗号化されたデータを送受信しますが、
元のデータを知り得ます。
[[プッシュサービス]]は暗号化されたデータのみ知り得ます。
[[Webブラウザー]]上の[[アプリケーション]]は元のデータのみ見ます。)
: [F[[[プッシュメッセージ資源]]の [[URL]]]]:
([[プッシュサービス]]が決定し、
[[アプリケーションサーバー]]と[[利用者エージェント]]が知り得ます。)
]FIG]
* データ
[7]
[[プッシュメッセージ]]には[F[データ][PushMessageData]]を含めることができます。
データは含めても含めなくても構いません。
[[プッシュメッセージ]]を受信したという事実により、
その事由や[[利用者]]に提示するべき事項などは他の手段で取得すればいいので、
データは省略したり、最低限に抑えたりできるのです。
([[Chrome]] の古い実装では、
データを含めることができませんでした。)
[39]
データは、
[[プッシュメッセージ]]の本質的な内容たる形態と、
それを転送用に[[暗号化]]した形態の2種類があります。
そのどちらも、関係する各[[仕様書]]は
data、content、payload、 ([[HTTPメッセージ]]の) [[body][本体]]
のような呼び方を混在させていて、
明瞭さを欠きます。
[40]
データは[[アプリケーションサーバー]] → ([[プッシュエンドポイント]]) →
[[プッシュサービス]] → ([[プッシュメッセージ購読資源]]) →
[[Webブラウザー本体][プッシュメッセージの受信]] → ([CODE[PushEvent]])
→ [[サービスワーカー]]と転送されますが、
このうち[[アプリケーションサーバー]]から
[[Webブラウザー本体]]までは、暗号化された状態で移動します。
[CODE[PushEvent]] で[[アプリケーション]]に提示される状態で[[解読]]済みの形に戻ります。
-*-*-
[5]
データは [[HTTPメッセージ]]の[[本体]]として転送されます。
[[Web Push Protocol]] 単体ではこの[[本体]]に具体的な制約を規定していません。
[[応用][アプリケーション (プッシュ)]]は、
[[末端対末端]]で[[機密性]]、
[[一貫性]]、
データ起源[[認証]]を提供する機構を用いなければ[MUST[ならない]]
[SRC[>>1 8.1.]]
とだけ定められています。
[43]
[[Push API]]
は、
[[利用者エージェント]]が
[CODE[aes128gcm]]
に対応しなければ[MUST[ならない]]、
互換性のため以前の [[I-D]] で定義されていた版にも対応して[MAY[構わない]]、
と規定しています
[SRC[>>24]]。
(古い版への対応は、いずれ[[廃止]]される想定とみられます。)
[[利用者エージェント]]への要件という形を採っていますが、
[[アプリケーションサーバー]]もこれに従う他選択肢はありません。
[25]
[CODE[PushManager]]
[[インターフェイス]]の
[DFN[[CODE[supportedContentEncodings]]]]
[[属性]] [SRC[>>24]] は、
次のようにしなければ[MUST[なりません]]。
[FIG(steps)[
= [26]
[CODE[SameObject]]:
[[プッシュメッセージ]]の [[payload]]
の[[暗号化]]に使える[[内容符号化]]の
[CODE[[[FrozenArray]]<[[DOMString]]>]]
を返します [SRC[>>24]]。
]FIG]
[44]
データに付随して転送される
[[HTTPヘッダー]]が[[プッシュメッセージ]]の一部を構成するのか、
[[RFC]] は明言していません。
例示には
[CODE[[[Content-Type:]] [[text/plain]][SNIP[; ...]]]]
が常に示されていて、これがデータの形式を表すようにもみえます。
一方で [[Push API]]
ではこの情報は使われませんし、
[[Push API]] が扱うデータは[[バイト列]]であって[[文字列]]ではないので、
この例示はあまり現実の利用に近いものでもありません。
実際上 [[HTTPヘッダー]]は[[プッシュメッセージ]]を構成しないとみるべきでしょう。
-*-*-
[45]
[[プッシュメッセージ]]の[F[データ][PushMessageData]]の
(転送用ではない) 本質的な内容は、
[[アプリケーション]]依存の任意の[[バイト列]]です。
[46]
理論上任意の長さの[[バイト列]]を扱えないこともないとされていますが、
[[プロトコル]]によって[[相互運用性]]が保証される長さ制限があって、
現実的にはその範囲に収める必要があります。
つまりデータは、
'''[N[0]] [[バイト]][[以上]]、[N[3993]] [[バイト]][[以下]]の[[バイト列]]'''でなければなりません。
[47]
データが表すものは、[[テキスト]]でも [[JSON]] でも[[画像]]でも、
何でも構いません。
[48]
[[アプリケーションサーバー]]は、
データを[[暗号化]]して[[プッシュサービス]]に送信することになります。
その手順は[[プッシュメッセージ]]の送信に使う[[ライブラリー]]などにより異なります。
[49]
[[Webブラウザー]]上の[[アプリケーション]]は、
[[Webブラウザー]]の[[プッシュメッセージの受信]]処理によって[[解読]]されたデータを
[CODE[PushEvent]]
から受け取ることになります。
データは
[CODE[PushMessageData]]
[[オブジェクト]]として表されます。
-*-*-
[27] [DFN[[CODE[PushMessageData]]]]
[[インターフェイス]] [SRC[>>28]]
は、
[[プッシュメッセージ]]の[F[データ][PushMessageData]]を表します。
[[サービスワーカー環境]]に[[晒され]]ます
[SRC[>>28]]。
[CODE[SecureContext]] のみ利用可能です [SRC[>>28]]。
[30] 状態として[F[バイト群][bytes (PushMessageData)]]を持ちます。
[FIG(list short)[ [29] [CODE[PushMessageData]] の[[メンバー]]
- [CODE[arrayBuffer][bytes (PushMessageData)]]
- [CODE[json][bytes (PushMessageData)]]
- [CODE[text][bytes (PushMessageData)]]
- [CODE[blob][bytes (PushMessageData)]]
]FIG]
[31]
[CODE[PushEvent]] [[インターフェイス]]の
[DFN[[CODE[data][PushMessageData]]]]
[[属性]]の[[取得器]] [SRC[>>23]] は、
次のようにしなければ[MUST[なりません]]。
[FIG(steps)[
= [32] [[文脈オブジェクト]]の
[F[[CODE[data][PushMessageData]]]]
を返します [SRC[>>23]]。
]FIG]
[33]
[CODE[PushEventInit]] [[辞書]]の
[DFN[[CODE[data][PushMessageData]]]]
メンバー [SRC[>>23]] は、
[CODE[PushEvent]]
[[インターフェイス]]の
[CODE[data][PushMessageData]]
に対応します。値は
[CODE[PushMessageDataInit]] とされています [SRC[>>23]]
が、他に
[CODE[null]]
もあり得るようです。
既定値は
[CODE[null]] です。
[36]
[CODE[PushEvent]]
[[インターフェイス]]の[[イベント構築手順群]]の
[CODE[data][PushMessageData]]
の処理は、
[VAR[辞書]]と[VAR[イベント]]について、
次のようにします。
[SRC[>>23]]
[FIG(steps)[
= [37] [VAR[辞書]]の [F[[CODE[data][PushMessageData]]]] が [CODE[null]] でない場合、
== [41] [VAR[イベント]]の
[F[[CODE[data][PushMessageData]]]]
を、
新しい [CODE[PushMessageData]]
に設定します。
[FIG(list members)[ [42] [CODE[PushMessageData]]
: [F[バイト列][bytes (PushMessageData)]] :
[[extract a byte sequence]]
を[VAR[辞書]]の
[F[[CODE[data][PushMessageData]]]]
について実行した結果
]FIG]
]FIG]
[34]
[DFN[[CODE[PushMessageDataInit]]]]
は、
[CODE[BufferSource]]
または
[CODE[USVString]]
に
[[typedef]]
されています。
[SRC[>>23]]
[35]
[VAR[オブジェクト]]について
[DFN[extract a byte sequence]]
するには、
次のようにします。
[SRC[>>28]]
[FIG(steps)[
= [18] [VAR[オブジェクト]]が [CODE[BufferSource]] の場合、
== [19] [VAR[オブジェクト]]の内容の複製を返します。
= [20] [VAR[オブジェクト]]が [CODE[USVString]] の場合、
== [21] [VAR[オブジェクト]]を [[UTF-8符号化]]した結果を返します。
]FIG]
* プッシュメッセージ資源
[4]
[DFN[[RUBYB[プッシュメッセージ資源][push message resource]]]]は、
[[プッシュサービス]]において[[プッシュメッセージ]]を識別する[[資源]]です。
[SRC[>>1 2.1.]]
[[URL]] によって識別されます。
[50] [[プッシュサービス]]は、
[[アプリケーションサーバー]]の求める[[プッシュメッセージ]]の配送を受理したとき[[プッシュメッセージ資源]]を作成し、
[[利用者エージェント]]が[[プッシュメッセージの受領肯定]]したとき[[プッシュメッセージ資源]]を削除します。
[SRC[>>1 2.1.]]
[51]
[[Web Push Protocol]] 上[[プッシュメッセージ資源]]を能動的に操作することはできません。
次のように使われます。
- [52]
[[プッシュメッセージの受信]]で、
[[server push]] される [CODE[GET]] [[要求]]という形で[[プッシュメッセージ]]配送に使われます。
- [53]
[[プッシュメッセージの配送確認]]で、
[[server push]] される [CODE[GET]] [[要求]]という形で[[プッシュメッセージ]]受領の伝達に使われます。
-- [54] それとの照合のため、[[プッシュ資源]]の[[応答]]に [[URL]] が示されます。
[9]
両者は同じ [[URL]] の [CODE[GET]]
でありながら、内容も意味も違います。
[17]
理論上、
[[server push]] の[[意味論]]的には、
[[プッシュメッセージ資源]]を直接 [CODE[GET]]
することでも同じようにアクセスできるはずですが、
このような特殊な構造になっている以上、
[[server push]] 以外の方法で使うことは考えられていないのでしょう。
* 送信
[10] [[プッシュメッセージ]]は、
[[アプリケーションサーバー]]が[[プッシュサービス]]の[[プッシュ資源]]へと送信することで作成されます。
[SEE[ [[プッシュメッセージの送信]] ]]
* 受信
[8] [[プッシュメッセージ]]は、
[[プッシュサービス]]から[[利用者エージェント]]へと、
[[プッシュメッセージ購読]]や[[プッシュメッセージ購読集合]]の[[要求]]に対する
[[server push]] で配送されます。
[[Webブラウザー]]は、
適切な[[サービスワーカー]]を起動し、
[CODE[push][onpush]]
[[イベント]]によって配送します。
[SEE[ [[プッシュメッセージの受信]] ]]
* 受領
[11]
[[利用者エージェント]]は、
[[プッシュメッセージ]]を最低1回は配送されたことを示す、
受領肯定を表明しなければ[MUST[なりません]]。
[SRC[>>1 6.2.]]
[12]
[[利用者エージェント]]は、
[[プッシュメッセージ資源]]に
[CODE[DELETE]]
[[要求]]を送らなければ[MUST[なりません]]
[SRC[>>1 6.2.]]。
[16]
[CODE[DELETE]]
に対して[[プッシュサービス]]が送るべき[[応答]]は、特に規定されていません。
[CODE[200]] や [CODE[204]]
が適当でしょうか。
[CODE[DELETE]] が既に行われている場合などのエラー処理も特に規定がありません。
[14]
[[プッシュサービス]]は、
十分な時間内に肯定を受信しない場合、
未配送とみなします。
[CODE[TTL:]] 到来まで配送を試み続ける[SHOULD[べきです]]。
[SRC[>>1 6.2.]]
[15]
[[プッシュサービス]]は、
それ以前でも事情に鑑み適宜再配送を中断して[MAY[構いません]]。
[SRC[>>1 6.2.]]
[13]
受領されたかどうか、
[[プッシュサービス]]は[[受領証購読]]に適宜通知する必要があります。
* メモ