クッキーの各プレフィクスについてのメモ
クッキーの基礎を抑える
phpのsetcookie関数を使ったサンプルを記しておく。ちなみにバージョンは8.0.9。動作確認はchrome92で行っている。
setcookie('test', 'testvalue', [

 'expires' => time() + 100,

 'path' => '/',

 'domain' => '',

 'secure' => true,

 'httponly' => true,

 'samesite' => 'Strict'

]);

echo '<pre>';

var_dump(headers_list());



//result

array(1) {

 [0]=>

 string(121) "Set-Cookie: test=testvalue; expires=Mon, 23-Aug-2021 04:32:08 GMT; Max-Age=100; path=/; secure; HttpOnly; SameSite=Strict"

}
cookieの有効期限の仕様としてexpiresとmax-ageが存在する。現段階ではmax-ageのキーがあればこれを優先することになっている。setcookie関数にmax-ageの引数はないが、expiresに日時を指定すると自動でmax-ageのキーバリューを付与する。引数の宣言にハイフンが使えないからだと個人的に思っている。expiresの日時フォーマットで無茶苦茶な値を設定されるケースがあるので改善するための仕様だそうだ。維持したい秒数を与えるだけでいいのだからシンプルでいい。またexpiresに過去の日時、max-ageにマイナス値を指定することでクッキーを破棄することができる。max-ageに対して0を与えるとセッションクッキーになるので注意が必要だ。クッキーの更新、削除の際には対象となるクッキーネームのpathとdomainが一致する必要があるり、不一致の場合は別物として新しく登録されてしまう。逆に期限をセットせずにヘッダを飛ばすとこれもセッションクッキーとして扱われる。セッションクッキーはブラウザが閉じられた時点で破棄される(タブを閉じただけでは消えない)。
プレフィクスについて
__Host-name | __Secure-name | |
---|---|---|
Secure | true | true |
path | 必ず"/" | 制約なし |
domain | 必ず空 | 制約なし |
上記が最低限の条件になる。いずれも通常のクッキー同様に時間のコントロールが可能である。
いずれかの制約に漏れるとクッキーがセットできないので注意する必要がある。