/
564.txt
266 lines (225 loc) · 9.98 KB
/
564.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
[34]
[DFN[[RUBYB[プッシュサービス][push service]]]]は、
[[アプリケーションサーバー]]から[[利用者エージェント]]への[[プッシュメッセージ]]を媒介する[[サーバー]]です。
* 仕様書
[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>
- [27] [CITE@en[RFC 8292 - Voluntary Application Server Identification (VAPID) for Web Push]], [TIME[2020-03-09 00:13:41 +09:00]] <https://tools.ietf.org/html/rfc8292#section-4.1>
- [32] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dfn-push-subscription>
- [33] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dfn-push-service>
]REFS]
* 意味
[2]
[[Web Push]]
の[DFN[[RUBYB[プッシュサービス][push service]]]]は、
[[プッシュメッセージ]]を[[利用者エージェント]]に配送する[[サービス]]です。
[SRC[>>1 1.1.]]
[35]
[[Push API]]
の[DFN[[RUBYB[プッシュサービス][push service]]]]は、
[[アプリケーションサーバー]]が
[[Webアプリケーション]]に[[プッシュメッセージ]]を送信できるようにするシステムです。
[[プッシュサービス]]は、
その供給する[[プッシュ購読]]に関する[[プッシュエンドポイント]](群)を供給するものです。
[SRC[>>33]]
* プロトコル
[4]
[[プッシュサービス]]は、
[[RFC 2818]] [[HTTPS]] を使い、
[[RFC 7525]] の推奨に従わなければ[MUST[なりません]]。
[SRC[>>1 3., 8.]]
[6]
[[プッシュサービス]]は、
[[HTTPS]] と同じ[[既定のポート番号]] [N[443]]
を使います。
[SRC[>>1 3.]]
[5]
[[プッシュサービス]]は、
[[IANA]] に登録されている [[TCP]] システムポート [DFN[[N[1001]]]]
を
[[HTTP代替サービス]]として[[広告]]して[MAY[構いません]]。
[SRC[>>1 3.]]
[7]
[N[443]] は到達性が高いですが、
[[middlebox]]
では一般的な [[Web]] 閲覧用に低い [[idle timeout]]
に設定されがちです。
[[Web Push]] の場合、これでは[[接続]]を維持するため無駄な通信が必要で、
電力消費につながり好ましくありません。
[[mjddlebox]]
は代替ポート [N[1001]]
を低頻度の通信に適した [[idle timeout]]
に設定できるというわけです。
[[middlebox]] は [[RFC 5382]] [[REQ-5]]
すなわち
[[established connection idle-timeout]] は2時間4分より小さくては[MUST[ならない]]、
に従う[SHOULD[べきです]]。
[SRC[>>1 3.]]
-*-*-
[25] 負荷対策のため [[HTTP代替サービス]]を使い、
同じ [[URL]] のまま他の[[サーバー]]にアクセスを求めることもできます。
その場合、
[[利用者エージェント]]は新たな[[接続]]を確立してから元の[[接続]]に
[CODE[GOAWAY]]
を送信し、[RUBYB[[[華麗]]][graceful]]に移行できます。
[SRC[>>1 7.1.]]
* プッシュサービス資源
[3] [[プッシュサービス]]は、
[DFN[[RUBYB[プッシュサービス資源][push service resource]]]]を持ちます。
[RUBYB[プッシュサービス][push service]][[資源]]は、
[[プッシュメッセージ購読]]を作成するために使います
[SRC[>>1 2.1.]]。
[8]
[[プッシュサービス資源]]の [[URL]]
は、[[利用者エージェント]]が保持しています [SRC[>>1 2.1.]]。
[26]
[[利用者エージェント]]は、いつでも新しい[[プッシュメッセージ購読]]を作成できなければ[MUST[なりません]]。
[SRC[>>1 8.2.]]
[9]
[[利用者エージェント]]は、
新しい[[プッシュメッセージ購読]]を作成する際、
[[プッシュサービス資源]]に
[CODE[POST]] [[要求]]を送信します。
[SRC[>>1 4.]]
[16]
[[利用者エージェント]]は、
以前の[[要求]]に対する[[応答]]で[[プッシュメッセージ購読集合]]が指定されていたら、
[[要求]]に[[リンク関係型]]
[CODE[urn:ietf:params:push:set]]
でこれを指定する[SHOULD[べきです]]。
[SRC[>>1 4.]]
[CODE[Link:]] [[HTTPヘッダー]]で記述できます。
[17]
[[利用者エージェント]]は、
[[プッシュメッセージ購読]]の寿命の間、
[[プッシュメッセージ]]を集約して受信することができないなら、
[[プッシュメッセージ購読集合]]を省略して[MAY[構いません]]。
[[利用者エージェント]]が他の[[プッシュメッセージ]]受信者のかわりに[[プッシュメッセージ購読]]を監視するような場合に、
その必要があるかもしれません。
[SRC[>>1 4.1.]]
[28]
[[利用者エージェント]]は、
[[VAPID]] で制限された[[プッシュメッセージ購読]]を作成したい場合、
[[公開鍵]]を指定します。
[CODE[Content-Type:]] は
[[MIME型]]
[DFN[[CODE[application/webpush-options+json]]]]、
[[要求本体]]は
[[RFC 7159]] [[JSONオブジェクト]]とします。
その
[DFN[[CODE[vapid]]]]
の値は、
[[公開鍵]]を
[[X9.62]] [[uncompressed form]]
で
[[RFC 7515]]
[[base64url]]
符号化したものとします。
[SRC[>>27]]
-*-*-
[10]
[[プッシュサービス資源]]は、
[[プッシュメッセージ購読]]を作成します。
[[プッシュメッセージ購読資源]]と[[プッシュ資源]]が作成されます。
[[プッシュメッセージ購読集合]]を必要なら作成し
([[要求]]で指定されていればそれを選択し) て、
作成した[[プッシュメッセージ購読]]を追加します。
[19]
[[プッシュサービス資源]]は、
[[要求]]で指定された[[プッシュメッセージ購読集合]]が非妥当なら、
[CODE[400]]
[[応答]]を返さなければ[MUST[なりません]]。
[SRC[>>1 4.1.]]
異なる[[利用者エージェント]]用の[[プッシュメッセージ購読集合]]が指定されるのは不適当でしょうし、
[[プッシュメッセージ購読集合]]でないものが指定された場合もそうでしょう。
[20]
[[プッシュサービス資源]]は、
[[プッシュメッセージ購読集合]]の指定のない[[要求]]を、
[CODE[429]]
[[応答]]で拒絶して[MAY[構いません]]。
[SRC[>>1 4.1.]]
同じ[[利用者エージェント]]がいくつも[[プッシュメッセージ購読]]を作成し、
[[プッシュメッセージ購読集合]]にまとめられないのは不適当で不審な挙動と考えられます。
[21]
同じ[[利用者エージェント]]であるかどうかの判断方法は、
[[実装]]依存です。
[SRC[>>1 4.1.]]
現在の
[[Webブラウザー]]の配布形態は、
特別な利用者登録なしに自由に実行できるものとなっていますから、
事前交換情報に基づく[[認証]]による確実な識別ができません。
[[IPアドレス]]その他から推測することになりますが、
どの方法であれ確実とはいえません。
おそらく、
[[Webブラウザー]]依存の方法で[[利用者エージェント]]を識別する何らかの情報を
[[Webブラウザー]]側で保持しておき、
これを毎回[[要求]]に追加して同一性判定に供することになるのでしょう。
[[プッシュサービス]]は任意の方法で[[認証]]できます [SRC[>>1 8.3.]]。
[29]
[CODE[application/webpush-options+json]]
''以外''の[[要求本体]]は、
無視しなければ[MUST[なりません]]。
[SRC[>>27]]
[30]
[CODE[application/webpush-options+json]]
[[要求本体]]のうち、
理解できない
[[JSONオブジェクト]]のメンバーは虫しなければ[MUST[なりません]]。
[SRC[>>27]]
[31] [[要求本体]]が[[JSONオブジェクト]]でないときどうするべきか不明です。
-*-*-
[14]
作成に成功したら、[[応答]]を返します。
- [15] [CODE[201]]
[[応答]]を返します
[SRC[>>1 4.]]。
-
[11]
[CODE(HTTP)@en[Location:]]
[[ヘッダー]]に、
作成された[[プッシュメッセージ購読資源]]の [[URL]]
を指定しなければ[MUST[なりません]]。
[SRC[>>1 4.]]
-
[12]
[[プッシュメッセージ購読]]に対応する[[プッシュ資源]]の
[[URL]]
を[[リンク関係型]]
[CODE[urn:ietf:params:push]]
で記述しなければ[MUST[なりません]]。
[SRC[>>1 4.]]
[CODE[Link:]] [[ヘッダー]]で記述できます。
-
[13]
[[プッシュメッセージ購読集合資源]]の [[URL]] を、
[[リンク関係型]]
[CODE[urn:ietf:params:push:set]]
で記述して[MAY[構いません]]。
[SRC[>>1 4.1.]]
[CODE[Link:]] [[ヘッダー]]で記述できます。
-- [18] [[要求]]で[[プッシュメッセージ購読集合資源]]が指定されていれば、
同じものを返す[SHOULD[べきです]]。
それがかなわない場合、新しいものを返して[MAY[構いません]]。
[SRC[>>1 4.1.]]
[22]
[[本体]]については何ら規定がありません。
すべての情報は [[HTTPヘッダー]]で記述されるので、
省略し無視するのが適当と思われます。
[24]
[[プッシュサービス]]は、負荷対策のため他の[[サーバー]]に分散させられます。
[[利用者エージェント]]は、
[CODE[307]]
[[応答]]に対応しなければ[MUST[なりません]]。
[SRC[>>1 7.1.]]
明記されていませんが、
[CODE[Location:]]
で[[リダイレクト]]された [[URL]]
に [CODE[POST]]
し直すことが期待されていると思われます。
[[同じ起源]]とは限らない (違う[[サーバー]]なので違う可能性も高い)
と思われますが、
任意の外部サーバーへの[[リダイレクト]]を認めてよいのか、
[[利用者エージェント]]の設計上注意が必要かもしれません。
[23] その他、
明文規定はありませんが、当然、[[利用者エージェント]]はエラー処理が必要です。
* メモ