キャッシュの期限が無指定の場合のブラウザキャッシュの寿命


静的なHTMLファイルをGETメソッドで要求したところ、`304(not
modified)`の応答を期待していたのですが`200(cached)`となりました。つまり、ブラウザはサーバへの要求を投げずにブラウザのキャッシュを使用しました。

キャッシュされる元となったリクエストの応答ヘッダを確認すると、`Cache-Control`や`Expires`は存在せず、
**キャッシュの寿命は指定されていませんでした** 。

質問です。

キャッシュの寿命が指定されていない場合、ブラウザはいつになったらサーバに要求を投げるようになるでしょうか。

* * *

確認したブラウザ：FireFox 50.1.0（12/19時点での最新）

## 1\. 最初の要求時（ブラウザがキャッシュを保存する）

要求ヘッダ

[code]

    GET /index.html HTTP/1.1
    Host: www.xxx.net
    User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:50.0) Gecko/20100101 Firefox/50.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ja,en-US;q=0.7,en;q=0.3
    Accept-Encoding: gzip, deflate, br
    Cookie: （無関係と思われるので省略）
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    
[/code]

応答ヘッダ

[code]

    HTTP/1.1 200 OK
    Date: Mon, 19 Dec 2016 03:50:32 GMT
    Server: Apache
    X-Frame-Options: SAMEORIGIN
    X-Content-Type-Options: nosniff
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    Accept-Ranges: bytes
    Etag: W/"2557-1481710774000"
    Last-Modified: Wed, 14 Dec 2016 10:19:34 GMT
    Content-Type: text/html
    Content-Length: 2557
    Connection: close
    
[/code]

* * *

## 2\. 二回目の要求時（ブラウザがキャッシュを表示する）

要求ヘッダ ※見たところ最初の要求と同じ内容

[code]

    GET /index.html HTTP/1.1
    Host: www.xxx.net
    User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:50.0) Gecko/20100101 Firefox/50.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ja,en-US;q=0.7,en;q=0.3
    Accept-Encoding: gzip, deflate, br
    Cookie: （無関係と思われるので省略）
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    
[/code]

応答ヘッダ

[code]

    なし（キャッシュ）
    ※開発ツールを見るとHTTPステータスは「200 OK(cached)」
    
[/code]

##
[![開発者ツールでHTTPステータスを見た様子](https://i.stack.imgur.com/cWn9H.png)](https://i.stack.imgur.com/cWn9H.png)

なお、[英語版stackOverflow](https://stackoverflow.com/questions/1665082/what-is-the-
difference-between-http-status-code-200-cache-vs-status-
code-304)に類似の質問を見つけていますが、英語力不足で知りたいことの記載を見つけることができませんでした…




[MDN](https://developer.mozilla.org/en-
US/docs/Web/HTTP/Caching#Freshness)にそれっぽいことが載ってました。

> The freshness lifetime is calculated based on several headers. If a "Cache-
> control: max-age=N" header is specified, then the freshness lifetime is
> equal to N. If this header is not present, which is very often the case, it
> is checked if an Expires header is present. If an Expires header exists,
> then its value minus the value of the Date header determines the freshness
> lifetime. Finally, if neither header is present, look for a Last-Modified
> header. If this header is present, then the cache's freshness lifetime is
> equal to the value of the Date header minus the value of the Last-modified
> header divided by 10.  
>  The expiration time is computed as follows:  
>  expirationTime = responseTime + freshnessLifetime - currentAge

要するに、サーバからのレスポンスに、

  1. `Cache-control`ヘッダが存在して`max-age=N`のように指定されていたら、キャッシュの寿命はN。
  2. `Cache-control`ヘッダが無くて、`Expires`ヘッダが存在していたら、`<Expiresヘッダの値> - <Dateヘッダの値>`がキャッシュの寿命。
  3. `Cache-control`ヘッダも`Expires`ヘッダも無くて、`Last-Modified`が存在していたら、`(<Dateヘッダの値> - <Last-Modifiedの値>) / 10`がキャッシュの寿命。

質問のケースは3に当てはまるので、キャッシュの寿命がだいたい0.5日くらいと判定されたんじゃないでしょうか。

因みに、[英語版StackOverflow](https://stackoverflow.com/questions/1665082/what-is-
the-difference-between-http-status-code-200-cache-vs-status-
code-304)の方では`Expires`と`Cache-Control: max-age`にしか言及されていないようです。




[MDN](https://developer.mozilla.org/en-
US/docs/Web/HTTP/Caching#Freshness)にそれっぽいことが載ってました。

> The freshness lifetime is calculated based on several headers. If a "Cache-
> control: max-age=N" header is specified, then the freshness lifetime is
> equal to N. If this header is not present, which is very often the case, it
> is checked if an Expires header is present. If an Expires header exists,
> then its value minus the value of the Date header determines the freshness
> lifetime. Finally, if neither header is present, look for a Last-Modified
> header. If this header is present, then the cache's freshness lifetime is
> equal to the value of the Date header minus the value of the Last-modified
> header divided by 10.  
>  The expiration time is computed as follows:  
>  expirationTime = responseTime + freshnessLifetime - currentAge

要するに、サーバからのレスポンスに、

  1. `Cache-control`ヘッダが存在して`max-age=N`のように指定されていたら、キャッシュの寿命はN。
  2. `Cache-control`ヘッダが無くて、`Expires`ヘッダが存在していたら、`<Expiresヘッダの値> - <Dateヘッダの値>`がキャッシュの寿命。
  3. `Cache-control`ヘッダも`Expires`ヘッダも無くて、`Last-Modified`が存在していたら、`(<Dateヘッダの値> - <Last-Modifiedの値>) / 10`がキャッシュの寿命。

質問のケースは3に当てはまるので、キャッシュの寿命がだいたい0.5日くらいと判定されたんじゃないでしょうか。

因みに、[英語版StackOverflow](https://stackoverflow.com/questions/1665082/what-is-
the-difference-between-http-status-code-200-cache-vs-status-
code-304)の方では`Expires`と`Cache-Control: max-age`にしか言及されていないようです。

