行動ログでのユーザー / セッション自動作成
POST /v1/events の挙動を更新しました。session_start / login 以外の行動ログ(click / impression / return / share / like / dislike)でも user_id が含まれている場合、未登録ユーザーをバックグラウンドで自動作成するようになりました。
変更内容
-
すべての行動ログでユーザー自動作成:
user_idを含むあらゆる行動ログで、未登録ユーザーを冪等に作成します。session_startを送信せずにclickを送信したケース(イベント順序の race)でも、データ欠損は発生しません。 -
session_idも同様:session_idを含むイベントは、未登録の場合にセッションを冪等に作成します。後からsession_startが到達した場合、started_atとdevice_infoはsession_startの値で上書きされます。 -
total_sessionsのセマンティクス:session_startを観測した回数のみカウントします。click等で先に作成されたユーザーはtotal_sessions = 0で開き、後からsession_startを観測すると+1されます。 -
user_idの技術的バリデーション:POST /v1/eventsおよびPUT/PATCH /v1/users/{user_id}のuser_idに対して、最大 128 文字 /^[A-Za-z0-9._:@|+=\-]{1,128}$の制約を導入しました。違反時は400 Validationを返します。本制約は ストレージ・ログ・URL ルーティング等で予期せぬ挙動を起こし得る値を弾く技術的セーフティ です。PII(実名・連絡先等)を識別子に含めないことは引き続き利用規約上の責務となります。
許容される代表例(自動作成・既存パス共通):
形式 例 UUID v4/v7(推奨) 550e8400-e29b-41d4-a716-446655440000ULID 01ARZ3NDEKTSV4RRFFQ69G5FAV数値 ID 1234567890provider:subjecttenant:acme.user_12Auth0 / Cognito auth0|abc123メール形式 alice+promo@example.combase64 パディング含み YWxpY2U=拒否される代表例:
形式 例 空白・タブ user 123,user\t123絵文字・非 ASCII user-😀制御文字・NUL user\x00123パス区切り users/123バックスラッシュ user\\123
影響
- 既存の
session_start/loginパスの挙動には変更ありません。 - 既存テナントで
user_idに空白・絵文字・パス区切り等を含むクライアントがある場合、当該イベントは400で reject されます。auth provider 由来のauth0|...やメール形式は そのまま送れます。 - ユーザーの
total_sessionsの意味論が変わりました(session_start観測回数のみカウント)。これまではtotal_sessions >= 1が「既知ユーザー」の不変条件でしたが、今後は行動ログ単独で作成されたユーザーはtotal_sessions = 0で開始します。total_sessions > 0を「既知ユーザー」として参照していたダッシュボード/セグメント/プッシュ条件は見直しをご確認ください。