/
564.txt
210 lines (178 loc) · 7.94 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
[2]
[DFN[[RUBYB[プッシュサービス][push service]]]]は、
[[プッシュメッセージ]]を[[利用者エージェント]]に配送する[[サービス]]です。
[SRC[>>1 1.1.]]
* 仕様書
[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>
]REFS]
* プロトコル
[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.]]
-*-*-
[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.]]。
-*-*-
[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] その他、
明文規定はありませんが、当然、[[利用者エージェント]]はエラー処理が必要です。
* メモ