実装ガイド

サーバー発行Cookie
実装ガイド

Safari ITPに対応した、正攻法のユーザー識別実装

なぜサーバー発行Cookieが必要か

Safari ITP(Intelligent Tracking Prevention)の影響

  • 1. JavaScriptで設定したCookieは7日間で自動削除
  • 2. localStorageも7日間で自動削除(ユーザーがサイトを操作しない場合)
  • 3. サーバーから発行されたCookieのみが制限対象外

サーバー発行Cookieのメリット

  • Safari ITPの7日制限を回避
  • ブラウザが正式にサポートする方法
  • GA4、広告計測、マーケティングツールすべてで流用可能
  • 将来のブラウザ規制にも耐性あり

実装方法

必要なコードはほんの数行です。サーバー側で訪問者IDを発行し、Cookieに保存するだけ。

PHP / Laravel
// app/Http/Middleware/VisitorId.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Cookie;

class VisitorId
{
    public function handle($request, Closure $next)
    {
        // 既存のCookieがあればそのまま使用
        if (!$request->cookie('visitor_id')) {
            // なければ新規発行(2年間有効)
            Cookie::queue('visitor_id', Str::uuid(), 60 * 24 * 365 * 2);
        }

        return $next($request);
    }
}

// app/Http/Kernel.php の $middlewareGroups['web'] に追加
\App\Http\Middleware\VisitorId::class,
Node.js / Express
// middleware/visitorId.js
const { v4: uuidv4 } = require('uuid');

module.exports = function visitorId(req, res, next) {
    if (!req.cookies.visitor_id) {
        // 新規発行(2年間有効)
        res.cookie('visitor_id', uuidv4(), {
            maxAge: 2 * 365 * 24 * 60 * 60 * 1000,
            httpOnly: false,  // JSから読めるように
            secure: true,
            sameSite: 'Lax'
        });
    }
    next();
};

// app.js で使用
const cookieParser = require('cookie-parser');
const visitorId = require('./middleware/visitorId');

app.use(cookieParser());
app.use(visitorId);
Python / Django
# middleware/visitor_id.py
import uuid
from datetime import timedelta

class VisitorIdMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        if 'visitor_id' not in request.COOKIES:
            # 新規発行(2年間有効)
            response.set_cookie(
                'visitor_id',
                str(uuid.uuid4()),
                max_age=60 * 60 * 24 * 365 * 2,
                httponly=False,
                secure=True,
                samesite='Lax'
            )

        return response

# settings.py の MIDDLEWARE に追加
MIDDLEWARE = [
    ...
    'yourapp.middleware.visitor_id.VisitorIdMiddleware',
]
Ruby / Rails
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :set_visitor_id

  private

  def set_visitor_id
    unless cookies[:visitor_id]
      # 新規発行(2年間有効)
      cookies[:visitor_id] = {
        value: SecureRandom.uuid,
        expires: 2.years.from_now,
        httponly: false,
        secure: Rails.env.production?,
        same_site: :lax
      }
    end
  end
end
Next.js (Middleware)
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
    const response = NextResponse.next();

    if (!request.cookies.get('visitor_id')) {
        // 新規発行(2年間有効)
        response.cookies.set('visitor_id', crypto.randomUUID(), {
            maxAge: 60 * 60 * 24 * 365 * 2,
            httpOnly: false,
            secure: true,
            sameSite: 'lax'
        });
    }

    return response;
}

export const config = {
    matcher: '/((?!api|_next/static|_next/image|favicon.ico).*)',
};

Nudgeeとの連携

SDKの設定

サーバーで発行したCookie名を data-site-visitor-id で指定するだけ:

<!-- サーバー発行Cookieを使用 -->
<script
    src="https://your-nudgee.com/js/nudgee-sdk.js"
    data-site="your-site-key"
    data-site-visitor-id="visitor_id">
</script>

動作確認

ブラウザの開発者ツールで確認できます:

// コンソールで実行
console.log(Nudgee.getVisitorIdInfo());

// 出力例
{
    visitorId: "a1b2c3d4-e5f6-...",
    usingSiteVisitorId: true,        // ← trueならサーバー発行ID使用中
    siteVisitorIdKey: "visitor_id",
    itpCompliant: true              // ← Safari ITP対応済み
}

他ツールでの活用

一度サーバー発行Cookieを実装すれば、Nudgee以外のツールでも同じIDを使用できます:

GA4との連携

gtag('config', 'G-XXXXX', {
    'user_id': getCookie('visitor_id')
});

GTMでの使用

1st Party Cookie変数として読み込み、
各タグで共通のUser IDとして使用

広告計測

Meta Pixel、Google Ads等の
ファーストパーティデータとして活用

CRM連携

会員登録時にvisitor_idを紐付けて
匿名→実名の統合分析が可能

実装サポート

Nudgeeをご利用のお客様には、サーバー発行Cookie実装のサポートを提供しています。
フレームワーク固有の問題解決、本番環境への適用まで、技術チームがお手伝いします。

導入のご相談