mikanmarusanのブログスマートフォン用の表示で見るmikanmarusanのブログテクノロジーとかダイビングとかこの広告は、90日以上更新していないブログに表示しています。弊社のアプリが動かないという残念な問い合わせがいくつかあったので、1日ばかりずっと悶々と調べてみたりした。結局Cookieの挙動によるものだったんだけど、Cookieの有効期限の挙動がブラウザごとに違っているらしく、ちょっとハマッたので備忘録としてまとめてみた。Navigatorの実装に基づいているようだ。ここでは、Cookieの仕様についての説明は割愛するが、超簡単にまとめると以下の通り。...ここらへんは、Webサイトを構築するエンジニアは必須知識だと思う。Applicationsによれば、2010年12月のブラウザ3大シェアは下記の通り。いうことで下記3つのブラウザを調査対象とする。ちなみにクライアントはVista。定評が良くないVista。Chrome(8.0.502.237)ここで、検証に利用する予定のSet-Cookieするサーバ側のアプリケーションをさらしておく(PHPerですみません)。有効期限が600秒(=10分間)のtestcookieという名前のCookieを、phpのsetcookie関数で発行する単純なプログラムである。$cookieDomain);ついでにサーバ情報はこんな感じ。(Ubuntu)ここでは、上記cookie発行プログラム(http://192.168.1.101/setcookie.php)にリクエストを送り、そのレスポンスヘッダとブラウザ側に蓄積されるcookie情報をブラウザごとに観察してみる。Explorer通常のIEだとヘッダとかcookieの参照とか非力すぎて死ぬ。ToolbarはMS純正。予想通り、Dateヘッダの10分後のExpireが設定されているtestcookieが発行され、それがブラウザにも保存されているようだ。HeadersのAddonを導入。cookieやらヘッダ情報やら全て見える。デフォルトで使えて便利便利。予想通り、Dateヘッダの10分後のExpireが設定されているtestcookieが発行され(略。しつこいですね、わかります。クライアントとサーバの時刻を変えてみるクライアントとサーバの時刻が同じとき(=同期しているとき)、CookieのExpire値の処理はブラウザを変えても変化はなかった。クライアントの時刻がサーバと同期されていない場合はどうだろうか?サーバの時刻が不正な場合なんて言語道断なので、クライアントの時刻を1時間早めた場合で検証してみる。検証内容は先ほどと同様で、10分間の有効期限を設定したcookieを発行したときのブラウザごとの挙動を確認してみる。※1時間進んでるから)cookie情報あれ、cookieが蓄積されていない。試しに同じドメインで別のHTMLをGETするときのリクエストヘッダを見てみる。Cookieが有効ならば"Cookie:"ヘッダがサーバに向けて付与されているはずである。リクエストヘッダ情報やっぱり、"Cookie:"ヘッダは送出されていない。※1時間進んでるから)cookie情報FireFoxはcookie情報が蓄積されているようだ。クライアント側のリクエスト発行時刻+10分間の有効期限が設定されていることに注意したい。IEの場合と同様に別のHTMLをGETするときのリクエストヘッダを観察してみる。cookieの有効期限の10分間を意識して、cookie発行から10分以内と10分経過後を比べてみた。リクエストヘッダ情報(リクエスト時刻=cookie発行から10分以内)Cookieヘッダ付いてるリクエストヘッダ情報(リクエスト時刻=cookie発行から10分経過後)Cookieヘッダがないこの結果から推測されることは、Firefoxではサーバの意図したcookieの有効期限(=10分)がクライアント側の時刻に変換されてcookieに保存されるようである。レスポンスヘッダのDateヘッダとSet-CookieのExpires値の差分(=10分)を取得し、クライアントのシステム時刻(ただし今回は1時間進んでいる)に加えていると思われる。※1時間進んでるから)cookie情報Chromeは、IEと同じ挙動をするようだ。Explorer/ChromeHTTPレスポンスに含まれるSet-Cookieヘッダーのexpiresの値を厳密に利用しているようだ。FirefoxFireFoxは少し複雑な処理をしているように見受けられる。HTTPレスポンスに含まれるDateヘッダとSet-Cookieのexpiresの差を計算しサーバ側で意図したcookieの有効期限を計算しているのだろう。クライアントのシステム時刻に1)で取得した有効期限を足した値をexpireとしているように見受けられる。通常の利用がなされる場合には、両者の挙動にはまったく違いが見られないが、サーバとクライアントで時刻が異なる特殊なケースの場合に挙動が異なる可能性が出てくる。クライアントとサーバの時刻が同期されていないとき例としてクライアントが1時間時計を進めている時に、有効期限10分のcookieを発行した場合を考える。過去の有効期限のCookieと判断され、Cookieは保存されない。通常利用ではブラウザによるSet-CookieのExpire値の挙動に変化はないが、クライアントとサーバの時刻が同期されていないときは注意が必要かもしれない。Pagesでホスティングする月別アーカイブはてなブログをはじめよう!mikanmarusanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。