IEでログインできない!

サーバ時間にやられたという話。

開発中のアプリでFirefoxでログインできるのだが、IE7ではログインできない現象にぶつかった。結論から言うとサーバの時計が遅れていた事が原因だが、面白い事が分かった。

まず開発はVMWare上のCentOSで行っており、何故か知らんがこのゲストOSの時間がやけに遅れる。おそらくホストOSに時間を合わせるオプションか何かがあるのだろうけど、別に大した問題ないので放っておいた。今になって面倒くさいことになったわけだが。で、アプリの方はセッションの有効期限を24時間にしてある(ちなみにCatalystでSession::State::Cookieを使っている)。するとサーバの時計が24時間以上遅れた時点で、発行されるCookieのExpireが過去の時間になってしまうのだ。

するとIEは期限切れとみなし即座にCookieを破棄するため、ログインと同時にセッションが切れてしまう。一方Firefoxは、レスポンスヘッダのDateフィールドの値をチェックし、Expireの時刻とDateフィールドの差をとって、クライアントの現在時刻に足した値をCookieのExpireとしてセットし直すらしい。

このCookie処理の違いのため、IEのみログインできないという現象が発生したようだ。困ったもんだが、別にどっちの仕様が間違いと言うわけでもないらしい。IEだけログイン出来ない現象にぶち当たったらサーバの時間を調べてみるといいかもしれない。