Slide 1

Slide 1 text

HTTP Cache 再確認 Murachi Akira aka Hebikuzure

Slide 2

Slide 2 text

About me • Murachi Akira aka hebikuzure ( 村地 彰 ) • 株式会社エクシードワン 技術フェロー • 株式会社シーピーエス 技術教育スペシャリスト • 専門学校東京テクニカルカレッジ非常勤講師 • Microsoft MVP (Most Valuable Professional) • Since Apr. 2011 ( 14 Years! ) • Award Category: Windows and Devices -Windows Cloud and Datacenter Management –Windows Server • Expertise • Windows client / user management and security • Microsoft 365, Active Directory, Microsoft Endpoint Manager https://www.linkedin.com/in/akiramurachi/ https://www.facebook.com/amurachi/ https://twitter.com/hebikuzure 2

Slide 3

Slide 3 text

Contents • キャッシュとは? • 誰がキャッシュするのか? • キャッシュの種類 • キャッシュの保存制御 3

Slide 4

Slide 4 text

キャッシュとは? 4

Slide 5

Slide 5 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 5

Slide 6

Slide 6 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 6 Web Server User Agent Network

Slide 7

Slide 7 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 7 Request(1)

Slide 8

Slide 8 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 8 Request(1) Response(1)

Slide 9

Slide 9 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 9 Cache Request(1) Response(1)

Slide 10

Slide 10 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 10 Cache Request(1) Request(2) Response(1)

Slide 11

Slide 11 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 11 Cache Request(1) Request(2) Response(1) Response(2)

Slide 12

Slide 12 text

Cache(キャッシュ)とは? • HTTP レスポンスを一時的に保存 • 再利用するメカニズム 12 Cache Request(1) Request(2) Response(1) Response(2) オリジン サーバー Origin Server

Slide 13

Slide 13 text

インターネット標準の位置づけ • 最新の仕様は RFC 9111- HTTP Caching(June 2022) • https://datatracker.ietf.org/doc/rfc9111/ • それまでの仕様は RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching(June 2014) • https://datatracker.ietf.org/doc/html/rfc7234 • RFC 7234 では HTTP/2・HTTP/3 の新仕様が考慮され ていなかった • RFC 7234 には曖昧さが残っていた 13

Slide 14

Slide 14 text

誰がキャッシュするのか? 14

Slide 15

Slide 15 text

誰がキャッシュするのか? • レスポンスを - 受け取って - 読み取り - リクエストに応答できる なら、誰でもキャッシュできる 15

Slide 16

Slide 16 text

受け取って • Origin Server から User Agent までの ネットワーク経路上の機器 16 Origin Server User Agent

Slide 17

Slide 17 text

読み取り • HTTP ヘッダーを読み取って理解できる 17 Origin Server User Agent HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked Connection: close

Slide 18

Slide 18 text

読み取りできない場合 • HTTPS のレスポンスは User Agent 以外で キャッシュできない • 暗号化されていてレスポンスを読み取れない 18 Origin Server User Agent óÿa pHYs Ä Ä• + lIDATx- ’ ?HÃPÆoJJQ°S¡Ð¥tRœ ê`ëTб› tpŠ

Slide 19

Slide 19 text

「読み取りできない」の例外 • HTTPS インターセプトを行えば、 HTTPS レスポンスをキャッシュできる 19 Origin Server User Agent óÿa pHYs Ä Ä• + lIDATx- ’ ?HÃPÆoJJQ°S¡Ð¥tRœ ê`ëTб› tpŠ HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked Connection: close HTTPS インターセプト

Slide 20

Slide 20 text

リクエストに応答できる • User Agent からのリクエストに、キャッシュされたコンテン ツで応答できる 20 Origin Server User Agent

Slide 21

Slide 21 text

応答できない場合 • Origin Server と User Agent の経路上にインラインに 配置されていないと応答できない 21 Origin Server User Agent

Slide 22

Slide 22 text

応答できない例(下の場合) 22

Slide 23

Slide 23 text

「応答できない」の例外 • Arp スプーフィングなどで「なりすまし」を行って、User Agent と Origin Server の間に潜り込める 23 Origin Server User Agent

Slide 24

Slide 24 text

実際にキャッシュするひと • プロキシ サーバー • フォワード プロキシ • リバース プロキシ • CDN • User Agent(ブラウザーなど) 24

Slide 25

Slide 25 text

実際にキャッシュするひと • プロキシ サーバー • フォワード プロキシ • リバース プロキシ • CDN • User Agent(ブラウザーなど) 25 中間キャッシュ

Slide 26

Slide 26 text

キャッシュの種類 キャッシュの保存制御 26

Slide 27

Slide 27 text

