Cookieで同じキーが複数登録できる件について

PHP

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を指定すると、自動的に現在のパスが指定される

 ということがわかりました。