プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

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の詳細については下記の記事を参照して欲しい。

architecting.hateblo.jp


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)する。