見出し画像

cookieがどうやって登録されるのか調べてみた

Webサイトにアクセスするとよく出てくるcookieですが、その仕組みについてはあまり理解ができておらず、実際にcookieがどうやってブラウザに登録されるものなのか確認してみました。

Cookieに関する基礎知識

Cookieは、ユーザーのブラウザに保存される小さなデータ片であり、ウェブサイトがユーザーの情報を記憶するために使用されます。Cookieは、セッション管理、ユーザー追跡、カスタマイズされたユーザー体験の提供などに利用されます。Cookieには以下の属性があります:
• 名前:Cookieの名前
• 値:Cookieに格納されるデータ
• 有効期限:Cookieの有効期限
• パス:Cookieが有効なURLパス
• ドメイン:Cookieが有効なドメイン
• セキュア属性:HTTPS接続でのみCookieを送信するかどうか
• HttpOnly属性:JavaScriptからアクセスできないようにするかどうか
• SameSite属性:クロスサイトリクエスト時にCookieを送信するかどうか

Docker ComposeでApacheとPHPの環境をセットアップ

docker-compose.yamlとDockerfileを準備

まず、docker-compose.yamlファイルとDockerfileを準備します。これにより、ApacheとPHPの環境を簡単にセットアップできます。

Dockerfileの準備

FROM php:8.0-apache

RUN docker-php-ext-install pdo pdo_mysql && \
    apt-get update && \
    apt-get install -y libpng-dev

COPY . /var/www/html

CMD ["apache2-foreground"]

docker-compose.yamlの準備

version: '3.8'

services:
  web:
    build: 
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

上記のファイルを同じディレクトリに入れ、次に、Docker Composeを使用して環境を立ち上げます。

docker compose up -d

ApacheとPHPの環境が立ち上がり、ディレクトリのアクセス権限などを適切に設定することで、http://localhost:8080にアクセスできるようになります。

Cookieを反映させるサーバ側の設定

setcookie.phpの準備

setcookie.phpファイルを作成し、ブラウザにCookieを設定するスクリプトを記述します。

<?php
// Cookieの名前
$cookie_name = "user";
// Cookieの値
$cookie_value = "hoge hoge";
// 有効期限を設定(現在の時刻から30日後)
$expiry = time() + (86400 * 30); // 86400秒は1日

// Cookieを設定(secure, HttpOnly属性付き)
setcookie($cookie_name, $cookie_value, [
    'expires' => $expiry,
    'path' => '/',
    'secure' => true, // secure属性
    'httponly' => true, // HttpOnly属性
    'samesite' => 'Strict' // SameSite属性(Lax, Strict, Noneのいずれかを指定)
]);

?>

setcookie()について

setcookie()関数は、以下の形式で使用されます:

setcookie($name, $value, [
    'expires' => $expiry,
    'path' => '/',
    'domain' => '', // ドメインを指定する場合はここに記述
    'secure' => true, // secure属性
    'httponly' => true, // HttpOnly属性
    'samesite' => 'Strict' // SameSite属性(Lax, Strict, Noneのいずれかを指定)
]);

• expires: Cookieの有効期限をUnixタイムスタンプで指定します。
• path: Cookieが有効なパスを指定します。デフォルトは/で、サイト全体で有効になります。
• domain: Cookieが有効なドメインを指定します。省略すると、現在のドメインになります。
• secure: trueにすると、CookieはHTTPS接続でのみ送信されます。
• httponly: trueにすると、JavaScriptからアクセスできなくなります。
• samesite: Strict, Lax, Noneのいずれかを指定し、クロスサイトリクエスト時のCookie送信を制御します。

クライアント側からアクセス

Secure属性がfalseの場合

secure属性をfalseに設定すると、HTTP接続でもCookieが登録されます。

setcookie($cookie_name, $cookie_value, [
    'expires' => $expiry,
    'path' => '/',
    'secure' => false, // secure属性がfalse
    'httponly' => true,
    'samesite' => 'Strict'
]);

ブラウザでhttp://localhost:8080/setcookie.phpにアクセスすると、Cookieが登録されていることを確認できます。

Secure属性がtrueの場合

setcookie($cookie_name, $cookie_value, [
    'expires' => $expiry,
    'path' => '/',
    'secure' => true, // secure属性がtrue
    'httponly' => true,
    'samesite' => 'Strict'
]);

ブラウザでhttp://localhost:8080/setcookie.phpにアクセスしても、Cookieが登録されないことが確認できます。

Secure属性がtrueの場合、HTTPS通信ではCookieが登録される

secure属性をtrueに設定し、HTTPS接続でアクセスすると、Cookieが正常に登録されます。HTTPSを有効にするためには、SSL証明書を設定し、Apacheの設定ファイルを編集する必要があります。
SSL証明書を設定し、ブラウザでhttps://localhost:8080/setcookie.phpにアクセスすると、Cookieが登録されていることが確認できます。

この記事が気に入ったらサポートをしてみませんか?