PHPPHPにおけるCookie処理
$_COOKIE
cookie
expires
setcookie
time関数
前回、フロントにおけるCookie処理ということで、
ブラウザ上に残るCookieの操作について解説しました。
変わってバックエンド側(PHP)によるCookie処理について解説していきたいと思います。
バックエンドにおけるCookieとは
フロントでのCookieはユーザーの識別用IDという形で紹介しました。
バックエンド側におけるCookieは、
いろんなデータの中の1種類に過ぎません。
ブラウザはサイトデータの取得時にリクエストという形で、
さまざまなデータをバックエンドに渡します。
PHPを例にとると、
クエリパラメータによるデータは $_GET という形のデータになり、
フォームデータなどは $_POST という形のデータになり、
ブラウザの持つCookieデータは $_COOKIE という形で渡されます。
ブラウザからのCookieデータは、$_COOKIE の中に連想配列の形で格納され、
$_COOKIE['key1']という形でデータを取り出すことができる様になります。
各言語(Go, Python, Ruby等)でもCookieを取り扱うことはできるので、
取り扱いについては各言語の仕様に沿った使い方をしてください。
Cookieを操作する
Cookieを操作するにあたり、
バックエンド側でもライブラリが用意されていたり、フレームワークの中に関数として用意されていたりもしますが、
今回は生のCookieデータをPHPで操作していきます。
php.netのsetcookie関数のページをもとに、
本サイトで試してみて得た結果を記載しています。
CookieをSETする
設定する際は上記で示した関数でCookieを追加していきます。
注意点は、あらゆる出力よりも前に というところです。
※ ですが、これをわざとエラーが出るように記述してもCookieが設定できてしまったので、仕様が変わったのか、書き方が間違っているのかは別の機会に確認したいと思います。
php.netのsetcookie関数ページでは、
関数実行に関して2通りの方法を記載していて、本サイトではoptionを用いた方法を仕様・解説していきます。
setcookie関数の仕様は下記になります。
// 情報を引数として渡す方法
// $expires以降は記述の省略可
setcookie(
string $name,
string $value = "",
int $expires = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false
): bool
// 情報をOptionsとして渡す方法
setcookie(string $name, string $value = "", array $options = []): bool
// 記述例
setcookie(
"key1",
"value1",
[
"expires" => 60,
"path" => "/",
"domain" => "whyisthis.dev",
"secure" => true,
"httponly" => true
]
);
では実際どう記述するかというと、
下記の様になります。
// 値のみ設定する(期限はSessionとなります)
setcookie("key1", "value1");
// 値に期限をつける(2023/02/20 12:00:00から次の日の12:00:00までを有効とする場合)
setcookie("key2", "value2", [
"expires" => time() + (60 * 60 * 24)
]);
// Pathと期限を設定
setcookie("key3", "value3", [
"expires" => time() + (60 * 60 * 24),
"path" => "/"
]);
// DomainとPathと期限を設定
setcookie("key4", "value4", [
"expires" => time() + (60 * 60 * 24),
"path" => "/",
"domain" => "whyisthis.dev"
]);
Cookieをセットするにあたり注意する点が一つあります。
フロントでは期限を設定するにあたり Max-Age という項目がありましたが、
setcookie関数では使用できません。
expires に統合されているため、期限の設定には必ずこちらを使いましょう。
Cookieの期限を設定する
期限の設定には、現在時間を取得する time関数を使用し、
そこから何秒間という形で設定します。
CookieをGETする
Cookieのデータを取得するのは、冒頭でも記述したように、
GlOBAL変数で用意されているので、
下記のように取得してください。
フロントのように何かしらの処理を行うということはありません。
$_COOKIE['key1']
CookieをDELETEする
Cookieを削除するには、原則が2つあります。
その1 期限を過去のものに設定する。
その2 付加した同じ情報を設定する。
期限を過去のものにするというのは time関数 にマイナス値を足すことで表現できます。
付加した同じ情報を設定するというのは、フロントと同じで、付与されている情報と違っていた場合には削除できません。
セットしたCookieを削除するための記述例を出したいと思います。
setcookie("key1", "", [
"expires" => time() - 1
]);
setcookie("key2", "", [
"expires" => time() - 1
]);
setcookie("key3", "", [
"expires" => time() - 1,
"path" => "/"
]);
setcookie("key4", "", [
"expires" => time() - 1,
"path" => "/",
"domain" => "whyisthis.dev"
]);
まとめ
PHPでCookie情報を触るだけであれば、それほど難しくないと思います。
問題はフロント側とバックエンド側でデータをやり取りするための仕組みを、
どう使い、どう処理するかが難しいところなので、
その辺りは自身にとっても課題となるところではあります。
こちらの情報も一度試して、動作が確認できた上での使用を押し薄めしています。
この情報により、損失・不利益が生じても補償はできません。