キャッシュの種類 • プライベート キャッシュ • 単一のユーザー専用のキャッシュ • 通常はブラウザーなどの User Agent の内部キャッシュ • 共有キャッシュ • 複数のユーザーへの応答に利用できるキャッシュ • 通常はプロキシや CDN などの中間キャッシュ 27

Slide 28

Slide 28 text

プライベート キャッシュの指定 • コンテンツを共有キャッシュに格納させないためには、 Cache-Control: private HTTP ヘッダーを指定する 28

Slide 29

Slide 29 text

プライベート キャッシュの指定 • コンテンツを共有キャッシュに格納させないためには、 Cache-Control: private HTTP ヘッダーを指定する 29 Origin Server User Agent Cache-Control: private キャッシュ できない キャッシュ できる

Slide 30

Slide 30 text

キャッシュ保存の許可 • 動的なコンテンツなど、キャッシュさせたくない場合は Cache-Control: no-store HTTP ヘッダーを指定する 30

Slide 31

Slide 31 text

キャッシュ保存の許可 • 動的なコンテンツなど、キャッシュさせたくない場合は Cache-Control: no-store HTTP ヘッダーを指定する 31 Origin Server User Agent Cache-Control: no-store キャッシュ できない キャッシュ できない

Slide 32

Slide 32 text

キャッシュ利用前の確認 • キャッシュ利用の前に、Origin Server により新しいコンテ ンツがないか確認させるには Cache-Control: no-cache HTTP ヘッダーを指定する 32

Slide 33

Slide 33 text

キャッシュ利用前の確認 • キャッシュ利用の前に、Origin Server により新しいコンテ ンツがないか確認させるには Cache-Control: no-cache HTTP ヘッダーを指定する 33 Cache-Control: no-cache 再リクエスト キャッシュを レスポンス する前に サーバーに確認 HTTP 304 Not Modified が返れば キャッシュからレスポンス

Slide 34

Slide 34 text

キャッシュの有効期限 • Origin Server でコンテンツが更新された場合、キャッシュ された古いコンテンツがレスポンスされると困る • no-cache だと毎回サーバーに確認するので負荷が高い 34

Slide 35

Slide 35 text

キャッシュの有効期限 • Origin Server でコンテンツが更新された場合、キャッシュ された古いコンテンツがレスポンスされると困る • no-cache だと毎回サーバーに確認するので負荷が高い • キャッシュに有効期間を付けて、有効期間内は 無条件で利用する • 有効期限が過ぎたら、利用前にサーバーに確認する 35

Slide 36

Slide 36 text

有効期限の設定 • キャッシュの有効期限は Cache-Control: max-age=xxxx (xxxx は秒数) HTTP ヘッダーで指定する 36

Slide 37

Slide 37 text

有効期限の設定 • キャッシュの有効期限は Cache-Control: max-age=xxxx (xxxx は秒数) HTTP ヘッダーで指定する • xxxx は Origin Server でレスポンスが生成されてからの 秒数 • 中間キャッシュで保持されていた時間も 有効期限に含まれる • 中間キャッシュで保持されていた時間は Age HTTP ヘッダーで User Agent に示される 37

Slide 38

Slide 38 text

中間キャッシュと有効期限 38 Cache-Control: max-age=100 User Agent(1) User Agent(2) Cache Cache-Control: max-age=100 Age: 50 Cache User Agent(2) のキャッシュの有効期限は 100 – 50 = 50 秒

Slide 39

Slide 39 text

推奨事項 • 効率的にキャッシュを利用できるよう、適切な Cache-Control ヘッダーを使用する • プライベートなコンテンツには必ず Cache-Control: private を指定する • キャッシュの無効化は Cache-Control: no-store ※ 間違えて no-cache を使わないよう注意 • キャッシュ可能なコンテンツには必ず max-age を指定 39

Slide 40

Slide 40 text

ヒューリスティックなキャッシュ • max-age の指定が無いコンテンツも、一定期間有効な キャッシュとして保持する • 長期間更新されていないコンテンツは、更新されていな い期間の一定割合を有効期限としてキャッシュする • 意図しないキャッシュを防ぐため、 max-age を指定しよう 40 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024 Date: Sun, 27 Oct 2024 22:22:22 GMT Last-Modified: Fri, 25 Oct 2023 22:22:22 GMT (RFC での例は 10%)

Slide 41

Slide 41 text

参考情報 • RFC 9111 - HTTP Caching • https://datatracker.ietf.org/doc/rfc9111/ • HTTP キャッシュ - HTTP | MDN • https://developer.mozilla.org/ja/docs/Web/HTTP/Caching • Cache-Control - HTTP | MDN • https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/ Cache-Control 41

Slide 42

Slide 42 text

42 ありがとうございました • Murachi Akira aka hebikuzure​ • https://www.linkedin.com/in/akiramurachi/ • https://www.facebook.com/amurachi/ • https://twitter.com/hebikuzure