multi-account-isolation

작성자: antibrow

브라우저 프로필이 실제로 서로 격리되어 있는지 추측하지 말고 확인하세요 - 각 프로필의 시간대가 자체 종료 IP와 일치하는지, WebRTC가 프록시만 노출하는지, 캔버스 및 WebGL 해시가 한 프로필을 재실행해도 동일하게 유지되는지, 두 프로필이 페르소나, 쿠키 저장소, 또는 주소를 공유하지 않는지 확인하세요. 하나의 머신에서 여러 계정이나 테스트 신원을 실행할 때 설정을 점검해야 하는 경우, 또는 프로필이 정상으로 테스트되었지만 여전히 무언가...

npx skills add https://github.com/antibrow/anti-detect-browser-skills --skill multi-account-isolation

Profile Isolation - verifying it, not assuming it

A profile that looks isolated usually is not. The failures are boring and mechanical: a timezone that does not match the exit IP, a WebRTC candidate carrying the real address, a canvas hash that changes on every read, two profiles that ended up on the same persona. This skill is the check list for catching those before they matter.

Authorized use only. This is for identities you own or are authorized to operate: your own accounts, your own test fixtures, your own QA fleet, and your own anti-fraud stack. It is not for accessing systems without authorization, for accounts that are not yours, or for creating fake accounts or engagement. Comply with the terms of the sites you automate and with applicable law - see Acceptable use.

What this does not claim. Passing every check below means the browser layer is internally consistent. It does not mean a given site will treat two profiles as unrelated: things entirely outside the browser - a shared payment instrument, a shared contact detail, identical activity patterns - are not something any browser setting reaches. Treat a clean result as "the technical layer is not the problem", not as a guarantee.

For the SDK that creates and launches these profiles, see the anti-detect-browser skill.

The configuration invariant

One identity gets one of everything. Any cell shared between two identities is a defect to find:

identity  →  profile  →  persona  →  proxy  →  timezone
   1      :     1     :     1     :    1    :     1

Profiles are unlimited and free on every antibrow plan, so there is never a reason to reuse one. "Log out and log back in as the other identity" inside one profile defeats the entire setup - the cookie jar and localStorage are the point.

Setup under test

import { AntiDetectBrowser } from 'anti-detect-browser'

const ab = new AntiDetectBrowser({ key: process.env.ANTI_DETECT_BROWSER_KEY })

const identities = [
  { profile: 'fixture-us-01', proxy: process.env.PROXY_US_1, tags: ['Windows 10', 'Chrome'] },
  { profile: 'fixture-us-02', proxy: process.env.PROXY_US_2, tags: ['Apple Mac', 'Safari'] },
  { profile: 'fixture-de-01', proxy: process.env.PROXY_DE_1, tags: ['Windows 10', 'Edge'] },
]

for (const id of identities) {
  const { browser, page } = await ab.launch({
    profile: id.profile,              // isolated cookies, storage, login state
    proxy: id.proxy,                  // from the environment, one per identity
    fingerprint: { tags: id.tags },   // drawn once, frozen, replayed after
    label: id.profile,                // address-bar tag drawn by the kernel, unreadable from the page
  })
  // ... run the checks below, then ...
  await browser.close()
}

Python, same on-disk profile format:

import os
from antibrow import launch

with launch(
    profile="fixture-us-01",
    proxy=os.environ["PROXY_US_1"],   # from the environment, never a literal
    geoip=True,            # timezone + WebRTC follow the proxy exit
    label="fixture-us-01",
) as browser:
    page = browser.new_page()
    print(browser.timezone, browser.public_ip)

The checks

Run each profile through its own proxy, and assert rather than eyeball.

#CheckHowFails when
1Timezone matches the exit IPbrowser.timezone vs the country of browser.public_ipgeoip was disabled, or timezone was forced to something the IP contradicts. This is the single most common defect.
2WebRTC exposes only the proxybrowserleaks.com/webrtcICE candidates still carry a local or real public address
3Canvas hash is stable across launchesRead it, close, relaunch the same profile, read againThe two reads differ - a value that changes every read is itself an anomaly, and it means the persona is not frozen
4Worker and main thread agreeCreepJSUA, languages, hardwareConcurrency, timezone or GPU differ when re-read inside a Web Worker
5One GPU across three interfacesCreepJS, or read WebGL / WebGL2 / WebGPU directlyadapter.info.vendor does not match the unmasked WebGL renderer family
6No two profiles share a personaDiff browser.persona across the fleetTwo profiles report the same UA, screen geometry and seeds
7No two profiles share an addressCollect browser.public_ip for the fleetTwo identities came out of the same exit, or the same /24
8Cookie jars are separateCompare browser.profile_dir across the fleet, then inspect user-data/ inside eachTwo identities resolve to one directory, or one directory holds state belonging to another identity
9One identity, one profile treeConfirm every launch of a name passes the same temporary valueA managed gmail and a temporary gmail are two different profiles with two personas and two cookie jars. A script that disagrees with itself about temporary is running two identities under one name and will look like a logged-out session, not like a bug
10Whole-stack coherencewhoer.net, pixelscan.netIP, timezone and locale disagree at a glance
11Consistency rules in CInpx liarjs (liarjs.dev)Any of ~40 open-source cross-layer rules fail - this is the one that runs unattended

Checks 1, 3 and 7 are the ones worth wiring into CI: they are cheap, deterministic, and they catch the defects that actually recur.

Reading a failure

