はじめに
PHP8技術者認定試験 上級の問題集では、クッキーのSameSite属性に関する出題があります。
特に setcookie()
関数での新しいオプション指定方法(配列形式)は、バージョンアップで追加されたポイントなので、試験対策としてしっかり押さえておきましょう。
目次
コード例
<?php
declare(strict_types=1);
error_reporting(-1);
setcookie(
'SameSite',
'value',
['samesite' => 'Strict', 'expires' => time() + 15552000]
);
echo "<pre>";
var_dump(headers_list());
SameSite属性の種類と違い
SameSite には3つの指定方法があり、それぞれクッキーが送信される条件が異なります。
属性 | 説明 | 典型的な用途 |
---|---|---|
Strict | 完全に同一サイトからのリクエストでのみ送信される。他サイトからのリンクやフォーム送信時には送られない。 | CSRF対策を最優先にしたい場合 |
Lax | 通常のクロスサイトリクエストでは送信されないが、GETリンク遷移やトップレベルナビゲーション時には送信される。 | 多くのサイトのデフォルト。利便性とセキュリティのバランス |
None | 制限なし。クロスサイトでも送信される。ただし、Secure属性(HTTPSのみ送信)必須。 | 外部サービス連携(CDN、OAuth、外部ログインなど) |
解説
配列形式でオプション指定(PHP7.3以降)
samesite
キーで SameSite 属性を設定可能'Strict'
,'Lax'
,'None'
を指定できる
expires の指定
time() + 15552000
で約180日後まで有効
ブラウザに送られるHTTPレスポンスヘッダー
実際には以下のようなヘッダーが送信されます:
Set-Cookie: SameSite=value; expires=...; Max-Age=15552000; path=/; samesite=Strict
headers_list() で確認できる
headers_list()
は、送信予定のレスポンスヘッダーを確認できる関数です。- デバッグや挙動確認に便利。
まとめ
- SameSite属性は Strict / Lax / None の3種類
setcookie()
の配列形式オプション(PHP7.3以降)でsamesite
を指定できる- クッキー送信条件を適切に設定することで、セキュリティ(CSRF対策) と 利便性 を両立可能
👉 試験では「SameSite属性の違いを理解しているか」が狙われます。