cookieで同じキーを持つパラメータを複数登録できること等について実験し、仕様を確認しました。
実験方法
ブラウザ Windows Edge
プログラム PHP 8.3.6 (cli) on ubuntu
Cookieの指定と確認方法
<?php
$cookie_name = "test_key";
$cookie_value = "test_data";
$expiry_time = time() + 600; // 600秒有効
setcookie($cookie_name, $cookie_value, $expiry_time, "/");
// クッキーが設定されているかどうかを確認し、設定されたクッキー情報を表示する
if (isset($_COOKIE[$cookie_name])) {
echo "クッキーの値は: " . $_COOKIE[$cookie_name];
} else {
echo "クッキー '$cookie_name' は設定されていません。";
}
?>
配置先は、
[WEB_HOME]/api/cookie_set.php (パーミッションは 755)
としています。
Edge上で「F12」を押下すると、開発者ツールが開くので、アプリケーションタブ内のcookie情報を表示するとこんな感じになります。
最初に画面を開いたときにCookieをセットし、画面をもう一度開くと次の画面が表示されます。
$cookie_name Cookieのキー値
$cookie_value 実際に保存されるバリュー値
$expiry_time キーの保存期間(秒で指定)
この状態だと、
192.168.19.129/ 以下のPATHにおいて
設定してから600秒の間
$_COOKIE [$cookie_name] に $cookie_value が保存
されている状態ということになります。
PATHに値を指定しない場合
次のプログラムを使いました
//setcookie の部分を変更
$cookie_name = "test_key";
$cookie_value = "test_data";
$expiry_time = time() + 600; // 600秒有効
$path = ""; // "/"から変更
$domain ="";
$secure = False;
$httponly = False;
setcookie(
$cookie_name, $cookie_value, $expiry_time, $path,
$domain, $secure, $httponly
);
$path を”/”から””に変更したところ、pathが”api”に変わったことから、
PATH に “” を入れると現在のPATHが自動で設定される
ことがわかります。
この後、path=”” になっている cookie_set.phpを、
[WEB_HOME]/cookie_set.php (パーミッションは 755)
にも配置して開きなおしたところ、
[WEB_HOME]/cookie_set.php
$_COOKIE[$cookie_name] $cookie_value
[WEB_HOME]/api/cookie_set.php
$_COOKIE[$cookie_name] $cookie_value
$_COOKIE[$cookie_name] $cookie_value
という感じで、/api フォルダ上に同じキーのCookieが2つ存在していることが確認できました
pathが違うcookieに別のバリューを指定することもできます。
※test_key に違う値を入れた様子
内部的にどのように管理しているのか気になったので、/api パス上で var_dump関数を使って、$_COOKIEの値を確認したところ ARRAY(1)… と表示され、ルートパスに紐づいたVALUEが取得できなくなっています。
同じキーなので上書きされているような感じです。
var_dump($_COOKIE);
↓
array(1) { ["test_key"]=> string(9) "test_data" } //api path に紐づいているcookieの値
開発者ツールを使って /api パスに紐づいているcookieを強制削除した上で同じ実験をしたところ、ルートパスに紐づいているcookieが表示されました。
※ルートパスには”data1″、/apiパスには”test_data”が紐づいています
このことから、
同じキーの値が複数存在する場合は、ルートパスより自パスが優先して出力される
という仕様になっていることがわかりました。
Cookieのパスを使った管理方法の検討
cookieのpath指定は、管理用のPATH内だけCookieの値を使用したい場合に使用するようです。
同じキーのcookieが複数存在できるということは、
このような構成を考えたときに、管理者フォルダとルートパスで、管理者フォルダ内では管理者のユーザIDが表示されるようになります。
それよりも開発者ツールが何でも出木杉君なので、社内のグループウェアでEdgeを使用する場合は、開発者ツールを使えなくするように検討した方がいいかもしれないですね。
Cookieのパラメータを自由に改竄されるとデバッグが大変です。というか無理です;
まとめ
ページ上に同じキーを持つcookieを保存することはできるが、取得する際は、優先順位の高いキーの値が取得される(読み込めるのは1つ)。
優先順位は、ルートパス < 現在のパス
パスを指定しないでcookieを指定すると、自動的に現在のパスが指定される
ということがわかりました。