Work down in this order, cheapest first - a fingerprint is almost never the actual cause:

  1. Profile name reused? list_profiles, or compare browser.profile_dir per identity. Two identities in one directory explains everything else. Directories are named after the profile's id, not its name, so match on profile.json inside rather than on the folder name.
  2. Same address twice? Confirm each public_ip is distinct.
  3. Clock disagrees with the address? Print browser.timezone and browser.public_ip together.
  4. Persona regenerated? If the canvas hash moved between launches, the profile is not frozen - check whether profile_dir or the cache directory changed under it.
  5. Only then the fingerprint itself, verified with the suites above rather than assumed.

What the runtime touches, and how to check it

Any tool that drives logged-in sessions receives cookies and proxy credentials, so it is fair to ask what it does with them. For antibrow:

ArtifactWhere it livesWho sees it
Cookies, localStorage, login state~/.anti-detect-browser/profiles/<id>/user-data/ on your disk, or profiles-temp/<id>/ for a temporary profileLocal. Cloud sync is opt-in per profile: a launch never creates a cloud profile by itself, and sync: true is what puts one there. Check which profiles sync before assuming they stay on the machine
Persona (persona.json)same profile directory, written once and frozenLocal
Profile identity record (profile.json)same profile directory; the id it holds is what names the directoryLocal. It is why a rename does not cost a persona, and why the folder name is not the profile name
Proxy URL and its credentialspassed to the kernel at launch; answered in the network stack (HTTP 407 / SOCKS5 RFC 1929) so no extension holds themThe kernel process and your proxy provider
API keyyour environment, or ~/.antibrow/license.keyExchanged with antibrow.com for a short-lived license token, roughly once a day

The kernel is a closed-source Chromium build - that is the tradeoff for the spoofing living in C++ rather than in an injectable script - so verify behaviour rather than take it on faith:

python -m antibrow info          # kernels, profiles, license state, cache dir
browser.plan.redacted_args()     # exact kernel command line, secrets masked - safe to paste in a bug report

Point it at a proxy whose logs you can read, or at a local MITM proxy, and watch what leaves the machine during a launch. Pin the SDK version and check the published hash (npm view anti-detect-browser@2.8.0 dist.integrity) so the code you audited is the code that runs. If a deployment must not phone home at all, this is the wrong tool: license verification is compiled into the kernel and there is no offline mode.

What isolation cannot cover

Worth stating plainly, because a clean check list invites the wrong conclusion:

  • Anything outside the browser. A shared payment instrument, a shared contact detail, a shared payout destination - no browser setting touches these, and they are the strongest correlators that exist.
  • Activity patterns. Identical timing, identical content, identical interaction targets. Not a technical property.
  • Identity verification. A document check is not a fingerprint problem.
  • A platform's own decision. Nothing here changes how a site chooses to treat an account.

If every check passes and something still looks wrong, the cause is in this list, not in the browser layer.

Acceptable use

Intended: verifying isolation between identities you own; running client accounts with the account holder's authorization; building QA fixtures that emulate distinct devices; testing your own anti-fraud and correlation logic; auditing what a browser runtime does with your credentials.

Out of scope, and not supported: accessing any system without authorization; logging into accounts that are not yours; credential stuffing or account takeover; creating fake accounts, reviews or engagement; circumventing an authentication, payment or authorization control; scraping personal data in violation of applicable law; working around a platform's enforcement decision.

Complying with the terms of the platforms being used, and with applicable law, is the operator's responsibility. Report abuse or a security issue via the contact at https://antibrow.com.

Related Skills

  • anti-detect-browser - the SDK, profiles, personas, proxies and REST API that create the setup being verified here
  • browser-mcp-agent - MCP server mode, for letting an AI agent drive a single profile itself

antibrow의 다른 스킬

anti-detect-browser
antibrow
고유한 실제 기기 지문을 사용하여 안티-디텍트 브라우저를 실행 및 관리하며, 멀티 계정 운영, 웹 스크래핑, 광고 검증, AI 에이전트 자동화에 활용합니다. 사용자가 여러 개의 고유한 신원으로 브라우저 세션을 실행해야 하거나, 지속적인 브라우저 프로필을 관리해야 하거나, 계정 간 작업을 자동화해야 하거나, 브라우저 지문 격리가 필요한 에이전트 워크플로우를 구축해야 할 때 사용합니다. 또한 사용자가 antibrow, 안티-디텍트 브라우저, 또는 지문 브라우저를 언급할 때도 사용합니다.
browser-automationweb-scrapingtesting
anti-detect-browser
antibrow
표준 Playwright API로 Chromium을 구동하되, 커널에서 적용된 실제 기기 지문(fingerprint)을 사용하고, 각 ID마다 하나의 영구적인 격리 프로필과, 종료 IP가 타임존과 WebRTC를 결정하는 프로필별 프록시를 사용합니다. JavaScript(npm 'anti-detect-browser') 또는 Python(PyPI 'antibrow')으로 제공됩니다. 세션이 여러 실행에 걸쳐 로그인 상태를 유지하면서 분리되어야 할 때, 스크레이퍼나 에이전트가 일관성 없는 헤드리스 지문으로 차단될 때, 다른 지역의 광고나 가격을 확인할 때, 페이지가 반드시...
browser-mcp-agent
antibrow
AI 에이전트에게 MCP 도구 호출을 통해 자체 실제 브라우저를 제공합니다 - 실행, 탐색, 클릭, 입력, 스크린샷, 텍스트 추출, JS 실행 - 커널 수준의 실제 기기 지문과 영구 프로필을 갖추어 세션이 실행 간에 로그인 상태를 유지하고 페이지가 헤드리스 빌드 대신 하나의 일관된 기기를 볼 수 있습니다. Playwright 또는 SDK 코드를 작성할 필요가 없습니다. 에이전트가 사이트를 직접 운영해야 할 때, 컴퓨터 사용/브라우저 사용 설정이 합성 지문이 아닌 캡처된 실제 지문을 필요로 할 때, ...