ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
基本: セッションの開始と読み書き
// 必ず HTML 出力前に呼ぶ
session_start();
// 書き込み
$_SESSION['user_id'] = 123;
$_SESSION['name'] = 'taro';
$_SESSION['cart'] = ['apple' => 2, 'banana' => 1];
// 読み込み
$id = $_SESSION['user_id'] ?? null;
// 削除
unset($_SESSION['cart']);
// 全クリア
$_SESSION = [];
// セッション破棄 (ログアウト)
session_unset();
session_destroy();
setcookie(session_name(), '', time() - 3600, '/'); // Cookie も消す
動作原理
- クライアントが初回アクセス → サーバが セッション ID を発行
Set-Cookie: PHPSESSID=abc123...でブラウザに渡す- 以降のリクエストでブラウザが Cookie を送信
- サーバは ID をキーにセッションストア (ファイル等) から状態を取得
$_SESSION経由で読み書き → リクエスト終了時に書き戻し
保存先の選択 (php.ini / ini_set)
; php.ini
session.save_handler = files ; デフォルト
session.save_path = "/var/lib/php/sessions"
; Redis
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=password"
; Memcached
session.save_handler = memcached
session.save_path = "127.0.0.1:11211"
; ライフタイム (秒)
session.gc_maxlifetime = 1440
; Cookie 設定
session.cookie_lifetime = 0 ; 0 = ブラウザ閉じるまで
session.cookie_secure = 1 ; HTTPS のみ
session.cookie_httponly = 1 ; JS から読めなくする
session.cookie_samesite = "Lax" ; CSRF 対策
session.use_strict_mode = 1 ; ★ 未知の ID 拒否 (セッション固定化対策)
session.use_only_cookies = 1 ; URL 経由禁止
保存先別の比較
| 保存先 | 速度 | マルチサーバ | 用途 |
|---|---|---|---|
| files (デフォルト) | 速い | X (NFS は不可) | 単一サーバの小規模 |
| Redis | 超速 | O | ★ 推奨。標準的 |
| Memcached | 超速 | O | キャッシュ兼用 |
| DB | 遅め | O | 永続化必要なとき |
セキュリティ: 必ずやること
// 1. ログイン直後にセッション ID を再生成 (セッション固定化対策)
function login(string $email, string $password): bool {
$user = User::findByEmail($email);
if (!$user || !password_verify($password, $user->password_hash)) {
return false;
}
// ★ ここが超重要
session_regenerate_id(true); // 古い ID を破棄
$_SESSION['user_id'] = $user->id;
$_SESSION['logged_in_at'] = time();
return true;
}
// 2. CSRF トークン
$_SESSION['csrf'] ??= bin2hex(random_bytes(32));
// HTMLフォームに埋め込み
?>
<input type="hidden" name="csrf" value="<?= htmlspecialchars($_SESSION['csrf']) ?>">
<?php
// POST 検証
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'] ?? '')) {
http_response_code(419);
exit('CSRF token mismatch');
}
// 3. セッション固定タイマー
if (isset($_SESSION['logged_in_at']) && time() - $_SESSION['logged_in_at'] > 7200) {
session_destroy();
redirect('/login?expired=1');
}
Cookie 属性詳解
| 属性 | 意味 | 推奨 |
|---|---|---|
| HttpOnly | JavaScript から document.cookie で読めない | ★ 必須 (XSS 対策) |
| Secure | HTTPS でしか送信しない | ★ 本番必須 |
| SameSite=Strict | クロスサイト全拒否 | 強い保護だが UX 影響 |
| SameSite=Lax | トップ遷移は許可、リソース送信は不可 | ★ 標準推奨 |
| SameSite=None | 制限なし (Secure 必須) | 3rd party Cookie 必須なとき |
| Domain | Cookie 有効ドメイン | サブドメイン共有時のみ指定 |
| Path | Cookie 有効パス | 通常 / |
// session_start で Cookie 属性を一括指定 (PHP 7.3+)
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
session_start();
Laravel のセッション
// config/session.php
return [
'driver' => env('SESSION_DRIVER', 'redis'), // file / cookie / database / redis / memcached
'lifetime' => env('SESSION_LIFETIME', 120), // 分
'expire_on_close' => false,
'encrypt' => true,
'cookie' => 'myapp_session',
'secure' => env('SESSION_SECURE_COOKIE', true),
'http_only' => true,
'same_site' => 'lax',
];
// .env
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_SECURE_COOKIE=true
// コントローラで
session(['user_id' => 1]);
session('user_id');
session()->forget('user_id');
session()->flush();
// フラッシュ (次のリクエストまで)
session()->flash('message', '保存しました');
// CSRF (自動)
// → form に @csrf を入れるだけで Laravel が検証
Symfony / SPA / JWT との比較
| 方式 | 状態 | サーバスケール | 失効 | 用途 |
|---|---|---|---|---|
| セッション (Cookie) | サーバ持ち | 共有ストア必要 | 即時 (削除) | ★ Web アプリ標準 |
| JWT (Bearer) | クライアント | 水平展開容易 | 困難 (期限まで有効) | SPA / API / モバイル |
| OAuth Access Token | クライアント | 同上 | サーバ側で revoke 可 | 外部連携 |
| Refresh Token + Session | 両方 | 柔軟 | OK | 本格 API |
セッション関連のよくあるトラブル
| 症状 | 原因 | 対処 |
|---|---|---|
| セッションが保持されない | Cookie が送られない / Domain ミス | DevTools で Cookie 確認、Domain 修正 |
| "Cannot send session cookie - headers already sent" | session_start 前に出力済 | BOM 削除、空白除去、output_buffering ON |
| HTTPS で消える | secure=true で HTTP アクセス | HTTPS 統一 or secure を環境変数化 |
| ロードバランサ越しで切れる | files ストアで別サーバへ振分 | Redis 等の共有ストアへ |
| サイズエラー | セッションに巨大データ格納 | 最小限に。データは DB 参照キーだけ |
FAQ
Q: セッションと Cookie の違いは?
A: Cookie はブラウザ保存。セッションはサーバ保存 (識別子だけ Cookie 経由)。秘密情報はセッション側に持つのが安全。
Q: ログアウトで何を呼ぶ?
A: session_unset() + session_destroy() + setcookie(session_name(), '', time()-3600, '/') の 3 点セット。
Q: SPA で JWT と Cookie セッション、どちらが安全?
A: HttpOnly Cookie セッションのほうが XSS 耐性が高い。JWT を localStorage に置くのは XSS で漏洩する。CSRF 対策 (SameSite + トークン) は両者必要。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?