LoginSignup
1
1

Cookie セッション 質問回答例

Last updated at Posted at 2023-10-22

基本的な違い:

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
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
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;
}
  1. クロスサイトスクリプティング(XSS)攻撃
    ウェブページの出力処理の問題を利用してスクリプトを埋め込み、そのページを閲覧する利用者を攻撃する手法。
    https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html

  2. クロスサイトリクエストフォージェリ(CSRF)攻撃
    ウェブサイトが利用者のリクエストを正確に識別しないと、外部からの悪意あるリクエストを受け入れ、「CSRF脆弱性」という問題が生じ、それを利用した「CSRF攻撃」が可能となる。
    https://www.ipa.go.jp/security/vuln/websecurity/csrf.html

  3. EU一般データ保護規則(GDPR)
    2018年に施行されたGDPRはEUの市民のデータ保護を目的とした法律。Cookieが個人の識別に利用できる情報を含む場合にその使用にはユーザーの明示的な同意が必要となる。
    https://www.ppc.go.jp/enforcement/infoprovision/EU/

  4. ePrivacy Directive(電子プライバシー指令)
    EU域内での電子通信のプライバシーを保護するための指令。Cookieや類似の技術を使用する場合、ユーザーに情報を提供し、同意を得る必要がある。
    https://www.cloudflare.com/ja-jp/learning/privacy/what-is-eprivacy-directive/

  5. 電気通信事業法改正
    2023年6月16日に施行された。利用者に関する情報の外部送信に対する規制が新設され、Cookie情報の利用を規制する側面があることから、「Cookie規制」と呼ばれることもある。
    Googleアナリティクスや広告タグなどを設置しているサイトは、送信される情報・送信先となる氏名/名称・情報の利用目的を、利用者の目につきやすい状態にしなければならない。
    https://keiyaku-watch.jp/media/hourei/denkitsuushinjigyouhou_kaisei_2023/

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1