注意: 本記事は授権されたセキュリティ研究、価格監視、SERP トラッキングなど正当な目的を前提としています。米国 Computer Fraud and Abuse Act (CFAA) および EU GDPR のもと、対象サイトの利用規約を遵守し、授権なしにアクセスすべきではありません。すべての技術情報は防御研究および正当な自動化の文脈で提供されます。
2026年、Akamai Bot Manager v2 詳細解説はスクレイピングエンジニアとセキュリティ研究者にとって必須の知識です。Akamai は単なる IP ブラックリストではなく、ブラウザの TLS 指紋、JavaScript 実行環境のテレメトリ、行動パターン、IP レピュテーションを統合した継続的トラストスコアを用いて自動化を検出します。本記事では、その信号スタックを分解し、正規の自動化がどうクリーンに通過するかを実装レベルで説明します。
Akamai Bot Manager v2 詳細解説:検出信号スタックの全体像
Akamai Bot Manager v2 の検出エンジンは複数レイヤーで構成されています。各レイヤーが独立してスコアを生成し、サーバー側で統合されてトラストスコア(0〜100)が算出されます。主要な信号レイヤーは以下の通りです。
- Cookie レイヤー:
_abck(セッション検証)とak_bmsc(ボット管理セッション)の2つの Cookie が中核 - JavaScript テレメトリ:
sensor.js(bmakエンジン)がブラウザ環境の数百のプロパティを収集 - ネットワーク指紋: TLS ハンドシェイク(JA3/JA4)、HTTP/2 SETTINGS フレーム、HTTP ヘッダー順序
- IP レピュテーション: ASN タイプ(residential / datacenter / mobile)、過去の挙動履歴、地理的一貫性
- 行動分析: マウス移動、スクロール、タッチイベントの時系列パターン
Akamai の公開資料によれば、Bot Manager は機械学習モデルとルールベースエンジンのハイブリッドで動作し、公式製品ページで「継続的なトラストスコアリング」が説明されています。重要なのは、スコアが一度のリクエストで確定するのではなく、セッション全体を通じて継続的に更新される点です。
_abck Cookie と ak_bmsc Cookie の役割
_abck は Akamai のセッション検証 Cookie で、初回アクセス時に設定されます。この Cookie には暗号化された検証トークンが含まれ、sensor_data ペイロードが正当なブラウザ環境から生成されたことを証明します。_abck の値が ~-1~-1~-1 で終わる場合、検証が未完了であることを意味し、後続リクエストでチャレンジがトリガーされます。
ak_bmsc はボット管理セッション Cookie で、セッションレベルのメタデータを保持します。この2つの Cookie が連携し、Akamai のエッジで各リクエストのトラストスコアを即座に計算します。
sensor_data ペイロードの組み立て:何が収集されるか
sensor.js は Akamai が動的に配信する難読化 JavaScript で、内部エンジン bmak を含みます。このスクリプトは数百のブラウザプロパティを収集し、それらを暗号化・エンコードして sensor_data 文字列を生成します。このペイロードは POST リクエストで Akamai のエッジに送信され、_abck Cookie の検証状態を更新します。
収集される主要な信号カテゴリは以下の通りです:
- マウス・タッチイベント: 移動軌跡の座標系列、クリック間隔、加速度パターン。人間の操作には微小なジッターと非線形な加速が含まれるが、自動化は直線的で一定速度になりがち
- スクロールイベント: スクロール速度、方向転換、慣性の有無。人間のスクロールには物理的な慣性パターンがある
- 画面・GPU プロパティ:
screen.width、screen.height、devicePixelRatio、WebGL レンダラー文字列、Canvas API の描画結果ハッシュ。MDN の Canvas API ドキュメントで説明されている通り、Canvas API はピクセルレベルの描画結果を返し、これが GPU/ドライバー固有の指紋となる - タイミング信号:
performance.now()の精度、Date.now()との差分、イベント間のミリ秒間隔 - ブラウザ環境:
navigator.userAgent、navigator.platform、navigator.languages、navigator.hardwareConcurrency、プラグイン一覧
単一フィールドの不一致が _abck を無効化する理由: Akamai のサーバー側検証は、各フィールド間の相互一貫性をチェックします。例えば、navigator.platform が Win32 であるのに GPU レンダラー文字列が Apple Silicon の Apple M2 を示す場合、即座に不正フラグが立ちます。同様に、screen.width が 1920 で window.innerWidth が 360 の場合、モバイルとデスクトップの矛盾として検出されます。sensor_data 内の1つのフィールドでも UA 宣言と矛盾すれば、_abck の検証は失敗し、後続リクエストで CAPTCHA またはブロックが発生します。
2026年のプロトコル信号:Post-Quantum TLS と JA4 フィンガープリント
2026年、Akamai の検出スタックはトランスポート層の指紋に大きく依存しています。特に以下の3つの信号が重要です。
X25519MLKEM768 Post-Quantum キーシェア
Chrome 131 以降、Chromium チームの発表により、デフォルトの TLS キー交換アルゴリズムが X25519MLKEM768(旧称 X25519Kyber768)に切り替わりました。これは post-quantum 暗号化を組み込んだハイブリッドキー交換で、TLS ClientHello の key_share 拡張に影響します。Akamai はこのシグネチャを UA と照合し、Chrome 131+ を主張するクライアントが X25519MLKEM768 を送信しない場合、偽装フラグを立てます。
これは Python requests や urllib3 を使った単純な HTTP クライアントにとって致命的です。これらのライブラリは OpenSSL/BoringSSL のデフォルトキー交換を使用し、post-quantum キーシェアを含みません。sensor_data が完璧でも、TLS レイヤーで Chrome 131+ の指紫と一致しなければ、Akamai はリクエストを疑います。
JA4 TLS フィンガープリント
JA3 に代わる JA4 は、TLS ClientHello のより構造化された指紫を生成します。JA4 は以下の要素をハッシュ化します:
- TLS バージョン
- サポートされる暗号スイート(順序含む)
- 拡張機能のリスト(順序含む)
- 楕円曲線
- 署名アルゴリズム
Akamai は JA4 ハッシュを User-Agent と突き合わせます。例えば、Chrome 131 on Windows 10 の JA4 ハッシュは t13d1516h2_8daaf6152771_b186095e22b6 のような形式になります(実際の値はバージョンにより変動)。これが Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/131.0.0.0 の UA と一致しない場合、即座に検出されます。
HTTP/2 SETTINGS フレーム
HTTP/2 接続の SETTINGS フレームも指紫として使用されます。各ブラウザは異なる SETTINGS 値のセットを送信します:
- Chrome:
HEADER_TABLE_SIZE=65536,INITIAL_WINDOW_SIZE=6291456,MAX_HEADER_LIST_SIZE=262144 - Firefox: 異なる値のセット
- curl/Python: また異なるデフォルト値
Akamai は SETTINGS フレームの値と順序を UA と照合します。RFC 9113 (HTTP/2) で定義されたこれらのパラメータは、ブラウザエンジンごとに固有の値を持ち、偽装が困難です。
| 信号レイヤー | 検出対象 | 偽装難易度 | 対策 |
|---|---|---|---|
| _abck / ak_bmsc Cookie | セッション検証状態 | 高 | 正規ブラウザで sensor_data を生成 |
| sensor_data (bmak) | JS 環境の数百のプロパティ | 極高 | stealth ブラウザコンテキストの使用 |
| JA4 TLS | TLS ClientHello 指紫 | 中 | 実際のブラウザエンジンを使用 |
| HTTP/2 SETTINGS | フレームパラメータ | 中 | ブラウザエンジンのネイティブスタック |
| X25519MLKEM768 | Post-quantum キーシェア | 高 | Chrome 131+ のネイティブ TLS スタック |
| IP レピュテーション | ASN タイプ・過去履歴 | 低(プロキシで解決) | residential プロキシの使用 |
なぜ residential プロキシが必須なのか:IP レピュテーションの重み付け
Akamai Bot Manager v2 は IP レピュテーションを極めて重く評価します。具体的には、ASN タイプで初期トラストスコアが決まります:
- Residential ASN: ISP に登録された一般家庭向け IP。初期スコアは高め(例: 70-80/100)
- Mobile ASN: 携帯キャリアの IP。初期スコアは中〜高(例: 60-75/100)
- Datacenter ASN: AWS、GCP、Azure、DigitalOcean などのホスティングプロバイダー。初期スコアは低(例: 20-35/100)
datacenter IP は「bot である確率が高い」として事前にスコアリングされます。sensor_data が完璧で TLS 指紫が一致していても、datacenter IP からのリクエストは追加のチャレンジがトリガーされる可能性が高いです。これは Akamai が過去のデータセンター IP からのボット攻撃パターンを学習しているためです。
一方、residential IP は一般ユーザーのトラフィックと区別が困難なため、初期トラストスコアが高く、sensor_data と TLS 指紫が一貫していれば、追加チャレンジなしで通過できます。
実装例:ProxyHat residential プロキシで _abck を正しく鋳造する
以下は、正規のセキュリティ研究や授権された価格監視のコンテキストで、ProxyHat residential プロキシと stealth ブラウザコンテキストを組み合わせて Akamai Bot Manager v2 をクリーンに通過する実装例です。
Python + Playwright + ProxyHat Residential プロキシ
from playwright.async_api import async_playwright
import asyncio
PROXY_HTTP = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
async def akamai_session():
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False, # Akamai は headless 検出を行う
proxy={
"server": "http://gate.proxyhat.com:8080",
"username": "USERNAME",
"password": "PASSWORD"
},
args=[
"--disable-blink-features=AutomationControlled",
"--disable-features=IsolateOrigins,site-per-process"
]
)
context = await browser.new_context(
user_agent=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/131.0.0.0 Safari/537.36"
),
viewport={"width": 1920, "height": 1080},
locale="en-US",
timezone_id="America/New_York",
screen={"width": 1920, "height": 1080}
)
# navigator.webdriver を隠す
await context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// Chrome の実行可能ファイルパスを隠す
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
""")
page = await context.new_page()
# 人間らしいマウス移動をシミュレート
await page.mouse.move(100, 100)
await asyncio.sleep(0.3)
await page.mouse.move(250, 180, steps=15)
await asyncio.sleep(0.2)
# 対象サイトにアクセス(sensor.js が自動実行される)
await page.goto("https://example.com", wait_until="networkidle")
# _abck Cookie が検証済みになるまで待機
await asyncio.sleep(3)
cookies = await context.cookies()
abck = next(
(c for c in cookies if c["name"] == "_abck"), None
)
if abck and "~-1~-1~-1" not in abck["value"]:
print("_abck 検証成功")
else:
print("_abck 未検証 — 追加インタラクションが必要")
await browser.close()
asyncio.run(akamai_session())
curl での基本接続テスト
# ProxyHat residential プロキシ経由で接続テスト
curl -x http://USERNAME:PASSWORD@gate.proxyhat.com:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" \
https://example.com
# 国を指定(米国 residential IP)
curl -x http://user-country-US:PASSWORD@gate.proxyhat.com:8080 \
https://example.com
# 都市レベルの指定(ベルリン)
curl -x http://user-country-DE-city-berlin:PASSWORD@gate.proxyhat.com:8080 \
https://example.com
# SOCKS5 プロキシを使用する場合
curl -x socks5://USERNAME:PASSWORD@gate.proxyhat.com:1080 \
https://example.com
Node.js + Puppeteer + ProxyHat
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({
headless: false,
args: [
'--proxy-server=http://gate.proxyhat.com:8080',
'--disable-blink-features=AutomationControlled',
],
});
const page = await browser.newPage();
await page.authenticate({
username: 'USERNAME',
password: 'PASSWORD',
});
// 人間らしいインタラクション
await page.setViewport({ width: 1920, height: 1080 });
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
// スクロールをシミュレート
await page.evaluate(() => {
window.scrollBy(0, 300);
});
await new Promise((r) => setTimeout(r, 500));
const cookies = await page.cookies();
const abck = cookies.find((c) => c.name === '_abck');
console.log('_abck:', abck ? abck.value.substring(0, 30) + '...' : 'なし');
await browser.close();
})();
よくある間違いとエッジケース
1. headless モードの使用
Chrome headless モードは複数の検出可能なシグナルを残します。navigator.webdriver が true になるほか、window.chrome オブジェクトの欠如、Notification.permission の挙動差異、レンダリング解像度の違いなどが知られています。Akamai の sensor.js はこれらのシグナルを sensor_data に組み込みます。headless: false で Xvfb 仮想ディスプレイを使用するか、headed モードで実行すべきです。
2. TLS 指紫と UA の不一致
最もよくある間違いは、Python requests で Chrome の UA を主張することです。requests は OpenSSL の TLS スタックを使用し、JA4 ハッシュが Chrome と完全に異なります。Akamai はこの矛盾を即座に検出します。解決策は、実際の Chromium エンジン(Playwright や Puppeteer)を使用することです。
3. sensor_data の再利用
一度生成した sensor_data を複数セッションで再利用すると、タイムスタンプとイベントシーケンスが不整合を起こし、Akamai のサーバー側検証で即座に無効化されます。各セッションで新規に sensor_data を生成する必要があります。
4. 地理的不一致
米国の residential IP を使用しながら navigator.timezone が Asia/Tokyo の場合、Akamai は IP 地理位置とブラウザ設定の矛盾を検出します。プロキシの国とブラウザの timezone/locale を一致させる必要があります。ProxyHat では国指定が可能です:
# 米国 IP + 米国 timezone
http://user-country-US:PASSWORD@gate.proxyhat.com:8080
# ブラウザ設定: timezone="America/New_York", locale="en-US"
5. 過度の並行リクエスト
単一 IP から短時間に大量のリクエストを送信すると、行動分析エンジンがボットパターンとして分類します。residential プロキシであっても、1 IP あたり 1500 リクエスト/分 を超えるとレート制限がトリガーされる可能性があります。ProxyHat のセッション管理を活用し、リクエスト間に適切な間隔を設けてください。
ProxyHat 固有のセットアップ
ProxyHat は residential、mobile、datacenter プロキシを提供し、Akamai Bot Manager v2 の通過には residential プロキシが最適です。プランと料金を確認し、ユースケースに合ったプランを選択してください。
ProxyHat の主な機能と Akamai 対策での活用方法:
- 国・都市レベルのジオターゲティング:
user-country-USやuser-country-DE-city-berlinで IP の地理位置を制御し、ブラウザの timezone/locale と一致させる - スティッキーセッション:
user-session-abc123で同一 IP を維持し、_abckCookie の検証状態を保持 - HTTP / SOCKS5 対応: HTTP は
gate.proxyhat.com:8080、SOCKS5 はgate.proxyhat.com:1080 - 99.9% の稼働率: 大規模な residential IP プールで高信頼性を確保
詳細な接続方法については ProxyHat ドキュメントを参照してください。また、Web スクレイピングのユースケースやSERP トラッキングのユースケースも参考になります。利用可能なロケーションはプロキシロケーション一覧で確認できます。
Key Takeaways(重要ポイント)
Akamai Bot Manager v2 は多層防御システムである。 単一の信号をバイパスしても不十分です。TLS 指紫、JavaScript テレメトリ、IP レピュテーション、行動分析のすべてが一貫している必要があります。
_abckCookie はsensor_dataペイロードの正当性検証に依存し、単一フィールドの不一致で無効化される- 2026年、Chrome 131+ の X25519MLKEM768 post-quantum キーシェアが TLS 指紫の新たな必須信号
- JA4 TLS ハッシュと HTTP/2 SETTINGS フレームは UA と一致しなければならない
- datacenter ASN は初期トラストスコアが低く、residential プロキシが実質必須
- 実際のブラウザエンジン(Playwright/Puppeteer)+ residential プロキシの組み合わせが最もクリーンな通過方法
- すべての自動化は授権された目的(セキュリティ研究、価格監視、SERP トラッキング)に限定すべき
FAQ
Akamai Bot Manager v2 詳細解説とは何ですか?
Akamai Bot Manager v2 詳細解説は、Akamai の次世代ボット検出エンジンの技術的内部構造を深く分析することを指します。具体的には、_abck Cookie 検証、sensor_data ペイロードの組み立て、JA4 TLS フィンガープリント、HTTP/2 SETTINGS、post-quantum キーシェア、IP レピュテーションスコアリングなど、複数レイヤーの検出信号がどのように統合されてトラストスコアを生成するかを理解し、正規の自動化がクリーンに通過するための実装方法を含みます。
なぜ Akamai Bot Manager v2 詳細解説がプロキシユーザーにとって重要ですか?
Akamai Bot Manager v2 は IP レピュテーションを heavy weight で評価し、datacenter ASN を事前に低スコアとして分類します。プロキシユーザーが residential プロキシを選択するか datacenter プロキシを選択するかで、Akamai の初期トラストスコアが大きく変わります。検出メカニズムを理解せずに datacenter プロキシで Akamai 保護サイトにアクセスすると、_abck 検証が継続的に失敗し、CAPTCHA やブロックが頻発します。
Akamai Bot Manager v2 でどのプロキシタイプが最適ですか?
residential プロキシが最適です。Akamai は ASN タイプで初期トラストスコアを決定し、residential IP は一般ユーザートラフィックと区別が困難なため高スコアになります。datacenter IP は AWS、GCP、Azure などのホスティングプロバイダーに属し、ボットの発生元として事前に低スコアが設定されます。mobile プロキシも有効ですが、キャリア IP の動的特性によりセッション安定性が residential より低い場合があります。ProxyHat の residential プロキシを gate.proxyhat.com:8080 で使用することを推奨します。
Akamai Bot Manager v2 の実装でブロックを回避するにはどうすればよいですか?
ブロックを回避するには以下の条件をすべて満たす必要があります:(1) 実際のブラウザエンジン(Playwright や Puppeteer)を使用し、sensor_data を正規に生成する、(2) residential プロキシで IP レピュテーションを確保する、(3) TLS 指紫(JA4)と HTTP/2 SETTINGS が UA と一致する、(4) プロキシの国とブラウザの timezone/locale を一致させる、(5) 人間らしいマウス移動やスクロールをシミュレートする、(6) headless モードを避ける、(7) セッションごとに新規の sensor_data を生成する。これらを満たしても、対象サイトの利用規約を遵守し、CFAA や GDPR の範囲内で運用することが不可欠です。
_abck Cookie の検証状態を確認する方法は?
_abck Cookie の値が ~-1~-1~-1 で終わる場合、検証が未完了です。これは sensor_data ペイロードが Akamai のサーバー側で検証されていないことを意味します。検証が成功すると、Cookie 値が更新され、~-1~-1~-1 サフィックスが消えます。Playwright や Puppeteer で context.cookies() を呼び出し、_abck の値を確認できます。検証が完了していない場合、追加のインタラクション(マウス移動、スクロール、待機)を行ってから再確認してください。






