佐々木屋

技術的なことから趣味まで色々書きます

Cookieの設定

作成と取得の基本

Cookieはクライアントに保存されますので、Sessionと違いWebアプリケーションを終了しても残すことが可能です。
例えば、条件によって表示結果を変えるようなサイトでのチェックボックスを記憶するとか。

Response.Cookies["UserName"].Value = "Hoge";
Debug.WriteLine(Request.Cookies["UserName"].Value);
Hoge


制限

Cookieは以下の制限があります(InternetExplorer11の場合)。
・容量は5,117バイトまでサポート
・個数はドメイン当たり50個まで(50個超えると古い方から削除される)

というこで、大量情報を保存することは向いていません。せいぜい認証したユーザー情報や支店情報くらいでしょうか。また、セキュリティの面で非常に脆弱なので、認証情報やパスワードの保存には向いていません(Sessionを使うか暗号化しましょう)。


有効期限

Cookieは有効期限を設定何も指定しないで作成すると、0000年1月1日で設定されます。つまり、作成した時点で期限が切れていますのでクライアント側に保存されることは無く、ブラウザを閉じた段階で破棄されます。
有効期限切れを防ぐ、又は永続的に保存したい場合はExpiresプロパティを50年後に設定します。

Response.Cookies["UserName"].Value = "Hoge";
Response.Cookies["UserName"].Expires = DateTime.Today.AddYears(50);

但し、Cookieの削除はユーザー側で好きに実行できちゃうので、Cookieありきでのアプリケーション仕様は危険です。


サブキー

Cookieはサブキーを持たせることができます。これは上限値や容量を圧縮するのに役立ちます。例えばユーザー情報を保存する場合です。

Response.Cookies["UserInfo"]["UserID"] = "001";
Response.Cookies["UserInfo"]["UserName"] = "Hoge";
Response.Cookies["UserInfo"].Expires = DateTime.Today.AddYears(50);
Debug.WriteLine(Request.Cookies["UserInfo"].Value);
Debug.WriteLine(Request.Cookies["UserInfo"]["UserName"]);
UserID=001&UserName=Hoge
Hoge

「UserInfo」1個に対して2つの情報を持たせることができますので、50個上限という縛りが緩和されます。まぁWEBアプリケーション仕様として50個以上のCookieを操作するような場面に出くわしたことはないですけどね。
また、有効期限の設定も当然「UserInfo」1個に対して行われますので、単に2個のCookieを作成してそれぞれ有効期限を設定するよりは容量を節約できます。