読者です 読者をやめる 読者になる 読者になる

DoCoMo iモードブラウザ2.0でCookie

DoCoMoのこの夏モデルから、iモードブラウザ2.0というより高機能なiモードブラウザが搭載されるようになりました。

CookieCSS,JSなど、大きな違いがありますので、実際に実機で確認をしてみます。
端末は、N-06A を使用します。なんか、発売停止なんてなってますが。。


Cookie

まずは、Cookieについて。
以前、以下のような調査をしたことがあったので、同じ調査をしてみました。
auのSSLでのCookieの挙動がおかしい - maru.cc@はてな
au,SoftBankでSSLでCookieセッションを使用する場合の問題点 - maru.cc@はてな


結果は、問題なく使えます。http<->httpsでの動作、secure属性の挙動も問題ありません。
これを使えば、Cookieセッションでセキュアなサイトがちゃんと作れそうです。

setcookie()の httponly の挙動が動いていない?

phpのsetcookie関数には、httponly という引数があります。

httponly
TRUE を設定すると、HTTP を通してのみクッキーにアクセスできるようになります。 つまり、JavaScript のようなスクリプト言語からはアクセスできなくなるということです。 この設定を使用すると、XSS 攻撃によって ID を盗まれる危険性を減らせます (が、すべてのブラウザがこの設定をサポートしているというわけではありません)。 PHP 5.2.0 で追加されました。 TRUE あるいは FALSE で指定します。
http://jp2.php.net/manual/ja/function.setcookie.php

以下のようなテストコードでテストしてみたところ、httponlyの指定が正常に動いていないように思います。
単にサポートしてないというだけなのかもしれません。

http側ファイル

<html>
<head>
<meta http-equiv="Pragma" content="no-cache">
</head>
<body>
<pre>
<?php
print_r($_COOKIE);

$value = "test:".date('H:i:s').' '.$_SERVER['SERVER_PORT'];
$timeout = time() + 20;
setcookie("test",$value,$timeout);
setcookie("test".$_SERVER['SERVER_PORT'],$value,$timeout,'/','example.com',false,true);
?>
</pre>
<hr>
<script  type="text/javascript">
document.write(document.cookie);
</script>
<hr>
<a href="http://example.com/cookie.php?nocache=<?php echo md5(microtime())
?>">http</a><br>
<a href="https://example.com/cookie.php?nocache=<?php echo md5(microtime())
?>">https</a><br>
</body>
</html>
<html>
<head>
<meta http-equiv="Pragma" content="no-cache">
</head>
<body>
<pre>
<?php
print_r($_COOKIE);

$value = "test:".date('H:i:s').' '.$_SERVER['SERVER_PORT'];
$timeout = time() + 20;
setcookie("test",$value,$timeout);
setcookie("test".$_SERVER['SERVER_PORT'],$value,$timeout,'/','example.com',true);
?>
</pre>
<hr>
<script  type="text/javascript">
document.write(document.cookie);
</script>
<hr>
<a href="http://example.com/cookie.php?nocache=<?php echo md5(microtime())
?>">http</a><br>
<a href="https://example.com/cookie.php?nocache=<?php echo md5(microtime())
?>">https</a><br>
</body>
</html>

結果は次のようになりました。
http

https

ちなみに IE7の場合は以下のようになります。
http

https

複数ウィンドウ

iモードブラウザ2.0では、aタグに targetを指定できます。
タブ間でCookieが共有されるかは、当然共有されるようです。

ブラウザを閉じてからの Cookieの保持

上記のテスト中に、iモードブラウザを閉じてからアクセスをしたところ、問題なく前回の Cookieを取得できました。


Kimuraさんのblogに書かれていて気になったので以下も調べてみました。
expireに 0を指定したところ、iモードブラウザを終了後、再度立ち上げたときに、Cookieを取得できませんでしたので、ブラウザを閉じるまでという挙動は正しく動いているようです。

逆に複数タブを(ウィンドウ)を開いた状態では、どれか一つを閉じただけでは、Cookieは保持されていますね。これは当然の挙動かな。

とりあえず

DoCoMoの新しい端末onlyであれば、ちゃんと CookieセッションでOKそうです。
あとは、旧世代との差をどう埋めるかですね。。


JS周りも調べてみようと思います。

追記(2009-05-28)

どうやらソフトウェアアップデートでJavaScriptが動かなくなってしまったようで、上記の画面キャプチャのような結果にならなくなってしまいました。
JavaScriptの部分が動きません。