基本的な違い:
Q. Cookieとセッションの基本的な違いは何か?
A. 保存場所が異なる。Cookieはブラウザなどのクライアントに保存される小さなデータ片で、セッションはサーバー側でユーザーの情報を一時的に保持する。
Q. Cookieとセッションはどのように動作するか?
A. Cookieはクライアントにデータを保存し、ユーザーがサイトを再訪問する際にそのデータをサーバーに自動的に送信する。セッションはサーバー上でユーザーのデータを一時的に保持し、そのセッションを識別するIDをCookieを介してブラウザに送信する。ユーザーがページを移動するたびに、このIDを用いてサーバーはユーザー情報を参照する。
Q. Cookieとセッションの主な目的は何か?
Cookieの主な目的は、ブラウザにユーザーの設定や状態を長期間保存し、サイト訪問の度にその情報をサーバーに伝えることである。セッションの主な目的は、ユーザーの一時的な情報や活動状態をサーバー側で短期間追跡・管理することである。
セキュリティ:
Q. Cookieとセッションはどのようにセキュリティを確保するか?
Cookieのセキュリティ対策は、HTTPS経由でのみ送信可能にするSecureフラグや、クライアント側からアクセス不可能にし、クロスサイトスクリプティング(XSS)攻撃1のリスクを低減させるHttpOnlyフラグ、クロスサイトリクエストフォージェリ(CSRF)攻撃2を防ぐためのSameSite属性、そして適切な有効期限を設定することなどが挙げられる。
セッションのセキュリティ対策は、ユーザーがログインする度にセッションIDを再生成することや、暗号化されたセッションデータを保存することや、短いセッションタイムアウトを設定することなどが挙げられる。
パフォーマンスと効率:
Q. 大量のデータを格納する場合、Cookieとセッションのどちらが効率的か?
Cookieに保存できるデータは約4KBであり、セッションはサーバー側で格納されるため大量のデータを保存することが可能。さらにセッションはサーバー側に保存されるためHTTPリクエストにおけるパフォーマンスには影響を受けないが、Cookieは毎回のHTTPリクエストに付随して送信されるためパフォーマンスに影響を及ぼす場合がある。そのため、大量のデータを格納するのはセッションがより効率的である。
また、セキュリティの観点からもCookieの場合は必ずHTTPリクエストに付随して送信されるのに対し、セッションはサーバー側に閉じているので、セッションのほうがより望ましいと言える。
法律と規制:
Q. Cookieやセッションデータの保管に関連する法律や規制は何か?
国外ではEU一般データ保護規則(GDPR)3やPrivacy Directive(電子プライバシー指令)4、国内では電気通信事業法改正5が挙げられる。
応用例:
Q. Cookieとセッションを使用した実際のアプリケーションの例は?
ログイン状態の保持や、ECサイトのショッピングカート、言語や地域の設定などの個人設定の維持に利用される。
Q. Cookieとセッションを使用してユーザー認証をどのように実装するか?
基本的にはフレームワークを利用して実装するのが望ましい。PHPフレームワークのLaravelであればLaravel Sanctumなど。なお、以下のコード片はフレームワークを利用せずにPHPで実装したもの。(※認証部分は実装していないので、本番環境では絶対に利用しないでください。)
https://github.com/kshiva-toybox/vanilla-php-auth
index.php
<?php
// セッションを開始する
session_start();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHP Auth Sample</title>
</head>
<body>
<? if (isset($_SESSION['id'])) : ?>
<h1>Hello, <?= $_SESSION['id'] ?>!</h1>
<? else : ?>
<h1>ログイン</h1>
<form action="/login.php" method="post">
<label for="id">
ID:
<input type="text" id="id" name="id" required>
</label>
<label for="password">
パスワード:
<input type="password" id="password" name="password" required>
</label>
<button type="submit">送信</button>
</form>
<? endif; ?>
</body>
</html>
login.php
<?php
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
// POSTでなければログイン画面にリダイレクトする
header('Location: /index.php');
exit;
}
$id = $_POST['id'];
$password = $_POST['password'];
// 認証する
$result = auth($id, $password);
if (!$result) {
// 認証に失敗したらログイン画面にリダイレクトする
header('Location: /index.php');
exit;
}
// セッションにログイン情報を保存する
// セッションを開始する
session_start();
// セッションにログイン情報を保存する
$_SESSION['id'] = $id;
// ログイン後の画面にリダイレクトする
header('Location: /index.php');
exit;
function auth($id, $password)
{
// 今回は便宜上認証は成功するという前提で実装する
return true;
}
-
クロスサイトスクリプティング(XSS)攻撃
ウェブページの出力処理の問題を利用してスクリプトを埋め込み、そのページを閲覧する利用者を攻撃する手法。
https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html ↩ -
クロスサイトリクエストフォージェリ(CSRF)攻撃
ウェブサイトが利用者のリクエストを正確に識別しないと、外部からの悪意あるリクエストを受け入れ、「CSRF脆弱性」という問題が生じ、それを利用した「CSRF攻撃」が可能となる。
https://www.ipa.go.jp/security/vuln/websecurity/csrf.html ↩ -
EU一般データ保護規則(GDPR)
2018年に施行されたGDPRはEUの市民のデータ保護を目的とした法律。Cookieが個人の識別に利用できる情報を含む場合にその使用にはユーザーの明示的な同意が必要となる。
https://www.ppc.go.jp/enforcement/infoprovision/EU/ ↩ -
ePrivacy Directive(電子プライバシー指令)
EU域内での電子通信のプライバシーを保護するための指令。Cookieや類似の技術を使用する場合、ユーザーに情報を提供し、同意を得る必要がある。
https://www.cloudflare.com/ja-jp/learning/privacy/what-is-eprivacy-directive/ ↩ -
電気通信事業法改正
2023年6月16日に施行された。利用者に関する情報の外部送信に対する規制が新設され、Cookie情報の利用を規制する側面があることから、「Cookie規制」と呼ばれることもある。
Googleアナリティクスや広告タグなどを設置しているサイトは、送信される情報・送信先となる氏名/名称・情報の利用目的を、利用者の目につきやすい状態にしなければならない。
https://keiyaku-watch.jp/media/hourei/denkitsuushinjigyouhou_kaisei_2023/ ↩