クッキー
HTTPクッキー(Webクッキー、ブラウザクッキー)は、サーバーがユーザーのWebブラウザーに送信する小さなデータです。ブラウザはそれを保存し、後で同じサーバーへのリクエストとともに送り返す場合があります。一般的に、2つのリクエストが同じブラウザから来たかどうかを判断するために使用されます。たとえば、ユーザーのログイン状態を維持します。ステートレスなHTTPプロトコルに対してステートフルな情報を記憶します。
クッキーは主に3つの目的で使用されます
セッション管理:ログイン、ショッピングカート、ゲームスコア、またはサーバーが記憶しておく必要のあるもの
パーソナライズ:ユーザー設定、テーマ、その他の設定
追跡:ユーザー行動の記録と分析
ブラウザに効率的にクッキーを送信できるように、CodeIgniterはクッキーのやり取りを抽象化するためのCodeIgniter\Cookie\Cookie
クラスを提供しています。
クッキーの作成
現在、新しいCookie
値オブジェクトを作成する方法は4つあります。
<?php
use CodeIgniter\Cookie\Cookie;
use DateTime;
// Using the constructor
$cookie = new Cookie(
'remember_token',
'f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',
[
'expires' => new DateTime('+2 hours'),
'prefix' => '__Secure-',
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'raw' => false,
'samesite' => Cookie::SAMESITE_LAX,
]
);
// Supplying a Set-Cookie header string
$cookie = Cookie::fromHeaderString(
'remember_token=f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6; Path=/; Secure; HttpOnly; SameSite=Lax',
false, // raw
);
// Using the fluent builder interface
$cookie = (new Cookie('remember_token'))
->withValue('f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6')
->withPrefix('__Secure-')
->withExpires(new DateTime('+2 hours'))
->withPath('/')
->withDomain('')
->withSecure(true)
->withHTTPOnly(true)
->withSameSite(Cookie::SAMESITE_LAX);
// Using the global function `cookie` which implicitly calls `new Cookie()`
$cookie = cookie('remember_token', 'f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6');
Cookie
オブジェクトを構築する際、name
属性のみが必須です。その他はすべてオプションです。オプションの属性が変更されていない場合、それらの値はCookie
クラスに保存されているデフォルト値で埋められます。
デフォルトのオーバーライド
クラスに現在保存されているデフォルトをオーバーライドするには、Config\Cookie
インスタンスまたはデフォルトの配列を、静的なCookie::setDefaults()
メソッドに渡すことができます。
<?php
use CodeIgniter\Cookie\Cookie;
use Config\Cookie as CookieConfig;
// pass in a Config\Cookie instance before constructing a Cookie class
Cookie::setDefaults(new CookieConfig());
$cookie = new Cookie('login_token');
// pass in an array of defaults
$myDefaults = [
'expires' => 0,
'samesite' => Cookie::SAMESITE_STRICT,
];
Cookie::setDefaults($myDefaults);
$cookie = new Cookie('login_token');
Config\Cookie
インスタンスまたは配列をCookie::setDefaults()
に渡すと、デフォルトが効果的に上書きされ、新しいデフォルトが渡されるまで保持されます。
限られた時間だけデフォルトを変更する
この動作を望まず、限られた時間だけデフォルトを変更したい場合は、古いデフォルト配列を返すCookie::setDefaults()
の戻り値を利用できます。
<?php
use CodeIgniter\Cookie\Cookie;
use Config\Cookie as CookieConfig;
$oldDefaults = Cookie::setDefaults(new CookieConfig());
$cookie = new Cookie('my_token', 'muffins');
// return the old defaults
Cookie::setDefaults($oldDefaults);
クッキーの属性へのアクセス
インスタンス化すると、ゲッターメソッドの1つを使用してCookie
の属性に簡単にアクセスできます。
<?php
use CodeIgniter\Cookie\Cookie;
use DateTime;
use DateTimeZone;
$cookie = new Cookie(
'remember_token',
'f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',
[
'expires' => new DateTime('2025-02-14 00:00:00', new DateTimeZone('UTC')),
'prefix' => '__Secure-',
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'raw' => false,
'samesite' => Cookie::SAMESITE_LAX,
]
);
$cookie->getName(); // 'remember_token'
$cookie->getPrefix(); // '__Secure-'
$cookie->getPrefixedName(); // '__Secure-remember_token'
$cookie->getExpiresTimestamp(); // Unix timestamp
$cookie->getExpiresString(); // 'Fri, 14-Feb-2025 00:00:00 GMT'
$cookie->isExpired(); // false
$cookie->getMaxAge(); // the difference from time() to expires
$cookie->isRaw(); // false
$cookie->isSecure(); // true
$cookie->getPath(); // '/'
$cookie->getDomain(); // ''
$cookie->isHTTPOnly(); // true
$cookie->getSameSite(); // 'Lax'
// additional getter
$cookie->getId(); // '__Secure-remember_token;;/'
// when using `setcookie()`'s alternative signature on PHP 7.3+
// you can easily use the `getOptions()` method to supply the
// $options parameter
$cookie->getOptions();
イミュータブルクッキー
新しいCookie
インスタンスは、HTTPクッキーのイミュータブルな値オブジェクト表現です。イミュータブルであるため、インスタンスの属性を変更しても元のインスタンスには影響しません。変更は常に新しいインスタンスを返します。それを使用するには、この新しいインスタンスを保持する必要があります。
<?php
use CodeIgniter\Cookie\Cookie;
$cookie = new Cookie('login_token', 'admin');
$cookie->getName(); // 'login_token'
$cookie->withName('remember_token');
$cookie->getName(); // 'login_token'
$new = $cookie->withName('remember_token');
$new->getName(); // 'remember_token'
クッキーの属性の検証
HTTPクッキーは、ブラウザに受け入れられるために従う必要のあるいくつかの仕様によって規制されています。したがって、Cookie
の特定の属性を作成または変更するとき、これらが仕様に従っているかどうかを確認するために検証されます。
違反が報告された場合、CookieException
がスローされます。
Name属性の検証
クッキー名は、次のものを除く任意のUS-ASCII文字を使用できます。
制御文字。
スペースまたはタブ。
区切り文字。たとえば、
( ) < > @ , ; : \ " / [ ] ? = { }
$raw
パラメーターをtrue
に設定すると、この検証は厳密に行われます。これは、PHPのsetcookie()とsetrawcookie()が無効な名前のクッキーを拒否するためです。さらに、クッキー名を空の文字列にすることはできません。
Prefix属性の検証
__Secure-
プレフィックスを使用する場合、クッキーは$secure
フラグがtrue
に設定された状態で設定する必要があります。__Host-
プレフィックスを使用する場合、クッキーは次のものを示す必要があります。
$secure
フラグがtrue
に設定されている$domain
が空である$path
が/
である必要がある
SameSite属性の検証
SameSite属性は、次の3つの値のみを受け入れます。
Lax:クッキーは、通常のクロスサイトのサブリクエスト(たとえば、画像やフレームをサードパーティのサイトにロードする場合)では送信されませんが、ユーザーが元のサイトに移動するとき(つまり、リンクをたどるとき)に送信されます。
Strict:クッキーはファーストパーティのコンテキストでのみ送信され、サードパーティのWebサイトによって開始されたリクエストとともに送信されることはありません。
None:クッキーはすべてのコンテキストで送信されます。つまり、ファーストパーティとクロスオリジンの両方のリクエストへのレスポンスで送信されます。
ただし、CodeIgniterでは、SameSite属性を空の文字列に設定できます。空の文字列が指定された場合、Cookie
クラスに保存されているデフォルトのSameSite設定が使用されます。上記で説明したように、Cookie::setDefaults()
を使用することで、デフォルトのSameSiteを変更できます。
最近のクッキー仕様の変更により、最新のブラウザでは、何も指定されていない場合にデフォルトの SameSite を設定する必要が生じています。このデフォルト値は Lax
です。もし SameSite が空文字列に設定されており、デフォルトの SameSite も空文字列の場合、クッキーには Lax
値が設定されます。
SameSite が None
に設定されている場合、Secure
も true
に設定する必要があります。
SameSite 属性を記述する際、Cookie
クラスでは、大文字・小文字を区別せずに値を指定できます。また、このクラスの定数を利用すると、設定が簡単になります。
<?php
use CodeIgniter\Cookie\Cookie;
Cookie::SAMESITE_LAX; // 'lax'
Cookie::SAMESITE_STRICT; // 'strict'
Cookie::SAMESITE_NONE; // 'none'
クッキーの送信
Response オブジェクトの CookieStore
に Cookie
オブジェクトを設定すると、フレームワークが自動的にクッキーを送信します。
CodeIgniter\HTTP\Response::setCookie()
を使用して設定します。
<?php
use CodeIgniter\Cookie\Cookie;
use Config\Services;
$response = Services::response();
$cookie = new Cookie(
'remember_token',
'f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',
[
'max-age' => 3600 * 2, // Expires in 2 hours
]
);
$response->setCookie($cookie);
また、set_cookie()
ヘルパー関数も使用できます。
<?php
use CodeIgniter\Cookie\Cookie;
helper('cookie');
$cookie = new Cookie(
'remember_token',
'f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',
[
'max-age' => 3600 * 2, // Expires in 2 hours
]
);
set_cookie($cookie);
クッキー ストアの使用
注意
通常、CookieStore を直接使用する必要はありません。
CookieStore
クラスは、Cookie
オブジェクトの変更不可能なコレクションを表します。
Response からのストアの取得
CookieStore
インスタンスは、現在の Response
オブジェクトからアクセスできます。
<?php
use Config\Services;
$cookieStore = Services::response()->getCookieStore();
CookieStore の作成
CodeIgniter は、CookieStore
の新しいインスタンスを作成するための 3 つの方法を提供しています。
<?php
use CodeIgniter\Cookie\Cookie;
use CodeIgniter\Cookie\CookieStore;
// Passing an array of `Cookie` objects in the constructor
$store = new CookieStore([
new Cookie('login_token'),
new Cookie('remember_token'),
]);
// Passing an array of `Set-Cookie` header strings
$store = CookieStore::fromCookieHeaders([
'remember_token=me; Path=/; SameSite=Lax',
'login_token=admin; Path=/; SameSite=Lax',
]);
// using the global `cookies` function
$store = cookies([new Cookie('login_token')], false);
// retrieving the `CookieStore` instance saved in our current `Response` object
$store = cookies();
注意
グローバル cookies()
関数を使用する場合、渡された Cookie
配列は、2 番目の引数 $getGlobal
が false
に設定されている場合にのみ考慮されます。
ストア内のクッキーの確認
Cookie
オブジェクトが CookieStore
インスタンスに存在するかどうかを確認するには、いくつかの方法があります。
<?php
use CodeIgniter\Cookie\Cookie;
use CodeIgniter\Cookie\CookieStore;
use Config\Services;
// check if cookie is in the current cookie collection
$store = new CookieStore([
new Cookie('login_token'),
new Cookie('remember_token'),
]);
$store->has('login_token');
// check if cookie is in the current Response's cookie collection
cookies()->has('login_token');
Services::response()->hasCookie('remember_token');
// using the cookie helper to check the current Response
// not available to v4.1.1 and lower
helper('cookie');
has_cookie('login_token');
ストア内のクッキーの取得
クッキーコレクション内の Cookie
インスタンスを取得するのは非常に簡単です。
<?php
use CodeIgniter\Cookie\Cookie;
use CodeIgniter\Cookie\CookieStore;
use Config\Services;
// getting cookie in the current cookie collection
$store = new CookieStore([
new Cookie('login_token'),
new Cookie('remember_token'),
]);
$store->get('login_token');
// getting cookie in the current Response's cookie collection
cookies()->get('login_token');
Services::response()->getCookie('remember_token');
// using the cookie helper to get cookie from the Response's cookie collection
helper('cookie');
get_cookie('remember_token');
CookieStore
から直接 Cookie
インスタンスを取得する場合、無効な名前を指定すると CookieException
がスローされます。
<?php
// throws CookieException
$store->get('unknown_cookie');
現在の Response
のクッキーコレクションから Cookie
インスタンスを取得する場合、無効な名前を指定すると null
が返されます。
<?php
cookies()->get('unknown_cookie'); // null
Response
からクッキーを取得する際に引数が何も指定されていない場合、ストア内のすべての Cookie
オブジェクトが表示されます。
<?php
use Config\Services;
cookies()->get(); // array of Cookie objects
// alternatively, you can use the display method
cookies()->display();
// or even from the Response
Services::response()->getCookies();
注意
ヘルパー関数 get_cookie()
は、Response
からではなく、現在の Request
オブジェクトからクッキーを取得します。この関数は、そのクッキーが設定されている場合、$_COOKIE
配列をチェックし、すぐに取得します。
ストアへのクッキーの追加/削除
前述のように、CookieStore
オブジェクトは変更不可能です。変更したインスタンスを保存して、それを操作する必要があります。元のインスタンスは変更されません。
<?php
use CodeIgniter\Cookie\Cookie;
use CodeIgniter\Cookie\CookieStore;
use Config\Services;
$store = new CookieStore([
new Cookie('login_token'),
new Cookie('remember_token'),
]);
// adding a new Cookie instance
$new = $store->put(new Cookie('admin_token', 'yes'));
// removing a Cookie instance
$new = $store->remove('login_token');
注意
ストアからクッキーを削除しても、ブラウザから削除されるわけではありません。ブラウザから クッキーを削除する場合は、同じ名前で空の値を指定したクッキーをストアに保存する必要があります。
現在の Response
オブジェクトのストア内のクッキーを操作する場合、クッキーコレクションの変更不可能な性質を心配することなく、安全にクッキーを追加または削除できます。Response
オブジェクトは、インスタンスを変更されたインスタンスに置き換えます。
<?php
use Config\Services;
Services::response()->setCookie('admin_token', 'yes');
Services::response()->deleteCookie('login_token');
// using the cookie helper
helper('cookie');
set_cookie('admin_token', 'yes');
delete_cookie('login_token');
ストア内のクッキーのディスパッチ
バージョン 4.1.6 から非推奨になりました。
重要
このメソッドは非推奨です。将来のリリースで削除されます。
ほとんどの場合、クッキーを手動で送信する必要はありません。CodeIgniter がこれを行います。ただし、どうしても手動でクッキーを送信する必要がある場合は、dispatch
メソッドを使用できます。他のヘッダーを送信する場合と同様に、headers_sent()
の値を確認して、ヘッダーがまだ送信されていないことを確認する必要があります。
<?php
use CodeIgniter\Cookie\Cookie;
use CodeIgniter\Cookie\CookieStore;
$store = new CookieStore([
new Cookie('login_token'),
new Cookie('remember_token'),
]);
$store->dispatch(); // After dispatch, the collection is now empty.
クッキーのカスタマイズ
クッキーオブジェクトのスムーズな作成を確実にするために、Cookie
クラスには適切なデフォルト値がすでに設定されています。ただし、app/Config/Cookie.php ファイル内の Config\Cookie
クラスで次の設定を変更して、独自の設定を定義できます。
設定 |
オプション/タイプ |
デフォルト |
説明 |
---|---|---|---|
$prefix |
|
|
クッキー名の先頭に追加するプレフィックス。 |
$expires |
|
|
有効期限のタイムスタンプ。 |
$path |
|
|
クッキーのパス プロパティ。 |
$domain |
|
|
クッキーのドメイン プロパティ。末尾にスラッシュ付き。 |
$secure |
|
|
セキュアな HTTPS 経由で送信するかどうか。 |
$httponly |
|
|
JavaScript からアクセスできない場合。 |
$samesite |
|
|
SameSite 属性。 |
$raw |
|
|
|
実行時には、Cookie::setDefaults()
メソッドを使用して、新しいデフォルトを手動で指定できます。
クラス リファレンス
- class CodeIgniter\Cookie\Cookie
- static setDefaults([$config = []])
- パラメーター:
$config (
\Config\Cookie|array
) – 設定配列またはインスタンス
- 戻り値の型:
配列
- 戻り値:
古いデフォルト値
Config\Cookie
設定または配列から値を注入して、Cookie インスタンスにデフォルトの属性を設定します。
- static fromHeaderString(string $header[, bool $raw = false])
- パラメーター:
$header (
string
) –Set-Cookie
ヘッダー文字列$raw (
bool
) – このクッキーが URL エンコードされずにsetrawcookie()
で送信されるかどうか
- 戻り値の型:
クッキー
- 戻り値:
Cookie
インスタンス- スロー:
CookieException
Set-Cookie
ヘッダーから新しい Cookie インスタンスを作成します。
- __construct(string $name[, string $value = ''[, array $options = []]])
- パラメーター:
$name (
string
) – クッキー名$value (
string
) – クッキー値$options (
array
) – クッキー オプション
- 戻り値の型:
クッキー
- 戻り値:
Cookie
インスタンス- スロー:
CookieException
新しい Cookie インスタンスを構築します。
- getId()
- 戻り値の型:
文字列
- 戻り値:
クッキーコレクション内のインデックスに使用される ID。
- getPrefix() → string
- getName() → string
- getPrefixedName() → string
- getValue() → string
- getExpiresTimestamp() → int
- getExpiresString() → string
- isExpired() → bool
- getMaxAge() → int
- getDomain() → string
- getPath() → string
- isSecure() → bool
- isHTTPOnly() → bool
- getSameSite() → string
- isRaw() → bool
- getOptions() → array
- withRaw([bool $raw = true])
- パラメーター:
$raw (
bool
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
URLエンコードオプションを更新した新しいCookieを作成します。
- withPrefix([string $prefix = ''])
- パラメーター:
$prefix (
string
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しいプレフィックスを持つ新しいCookieを作成します。
- withName(string $name)
- パラメーター:
$name (
string
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しい名前を持つ新しいCookieを作成します。
- withValue(string $value)
- パラメーター:
$value (
string
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しい値を持つ新しいCookieを作成します。
- withExpires($expires)
- パラメーター:
$expires (
DateTimeInterface|string|int
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しいクッキーの有効期限を持つ新しいクッキーを作成します。
- withExpired()
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
ブラウザから有効期限が切れる新しいCookieを作成します。
- withNeverExpiring()
バージョン4.2.6から非推奨。
重要
このメソッドは非推奨です。将来のリリースで削除されます。
- パラメーター:
$name (
string
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
事実上、有効期限が切れない新しいCookieを作成します。
- withDomain(?string $domain)
- パラメーター:
$domain (
string|null
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しいドメインを持つ新しいCookieを作成します。
- withPath(?string $path)
- パラメーター:
$path (
string|null
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しいパスを持つ新しいCookieを作成します。
- withSecure([bool $secure = true])
- パラメーター:
$secure (
bool
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しい「Secure」属性を持つ新しいCookieを作成します。
- withHTTPOnly([bool $httponly = true])
- パラメーター:
$httponly (
bool
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しい「HttpOnly」属性を持つ新しいCookieを作成します。
- withSameSite(string $samesite)
- パラメーター:
$samesite (
string
) –
- 戻り値の型:
クッキー
- 戻り値:
新しい
Cookie
インスタンス
新しい「SameSite」属性を持つ新しいCookieを作成します。
- toHeaderString()
- 戻り値の型:
文字列
- 戻り値:
ヘッダ文字列として渡すことができる文字列表現を返します。
- toArray()
- 戻り値の型:
配列
- 戻り値:
Cookieインスタンスの配列表現を返します。
- class CodeIgniter\Cookie\CookieStore
- static fromCookieHeaders(array $headers[, bool $raw = false])
- パラメーター:
$header (
array
) –Set-Cookie
ヘッダーの配列$raw (
bool
) – URLエンコーディングを使用しないかどうか
- 戻り値の型:
CookieStore
- 戻り値:
CookieStore
インスタンス- スロー:
CookieException
Set-Cookie
ヘッダーの配列からCookieStoreを作成します。
- __construct(array $cookies)
- パラメーター:
$cookies (
array
) –Cookie
オブジェクトの配列
- 戻り値の型:
CookieStore
- 戻り値:
CookieStore
インスタンス- スロー:
CookieException
- has(string $name[, string $prefix = ''[, ?string $value = null]]) → bool
- パラメーター:
$name (
string
) – クッキー名$prefix (
string
) – クッキーのプレフィックス$value (
string|null
) – クッキーの値
- 戻り値の型:
bool
- 戻り値:
名前とプレフィックスで識別される
Cookie
オブジェクトがコレクションに存在するかどうかを確認します。
- get(string $name[, string $prefix = '']) → Cookie
- パラメーター:
$name (
string
) – クッキー名$prefix (
string
) – クッキーのプレフィックス
- 戻り値の型:
クッキー
- 戻り値:
名前とプレフィックスで識別される Cookie のインスタンスを取得します。
- スロー:
CookieException
- put(Cookie $cookie) → CookieStore
- パラメーター:
$cookie (
Cookie
) – Cookie オブジェクト
- 戻り値の型:
CookieStore
- 戻り値:
新しい
CookieStore
インスタンス
新しいクッキーを保存し、新しいコレクションを返します。元のコレクションは変更されません。
- remove(string $name[, string $prefix = '']) → CookieStore
- パラメーター:
$name (
string
) – クッキー名$prefix (
string
) – クッキーのプレフィックス
- 戻り値の型:
CookieStore
- 戻り値:
新しい
CookieStore
インスタンス
コレクションからクッキーを削除し、更新されたコレクションを返します。元のコレクションは変更されません。
- dispatch() → void
- 戻り値の型:
void
ストア内のすべてのクッキーをディスパッチします。
- display() → array
- 戻り値の型:
配列
- 戻り値:
ストア内のすべてのクッキーインスタンスを返します。
- clear() → void
- 戻り値の型:
void
クッキーコレクションをクリアします。