ETagの利用例
主にHTTPのキャッシュなどで利用されるETagには複数のユースケースが存在する。
今回はETagのユースケースについて見ていこう。
ETag
ETagヘッダはRFC 7232(HTTP/1.1 Conditional Requests)で定義されているレスポンスヘッダである。
ETagの値はあるリソースの版数に対する識別子である。識別子が必ず一意になるものをStrong Validator、衝突する可能性があるものをWeak Validatorと呼び要件によって使い分けることができる。
1. キャッシュの有効性確認
最も一般的なETagのユースケースはキャッシュの有効性確認である。クライアントはETagを利用して条件付きリクエストを行い、キャッシュが有効な場合は304 Not Modified、新しい版数のリソースが存在する場合は200 OKをサーバから受け取る。
キャッシュやStrong Validator、Weak Valiatorの詳細については下記の記事を参照して欲しい。
2. 楽観的ロックアルゴリズム
ユーザAとユーザBが同時に同じ記事を編集し、最初にAが、次にBが更新した記事をPUTしたとする。このときAの変更はBによって削除されてしまう。これをロストアップデートと呼ばれたりする。ETagを利用して簡易的なロックを実装しろストアップデートを防ぐことができる。
編集開始時にユーザAとユーザBに編集前の記事のETagを渡す。AとBはPUTするときIF-MatchヘッダにETagを記載する。AのPUTは成功し、記事には新しいETagが割り当てられる。一方、BのPUTはETagが一致しないため失敗(412 Precodition Failed)する。
3. 中止したダウンロード処理の再開
中止したダウンロード処理を再開したいとき、クライアントはRangesヘッダにこれまでに受信したバイト数、IF-MatchヘッダにETagを記載する。サーバはETagが一致していた場合、残りのデータをクライアントに送信する。このときETagが一致しているのでダウンロード処理が中断されている間にデータが変更されていないことが保証されている。もしデータが変更されていた場合にはETagが一致しないため失敗(412 Precodition Failed)する。