実装ガイド
サーバー発行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に保存するだけ。
// 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,
// 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);
# 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',
]
# 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
// 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実装のサポートを提供しています。
フレームワーク固有の問題解決、本番環境への適用まで、技術チームがお手伝いします。