profile
■ フェーズ1:ページ閲覧
───────────────────────────────────────
13:19:52 GET /downloads/?ad_local=side_download → 200 OK(159ms)
【裏で同時発火】
Facebook PageView × 4ピクセル
Google gtag.config × 5アカウント
Bing PageView × 1
ofgreencolumn モニタリング
Taboola トラッキング
───────────────────────────────────────
■ フェーズ2:ダウンロードボタンクリック
───────────────────────────────────────
13:19:57 GET /download/confirmation/?dlAssetId=AS_167195
→ 302(286ms)
→ location: /mykeyence/?dlLangType=ja-JP
───────────────────────────────────────
■ フェーズ3:マイページ表示(同じ秒に並列処理)
───────────────────────────────────────
13:19:57 GET /mykeyence/ → 200 OK(311ms)
13:19:57 GET /ajax/accessLog/ → 200 OK(36ms)内部ログ
13:19:57 GET /isLoadingDlServer/ → 200 OK(28ms)サーバー確認
【裏で同時発火・約40本以上】
Facebook SubscribedButtonClick × 4ピクセル
Facebook Segment × 4ピクセル
Facebook POST /tr/(8,501バイト)
Google pagead × 3アカウント
Google ccm メールハッシュ照合 × 3アカウント
Google viewthroughconversion × 3アカウント
Google rmkt リマーケティング登録 × 3アカウント
Google purchase イベント × 複数
Bing コンバージョン計測 × 1
ofgreencolumn POST(3,554バイト)
メールアドレス平文送信 × 3回
customerID=25972406 → Google送信
uid=D25972406 → Google送信
───────────────────────────────────────
■ フェーズ4:ファイルダウンロード実行(10秒後)
───────────────────────────────────────
13:20:07 GET /downloadFromDLList?downloadAssetId=AS_167195
→ 302(87ms)ワンタイムトークン発行
→ location: download.keyence.com/contents/?dlc=xGEdShy8...
13:20:07 GET download.keyence.com/contents/?dlc=xGEdShy8...
→ 200 OK
→ AS_167195_EB-3000_C_288013_KJ_JP_2046_2.pdf(9.8MB)
→ ダウンロード完了!
───────────────────────────────────────
■ 送信先まとめ
───────────────────────────────────────
キーエンス本体:
/downloadConfirm/ 認証・権限確認
/downloadFromDLList ワンタイムトークン発行
download.keyence.com ファイル配信(Akamai CDN経由)
外部送信先:
Facebook(Meta) ピクセル×4 / PageView・SubscribedButtonClick・Segment
Google広告 アカウント×5 / purchase・rmkt・ccm
Microsoft Bing コンバージョン計測×1
Taboola ユーザーマッチング×1
ofgreencolumn 行動モニタリング
im-apps.net DMP(データ管理)
deteql.net モニタリング
───────────────────────────────────────
■ 数字まとめ
───────────────────────────────────────
総所要時間 約18秒
キーエンスへのリクエスト 6本
外部トラッキング 約40本以上
広告プラットフォーム数 4社
Googleアカウント数 5アカウント
Facebookピクセル数 4ピクセル
メール送信 ハッシュ化 複数回 / 平文 3回
ファイルサイズ 9.8MB(PDF)
───────────────────────────────────────
■ 技術スタック
───────────────────────────────────────
Webサーバー Apache
アプリサーバー Tomcat(JSESSIONID)
フレームワーク Apache Struts
CDN Akamai
負荷分散 AWS ALB
ファイル配信 専用ドメイン(download.keyence.com)+ Akamai
メインの2ぶん
https://www.keyence.co.jp/mykeyence/downloadFromDLList?downloadAssetId=AS_167195&downloadZipFlag=0
https://download.keyence.com/contents/?dlc=xGEdShy8kr10E5EGqーーーーーーー
■ ステップ1:権限チェック
───────────────────────────────────────
Request URL
https://www.keyence.co.jp/mykeyence/downloadFromDLList
?downloadAssetId=AS_167195
&downloadZipFlag=0
Request Method GET
Status Code 302 Found
Server Apache
時刻 13:20:07
server-timing:
cdn-cache; desc=MISS ← CDNにキャッシュなし・本番サーバーまで届いた
edge; dur=20 ← CDNエッジ処理:20ミリ秒
origin; dur=87 ← Tomcat処理:87ミリ秒
【Tomcatが87ミリ秒でやっていること】
① JSSESSIONIDでセッション確認
② signinStat=1を確認
③ AS_167195のダウンロード権限確認
④ ワンタイムトークン生成
⑤ download.keyence.comへのURL組み立て
⑥ 302を返す
cache-control: max-age=0, no-cache, no-store
← 絶対にキャッシュさせない(セキュリティ)
location:
https://download.keyence.com/contents/
?dlc=xGEdShy8kr10E5EGq5sTーーーーーー
↑
ワンタイムトークン(使い捨てURL)
・一定時間で無効になる
・ログイン済みユーザーにだけ発行
・毎回異なる値が生成される
Cookie(送信):
JSESSIONID=14EBF01F9F5CBA350A17815A50CB53DF ← セッションID
signinStat=1 ← ログイン済み
signinf=iM6l5xXl... ← ログイントークン
───────────────────────────────────────
■ ステップ2:ファイル取得
───────────────────────────────────────
Request URL
https://download.keyence.com/contents/
?dlc=xGEdShy8kr10E5EGq5sTDZCjhTo3v8RN
Request Method GET
Status Code 200 OK
Remote Address 23.42.126.117:443
Server Apache
【ドメインが変わっている】
www.keyence.co.jp → ここで認証・トークン発行
download.keyence.com → ここでファイル配信(別ドメイン)
content-disposition:
attachment; filename*=UTF-8''AS_167195_EB-3000_C_288013_KJ_JP_2046_2.pdf
ファイル名を分解:
AS_167195 ← アセットID
EB-3000 ← 製品型番
C ← バリエーション
288013 ← 内部管理番号
KJ_JP ← 日本語版
2046_2 ← バージョン
.pdf ← PDFファイル
content-length: 10318930バイト = 約9.8MB
content-type: application/octet-stream ← バイナリファイル
connection: keep-alive ← 接続を維持して高速転送
───────────────────────────────────────
■ ワンタイムトークンの比較(毎回変わる)
───────────────────────────────────────
1回目(12:26:28): dlc=rtbmUu4Mーーーーーー
2回目(13:16:32): dlc=6eGQJNao%ーーーーーー
3回目(13:20:07): dlc=xGEdShy8krーーーー
↑
毎回完全に異なる値が生成される
← URLを知っていても使い回せない設計
───────────────────────────────────────
■ なぜワンタイムトークンが必要か
───────────────────────────────────────
❌ トークンなしの場合(危険)
https://download.keyence.com/files/EB-3000.pdf
← URLを知っていれば誰でもダウンロードできる
← 未ログインユーザーも取得可能
✅ ワンタイムトークンありの場合(安全)
https://download.keyence.com/contents/?dlc=xGEdShy8...
← ログイン済みユーザーにだけ発行
← 一定時間で無効になる
← 使い捨てなので転用不可
← 毎回異なるので予測不可能
マネージドIDの種類
種類説明使いどころ
システム割り当てApp Serviceに紐づく。サービス削除時に自動削除シンプルな構成向けユーザー割り当て独立したリソースとして作成。複数サービスで共有可能複数アプリで同じIDを使いたい場合
設定手順(Azureポータル)
システム割り当ての場合
- App Service → 「設定」→「ID」を開く
- 「システム割り当て済み」タブ → 状態を「オン」に変更
- 「保存」をクリック → オブジェクトID が発行される
ユーザー割り当ての場合
- 先にマネージドIDリソースを作成(「マネージドID」サービスから)
- App Service → 「ID」→「ユーザー割り当て済み」タブ
- 「追加」→ 作成済みのマネージドIDを選択
App Service │(VNet統合済み) ▼ VNet ├── 既存Subnet(App Service統合用) └── 新規Subnet(PE用) ├── Key Vault プライベートエンドポイント └── DB プライベートエンドポイント ↕(プライベートDNSゾーンで名前解決)
対象作業必要?
App Service本体マネージドID有効化✅ 必要(これだけ)VNet統合用Subnet追加設定❌ 不要PE用Subnet追加設定❌ 不要(作成するだけ)Key VaultPEの作成 + ロール付与✅ 必要PostgreSQLPEの作成 + ロール付与✅ 必要
やること ├── App Service → マネージドID 有効化 ├── Key Vault → PE作成 + ロール付与 └── PostgreSQL → PE作成 + ロール付与 + DB内ユーザー作成
OPENAI_API_KEY=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
