Cookieの値がブラウザ側で有効になるタイミングはいつか

投稿者: Anonymous

ファイルダウンロード完了後に画面遷移などをjavascriptで行う」を参考にASP.NET MVCで実装してみました。

サーバー側はファイルをダウンロードをさせつつCookieをセット、クライアント側はJavaScriptで定期的にCookieをチェックすることでダウンロードの完了を検出する、というものですが、サーバーで設定したCookieがブラウザ側で有効になるのはサーバーからレスポンスデータをすべて受け取った後と理解して良いでしょうか?

下記コードで実行してみましたが、レスポンスをすべて受信する前にCookieが有効になっているように思われました。(思われました、というのはダウンロードを途中で一時停止する方法が分からなかったので、ダウンロード完了前にalertが表示されてしまうことを確実に確認できていないため)

cshtmlは

<a href="/Home/Download" id="download">download</a>
<script>
  $('#download').click(function () {
    var intervalID = setInterval(function () {
      if ($.cookie('downloaded')) {
        clearInterval(intervalID);
        $.removeCookie('downloaded', { path: '/' });
        alert('ダウンロード完了');
      }
    }, 1000);
  });
</script>

コントローラーは

public ActionResult Download()
{
    var cookie = new HttpCookie("downloaded");
    cookie.Value = "yes";
    Response.Cookies.Add(cookie);

    var path = @"c:hoge.jpg";
    return File(path, "image/jpeg", "fuga.jpg");
}

解決

細かく実証したわけではないので、大幅に外している可能性はありますが、 Cookie の処理についての指示が書かれている、

によると、「 ブラウザがHTTP ヘッダをパースした時点で Cookie は設定される。 」 と解釈できます。

Section 5.2

When the user agent finishes parsing the set-cookie-string, the user agent is said to “receive a cookie” from the request-uri with name cookie-name, value cookie-value, and attributes cookie-attribute-list. (See Section 5.3 for additional requirements triggered by receiving a cookie.)

意訳「ブラウザが Set-Cookieヘッダ(set-cookie-string)をパースした時、『Cookie を受信せよ』とされたものとする。Cookie を受信する際の細かな要求事項については、 Section 5.3 を参照のこと」

とあるので、 Section 5.3 を読んでみますと、

Section 5.3

When the user agent “receives a cookie” from a request-uri with name cookie-name, value cookie-value, and attributes cookie-attribute-list, the user agent MUST process the cookie as follows:

1 . A user agent MAY ignore a received cookie in its entirety. For example, the user agent might wish to block receiving cookies from “third-party” responses or the user agent might not wish to store cookies that exceed some size.



12 . Insert the newly created cookie into the cookie store.

項目(12) で Cookie ストレージに保管することが指定されています。

■ Firefox の Cookie 確認ダイアログについて

Mozilla Firefox で about:config から network.cookie.lifetimePolicy=1 とすることで、懐かしの Cookie 確認ダイアログが -サイトによっては数百回も- 表示されるようにできます。

そのダイアログの動作をみると、 Set-Cookie があるページを読込途中で確認ダイアログがポップアップし、ユーザが確認しなければページの読込が再開されません。これは、「HTTPヘッダのパース時、 Cookie の設定直前に処理を止め、その時点時点でクッキーを有効にするか確認している」と受け取ることができそうです。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *