- Web Agent๋ LLM์ด ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์์จ์ ์ผ๋ก ์ ์ดํ์ฌ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ AI ์์ด์ ํธ ์์คํ
- ์ฌ์ฉ์์ ์์ฐ์ด ์ง์๋ฅผ ๋ฐ์ ๊ด์ฐฐ-์ถ๋ก -ํ๋(Observe-Think-Act) ๋ฃจํ๋ก ์น ์์ ์ ์ํํ๋ ๋ธ๋ผ์ฐ์ ์๋ํ ํจ๋ฌ๋ค์
- ๊ธฐ์กด ์คํฌ๋ฆฝํธ ์๋ํ(Selenium, Puppeteer)์ ๋ฌ๋ฆฌ ์น์ฌ์ดํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ์ ์ํ ์ ์๋ ์๋ฏธ ๊ธฐ๋ฐ(semantic) ์ ๊ทผ ๋ฐฉ์
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- ๊ธฐ์กด ๋ธ๋ผ์ฐ์ ์๋ํ๋ XPath/CSS ์ ๋ ํฐ์ ์์กดํ์ฌ ์น์ฌ์ดํธ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด ์ฆ์ ๊นจ์ง
- API๊ฐ ์๋ ์น ์๋น์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ฑฐ๋ ์์ ์ ์๋ํํด์ผ ํ๋ ์์ ์ฆ๊ฐ
- LLM์ ์ถ๋ก ๋ฅ๋ ฅ์ด ์น ํ์ด์ง์ ๋งฅ๋ฝ์ ์ดํดํ ์ ์๋ ์์ค์ ๋๋ฌ (GPT-4o, Claude, Gemini ๋ฑ)
- ์ฌ์ฉ์์ ์ธ์ฆ๋ ์ธ์ (์ฟ ํค, ๋ก๊ทธ์ธ)์ ํ์ฉํ์ฌ ๊ฐ์ธํ๋ ์น ์์ ๊ฐ๋ฅ
AS-IS: ๊ธฐ์กด ์คํฌ๋ฆฝํธ ์๋ํ
# Selenium โ ์
๋ ํฐ ๊ธฐ๋ฐ, ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ ์คํจ
driver.find_element(By.XPATH, '//*[@id="search-box"]').send_keys("query")
driver.find_element(By.CSS_SELECTOR, '.btn-submit').click()
# ์น์ฌ์ดํธ ๋ฆฌ๋์์ธ โ XPATH ๋ณ๊ฒฝ โ ์คํฌ๋ฆฝํธ ์ ์ฒด ์์ ํ์TO-BE: Web Agent (LLM ๊ธฐ๋ฐ)
sequenceDiagram autonumber participant User as ์ฌ์ฉ์ participant LLM as LLM (์ถ๋ก ์์ง) participant Browser as ๋ธ๋ผ์ฐ์ User->>LLM: "Google์์ 'AI agent' ๊ฒ์ํด์ค" loop Observe-Think-Act LLM->>Browser: ํ์ด์ง ์ํ ์์ฒญ (Accessibility Tree) Browser-->>LLM: ํ์ด์ง ๊ตฌ์กฐ + ์์ ์ฐธ์กฐ ID Note over LLM: ์ถ๋ก : ๊ฒ์์ฐฝ์ ref=e5, ์ญํ =textbox LLM->>Browser: type_text(ref=e5, "AI agent") Browser-->>LLM: ์ ๋ ฅ ์๋ฃ, DOM ๋ณํ ๊ฐ์ง LLM->>Browser: press_key("Enter") Browser-->>LLM: ํ์ด์ง ๋ค๋น๊ฒ์ด์ ์๋ฃ end LLM-->>User: "๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค: ..."
Web Agent์ 3๊ฐ์ง ์ธ์ ๋ฐฉ์
1. DOM ๊ธฐ๋ฐ ์ธ์
HTML Document Object Model์ ํ์ฑํ์ฌ ํ์ด์ง ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๋ฐฉ์. ์์์ ํ๊ทธ, ์์ฑ, ํ ์คํธ ์ฝํ ์ธ ๋ฅผ ์ง์ ๋ถ์ํ๋ค.
- ์ฅ์ : ์ ํํ ์์ ์๋ณ, ๋น ๋ฅธ ์ฒ๋ฆฌ
- ๋จ์ : ์๊ฐ์ ๋ ์ด์์ ์ ๋ณด ๋ถ์กฑ, JavaScript ๋ ๋๋ง ํ DOM๊ณผ ์ค์ ํ๋ฉด ๊ดด๋ฆฌ
2. Accessibility Tree ๊ธฐ๋ฐ ์ธ์
๋ธ๋ผ์ฐ์ ์ ์ ๊ทผ์ฑ ํธ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์์์ ์ญํ (role), ์ด๋ฆ(name), ์ํ(state) ๋ฅผ ํ์ . ์คํฌ๋ฆฐ ๋ฆฌ๋๊ฐ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ์์ด์ ํธ๊ฐ ํ์ฉํ๋ค.
- ์ฅ์ : ์๋ฏธ๋ก ์ (semantic) ์ดํด ๊ฐ๋ฅ, CSS/๋ ์ด์์ ๋ณ๊ฒฝ์ ๊ฐ๊ฑด
- ๋จ์ : ์ ๊ทผ์ฑ ๋งํฌ์ ์ด ๋น์ฝํ ์ฌ์ดํธ์์๋ ์ ๋ณด ๋ถ์กฑ
- ํต์ฌ ์ธ์ฌ์ดํธ: โ์คํฌ๋ฆฐ ๋ฆฌ๋๊ฐ ์ฌ์ดํธ๋ฅผ ๋ชป ์ฝ์ผ๋ฉด, AI ์์ด์ ํธ๋ ๋ชป ์ฝ๋๋คโ
3. Vision(์คํฌ๋ฆฐ์ท) ๊ธฐ๋ฐ ์ธ์
ํ์ด์ง ์คํฌ๋ฆฐ์ท์ Computer Vision/๋ฉํฐ๋ชจ๋ฌ LLM์ ์ ๋ ฅํ์ฌ ์๊ฐ์ ์ผ๋ก ์์๋ฅผ ์ธ์ํ๋ ๋ฐฉ์.
- ์ฅ์ : DOM ๊ตฌ์กฐ์ ์์กดํ์ง ์์, ๋ณต์กํ ์๊ฐ์ ๋ ์ด์์ ์ดํด ๊ฐ๋ฅ
- ๋จ์ : ์ฒ๋ฆฌ ์๋ ๋๋ฆผ, ๋น์ฉ ๋์, ์ ๋ฐํ ์์ ์ง์ ์ด๋ ค์
์ค๋ฌด์์๋ Accessibility Tree + Vision ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ๋ณดํธ์ ์ด๋ค.
Observe-Think-Act ๋ฃจํ
Web Agent์ ์คํ ํต์ฌ ํจํด. ๋ชจ๋ ์น ์์ ์ ์ด ๋ฃจํ์ ๋ฐ๋ณต์ผ๋ก ์ํ๋๋ค.
sequenceDiagram autonumber participant Agent as Agent (LLM) participant Env as Browser Environment loop ๋ชฉํ ๋ฌ์ฑ๊น์ง ๋ฐ๋ณต Agent->>Env: Observe โ ํ์ฌ ํ์ด์ง ์ํ ์์ง Note over Env: DOM / Accessibility Tree / Screenshot Env-->>Agent: ํ์ด์ง ๊ตฌ์กฐ + ์์ ์ฐธ์กฐ ๋ฐํ Note over Agent: Think โ ๋ชฉํ ๋๋น ํ์ฌ ์ํ ๋ถ์, ๋ค์ ํ๋ ๊ฒฐ์ Agent->>Env: Act โ ํ๋ ์คํ (click, type, scroll, navigate...) Env-->>Agent: ํ๋ ๊ฒฐ๊ณผ + ํ์ด์ง ๋ณํ ํผ๋๋ฐฑ end
| ๋จ๊ณ | ์ค๋ช | ์์ |
|---|---|---|
| Observe | ํ์ฌ ํ์ด์ง ์ํ๋ฅผ ์์ง | Accessibility Tree ์ถ์ถ, ์คํฌ๋ฆฐ์ท ์บก์ฒ |
| Think | LLM์ด ๋ชฉํ ๋๋น ์ํ๋ฅผ ๋ถ์ํ๊ณ ๋ค์ ํ๋์ ๊ณํ | โ๊ฒ์์ฐฝ์ ์ฐพ์์ผ๋ ํ ์คํธ๋ฅผ ์ ๋ ฅํด์ผ ํ๋คโ |
| Act | ๋ธ๋ผ์ฐ์ ์ ๊ตฌ์ฒด์ ํ๋์ ์คํ | click(ref=e14), type_text(ref=e5, "query") |
Action Space (ํ๋ ๊ณต๊ฐ)
Web Agent๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ํํ ์ ์๋ ์์์ ํ๋(primitive) ๋ชฉ๋ก:
| Action | ์ค๋ช |
|---|---|
| navigate(url) | ํน์ URL๋ก ์ด๋ |
| click(element) | ์์ ํด๋ฆญ (๋ฒํผ, ๋งํฌ, ์ฒดํฌ๋ฐ์ค ๋ฑ) |
| type_text(element, value) | ์ ๋ ฅ ํ๋์ ํ ์คํธ ์ ๋ ฅ |
| scroll(direction) | ํ์ด์ง ๋๋ ์์ ์คํฌ๋กค |
| press_key(key) | ํค๋ณด๋ ํค ์ ๋ ฅ (Enter, Escape, Tab ๋ฑ) |
| extract_page() | ํ์ด์ง ์ฝํ ์ธ ์ถ์ถ |
| screenshot() | ํ์ฌ ํ๋ฉด ์บก์ฒ |
| done() | ์์ ์๋ฃ ์ ์ธ ๋ฐ ์ธ์ ์ ๋ฆฌ |
Playwright โ Web Agent์ ๊ธฐ๋ฐ ๊ธฐ์
Playwright๋ Microsoft๊ฐ ๊ฐ๋ฐํ ์คํ์์ค ๋ธ๋ผ์ฐ์ ์๋ํ ํ๋ ์์ํฌ๋ก, ์๋๋ E2E ํ ์คํธ ๋๊ตฌ๋ก ์ค๊ณ๋์์ผ๋ ํ์ฌ Web Agent์ ํต์ฌ ์ธํ๋ผ๋ก ์งํํ๊ณ ์๋ค.
Playwright ํต์ฌ ๊ตฌ์กฐ
sequenceDiagram autonumber participant Code as Playwright API participant BT as BrowserType participant B as Browser (Chromium/Firefox/WebKit) participant BC as BrowserContext (๊ฒฉ๋ฆฌ๋ ์ธ์ ) participant P as Page (ํญ) Code->>BT: chromium.launch() BT->>B: ๋ธ๋ผ์ฐ์ ํ๋ก์ธ์ค ์์ฑ B->>BC: browser.newContext() Note over BC: ๋ ๋ฆฝ๋ ์ฟ ํค, ์คํ ๋ฆฌ์ง, ์ธ์ BC->>P: context.newPage() P->>P: page.goto(), page.click(), page.fill()...
| ๊ณ์ธต | ์ญํ |
|---|---|
| BrowserType | Chromium, Firefox, WebKit ์ค ๋ธ๋ผ์ฐ์ ์์ง ์ ํ ๋ฐ ์คํ |
| Browser | ์คํ ์ค์ธ ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค |
| BrowserContext | ๊ฒฉ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ํ๋กํ (์ฟ ํค, ์ธ์ ๋ ๋ฆฝ). ํ๋์ Browser์์ ์ฌ๋ฌ Context ์์ฑ ๊ฐ๋ฅ |
| Page | ํ๋์ ํญ. DOM ์กฐ์, ๋ค๋น๊ฒ์ด์ , ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ค์ ๋จ์ |
Playwright์ ๊ฐ์
- Auto-waiting: ์์๊ฐ ์กฐ์ ๊ฐ๋ฅํ ์ํ๊ฐ ๋ ๋๊น์ง ์๋ ๋๊ธฐ (์ธ์์
sleep๋ถํ์) - Trusted Events: ์ค์ ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ๊ตฌ๋ถ ๋ถ๊ฐ๋ฅํ ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ ์์ฑ
- Cross-browser: Chromium, Firefox, WebKit์ ๋จ์ผ API๋ก ์ ์ด
- ๊ฒฉ๋ฆฌ(Isolation): BrowserContext ๋จ์๋ก ์ธ์ ์์ ๊ฒฉ๋ฆฌ, ๋ฐ๋ฆฌ์ด ๋จ์ ์์ฑ
- Shadow DOM ๊ดํต: Shadow DOM, iframe์ ์์ฐ์ค๋ฝ๊ฒ ํต๊ณผํ๋ ์ ๋ ํฐ
Playwright โ Web Agent๋ก์ ์งํ: Playwright MCP
Playwright ์์ฒด๋ ์ฝ๋๋ก ์์ฑ๋ ์๋๋ฆฌ์ค๋ฅผ ์คํํ๋ ๋๊ตฌ์ด๋ค. ์ฌ๊ธฐ์ MCP(Model Context Protocol)๋ฅผ ๊ฒฐํฉํ๋ฉด, LLM์ด Playwright์ ๋ธ๋ผ์ฐ์ ์ ์ด ๋ฅ๋ ฅ์ ๋๊ตฌ(tool)๋ก ํธ์ถํ ์ ์๊ฒ ๋๋ค.
sequenceDiagram autonumber participant LLM as LLM Agent participant MCP as MCP Server (Playwright) participant PW as Playwright Engine participant Browser as Browser LLM->>MCP: tool_call: navigate("https://example.com") MCP->>PW: page.goto("https://example.com") PW->>CDP: CDP ๋ช ๋ น ์ ์ก CDP->>Browser: ๋ธ๋ผ์ฐ์ ๋ด๋ถ ์คํ Browser-->>CDP: ํ์ด์ง ๋ก๋ ์๋ฃ CDP-->>PW: ๊ฒฐ๊ณผ ๋ฐํ PW-->>MCP: Accessibility Snapshot ๋ฐํ MCP-->>LLM: ํ์ด์ง ๊ตฌ์กฐ (์ญํ , ์ด๋ฆ, ์ฐธ์กฐ ID) Note over LLM: ์ถ๋ก ํ ๋ค์ ํ๋ ๊ฒฐ์
| ๋น๊ต | Playwright ๋จ๋ | Playwright MCP (Web Agent) |
|---|---|---|
| ์ง์ ๋ฐฉ์ | ์ฝ๋ (page.click('#btn')) | ์์ฐ์ด (โ๊ฒ์ ๋ฒํผ ํด๋ฆญํด์คโ) |
| ์ ์๋ ฅ | ์ ๋ ํฐ ๋ณ๊ฒฝ ์ ์ฝ๋ ์์ ํ์ | LLM์ด ์๋ฏธ๋ก ์์๋ฅผ ์ฐพ์ ์ ์ |
| ์ธ์ ๋ฐฉ์ | ๊ฐ๋ฐ์๊ฐ ์ ๋ ํฐ ์ง์ | Accessibility Snapshot ์๋ ๋ถ์ |
| ์ฌ์ฉ ์ฃผ์ฒด | ๊ฐ๋ฐ์/QA ์์ง๋์ด | AI ์์ด์ ํธ (๋น๊ฐ๋ฐ์๋ ํ์ฉ ๊ฐ๋ฅ) |
Playwright MCP๋ ์คํฌ๋ฆฐ์ท ๋์ Accessibility Snapshot์ ์ฌ์ฉํ์ฌ ๋น์ ๋ชจ๋ธ ์์ด๋ ๋น ๋ฅด๊ณ ์ ํํ ํ์ด์ง ์ธ์์ด ๊ฐ๋ฅํ๋ค.
ํต์ ์ํคํ ์ฒ
Web Agent๊ฐ ์ค์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ดํ๊ธฐ ์ํ ํต์ ๋ฐฉ์์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋๋ค.
๋ฐฉ์ 1: Chrome Extension + Native Messaging
๋ฐ์คํฌํฑ ์ฑ์ด ์ฌ์ฉ์์ ๊ธฐ์กด Chrome ์ธ์ (๋ก๊ทธ์ธ, ์ฟ ํค)์ ๊ทธ๋๋ก ํ์ฉํด์ผ ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
sequenceDiagram autonumber participant App as Host Application participant NMH as Native Messaging Host participant Ext as Chrome Extension participant CS as Content Script participant Tab as Web Page App->>NMH: IPC/Socket ๋ช ๋ น ์ ์ก NMH->>Ext: stdin โ JSON ๋ฉ์์ง ์ ๋ฌ Ext->>CS: Content Script ์ฃผ์ CS->>Tab: DOM ์กฐ์ (ํด๋ฆญ, ์ ๋ ฅ, ์ถ์ถ) Tab-->>CS: ์คํ ๊ฒฐ๊ณผ CS-->>Ext: ๊ฒฐ๊ณผ JSON Ext-->>NMH: stdout โ JSON ์๋ต NMH-->>App: ์๋ต ์ ๋ฌ
Native Messaging์ด๋?
Chrome์ด ์ ๊ณตํ๋ API๋ก, ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ์ ์ปดํจํฐ์ ์ค์น๋ ๋ก์ปฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ์ด๋ค.
์ ํ์ํ๊ฐ?
- Chrome Extension์ ๋ณด์ ์๋๋ฐ์ค ์์์ ๋์ํ์ฌ ๋ก์ปฌ ํ์ผ, ํ๋ก์ธ์ค์ ์ง์ ์ ๊ทผ ๋ถ๊ฐ
- Web Agent์ ํธ์คํธ ์ฑ(๋ฐฑ์๋ ์๋ฒ)์ ๋ก์ปฌ์์ ์คํ๋จ
- ์ด ๋์ ์ฐ๊ฒฐํ๋ ๊ณต์์ ์ด๊ณ ์์ ํ ๋ธ๋ฆฟ์ง๊ฐ Native Messaging
๋์ ์๋ฆฌ:
- Host Manifest ๋ฑ๋ก: ๋ก์ปฌ ์ฑ์ด JSON ๋งค๋ํ์คํธ ํ์ผ์ OS ์ง์ ๊ฒฝ๋ก์ ๋ฑ๋ก
{ "name": "com.example.webagent", "description": "Web Agent Native Host", "path": "/usr/local/bin/web-agent-host", "type": "stdio", "allowed_origins": ["chrome-extension://abcdef12345/"] } - ์ฐ๊ฒฐ ์๋ฆฝ: Extension์ด
chrome.runtime.connectNative("com.example.webagent")ํธ์ถ - ๋ฉ์์ง ๊ตํ: stdin/stdout์ ํตํ JSON ํต์ (32-bit ๊ธธ์ด ํ๋ฆฌํฝ์ค + UTF-8 JSON)
- ๋ณด์:
allowed_origins์ ๋ช ์๋ Extension ID๋ง ์ฐ๊ฒฐ ํ์ฉ (์์ผ๋์นด๋ ๋ถ๊ฐ)
| ์์ฑ | ๊ฐ |
|---|---|
| ์ธ๋ฐ์ด๋ ๋ฉ์์ง ์ต๋ ํฌ๊ธฐ | 1 MB |
| ์์๋ฐ์ด๋ ๋ฉ์์ง ์ต๋ ํฌ๊ธฐ | 64 MB |
| ์ฐ๊ฒฐ ๋ฐฉ์ | ์๊ตฌ ์ฐ๊ฒฐ(connectNative) ๋๋ ๋จ๋ฐ์ฑ(sendNativeMessage) |
| Content Script์์ ์ง์ ์ฌ์ฉ | ๋ถ๊ฐ โ Service Worker๋ฅผ ํตํด ์ค๊ณ ํ์ |
Host Manifest ๋ฑ๋ก ๊ฒฝ๋ก:
| OS | ๊ฒฝ๋ก |
|---|---|
| macOS | ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/ |
| Linux | ~/.config/google-chrome/NativeMessagingHosts/ |
| Windows | ๋ ์ง์คํธ๋ฆฌ HKCU\Software\Google\Chrome\NativeMessagingHosts\ |
๋ฐฉ์ 2: Playwright (CDP ์ง์ ์ ์ด)
Playwright MCP ๋ฑ์ด ์ฌ์ฉํ๋ ๋ฐฉ์. ๋ธ๋ผ์ฐ์ ํ๋ก์ธ์ค๋ฅผ ์ง์ ์คํํ๊ณ ์ ์ดํ๋ค.
sequenceDiagram autonumber participant Agent as Agent / MCP Server participant PW as Playwright Engine participant CDP as Chrome DevTools Protocol participant Browser as Browser Process Agent->>PW: API ํธ์ถ (navigate, click, extract...) PW->>CDP: WebSocket CDP ๋ช ๋ น CDP->>Browser: ๋ธ๋ผ์ฐ์ ๋ด๋ถ ์คํ Browser-->>CDP: ์คํ ๊ฒฐ๊ณผ CDP-->>PW: ๊ฒฐ๊ณผ ๋ฐํ PW-->>Agent: ๊ตฌ์กฐํ๋ ์๋ต
๋ ๋ฐฉ์ ๋น๊ต
| ๋น๊ต ํญ๋ชฉ | Extension + Native Messaging | Playwright (CDP) |
|---|---|---|
| ์ฌ์ฉ์ ์ธ์ | ๊ธฐ์กด ๋ก๊ทธ์ธ/์ฟ ํค ํ์ฉ ๊ฐ๋ฅ | ์ ๋ธ๋ผ์ฐ์ ํ๋กํ (๊ธฐ๋ณธ๊ฐ) |
| โDebuggerโ ๊ฒฝ๊ณ | ์์ | โChrome is being controlled by automated test softwareโ ํ์ |
| ์ค์น ๋ณต์ก๋ | Extension + Native Host ์ค์น ํ์ | npm install playwright |
| ๋ธ๋ผ์ฐ์ ํธํ | Chrome ์ ์ฉ | Chromium, Firefox, WebKit |
| ์ ํฉํ ์ฌ์ฉ์ฒ | ์ธ์ฆ๋ ์ธํธ๋ผ๋ท, ๊ฐ์ธํ๋ ์น ์์ | ๊ณต๊ฐ ์น์ฌ์ดํธ, ํ ์คํธ, ์คํฌ๋ํ |
์์ ์ฅ์น (Guard Mechanisms)
Web Agent๋ ์์จ์ ์ผ๋ก ๋์ํ๋ฏ๋ก ๋ฐ๋์ ์์ ์ฅ์น๊ฐ ํ์ํ๋ค:
| ์ํ | ์์ ์ฅ์น | ์ค๋ช |
|---|---|---|
| ๋ฌดํ ๋ฃจํ | ๋ฐ๋ณต ํ๋ ๊ฐ์ง | ๋์ผ ํ๋ Nํ ๋ฐ๋ณต ์ ์๋ ์ฐจ๋จ |
| ์ ์ฒด(Stale) ์ํ | ํ์ด์ง ๋ณํ ๋ชจ๋ํฐ๋ง | ์ฌ๋ฌ ํ๋ ํ ํ์ด์ง ๋ณํ ์์ผ๋ฉด ๊ฒฝ๊ณ |
| Prompt Injection | ์ ๋ ฅ ๊ฒ์ฆ | ์น ํ์ด์ง ์ฝํ ์ธ ๊ฐ ์์ด์ ํธ ์ง์๋ฅผ ์ค์ผ์ํค๋ ๊ณต๊ฒฉ ๋ฐฉ์ด |
| ์ธ์ ํญ์ฃผ | TTL ๋ฐ ์ต๋ ์ธ์ ์ | ์ ํด ์ธ์ ์๋ ์ ๋ฆฌ, ๋ฆฌ์์ค ๋ณดํธ |
| ๋ฏผ๊ฐ ์์ | ์ฌ์ฉ์ ํ์ธ | ๊ฒฐ์ , ์ญ์ ๋ฑ ๋๋๋ฆฌ๊ธฐ ์ด๋ ค์ด ์์ ์ ํ์ธ ์์ฒญ |
์ฃผ์ ๋์ ๊ณผ์
- ์ ๋ขฐ์ฑ: LLM์ ์ถ๋ก ์ค๋ฅ(hallucination)๋ก ์๋ชป๋ ์์๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ์๋ฑํ ์์ ์ํ ๊ฐ๋ฅ. WebVoyager ๋ฒค์น๋งํฌ ๊ธฐ์ค ์ต๊ณ ์ฑ๊ณต๋ฅ ์ ์ฝ 89%
- ๋ณด์: ์น ํ์ด์ง์ ์จ๊ฒจ์ง ์ ์์ ์ง์(Prompt Injection)๊ฐ ์์ด์ ํธ๋ฅผ ์กฐ์ํ ์ ์์. Anthropic ์ฐ๊ตฌ์์ ๊ณต๊ฒฉ ์ฑ๊ณต๋ฅ ์ 23.6% โ 11.2%๋ก ๋ฎ์ท์ผ๋ ์์ ํด๊ฒฐ์ ๋ฏธ์
- ๋น์ฉ ๋ฐ ์ง์ฐ: ๋งค ํ๋๋ง๋ค LLM API ํธ์ถ โ ๋น์ฉ๊ณผ ์๋ต ์๊ฐ์ ํธ๋ ์ด๋์คํ
- ๋์ ์ฝํ ์ธ : SPA, ๋ฌดํ ์คํฌ๋กค, CAPTCHA, ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ๋ฑ์ ์ฌ์ ํ ๋์
- ๋ฒ์ ์ด์: ์์ด์ ํธ์ ์๋ํ๋ ์น ์ ๊ทผ์ด ์๋น์ค ์ฝ๊ด(ToS)์ ์๋ฐํ ์ ์๋์ง์ ๋ํ ๋ฒ์ ๋ ผ์ ์งํ ์ค (Amazon vs. Perplexity ์์ก, 2025)
์ฃผ์ ํ๋ ์์ํฌ ๋ฐ ๋๊ตฌ (2025-2026)
| ํ๋ ์์ํฌ | ์ ํ | ํน์ง |
|---|---|---|
| browser-use | ์คํ์์ค | Python/TS SDK, WebVoyager 89.1% ๋ฌ์ฑ |
| Playwright MCP | ์คํ์์ค | Accessibility Snapshot ๊ธฐ๋ฐ, MCP ํ์ค |
| Stagehand | ์คํ์์ค | ์์ฐ์ด ๋ช ๋ น, ์๊ฐ ๋ณต๊ตฌ(self-healing) |
| Skyvern | ์์ฉ | CV + LLM ํ์ด๋ธ๋ฆฌ๋, ์ฝ๋ ๋ถํ์ |
| Perplexity Comet | ์๋น์์ฉ | Chromium ๊ธฐ๋ฐ AI ๋ธ๋ผ์ฐ์ |
| ChatGPT Atlas | ์๋น์์ฉ | ํญ๋ณ ์์ด์ ํธ ๋ชจ๋ |
๋ฏธ๋ ๋ฐฉํฅ: WebMCP
2026๋ 2์ Google์ด Chrome Canary์ WebMCP ํ๋ฆฌ๋ทฐ๋ฅผ ํ์ฌ. ์น์ฌ์ดํธ๊ฐ AI ์์ด์ ํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ํ๋ ํ์ค์ ์ ์:
- Declarative API: HTML ํผ์ ๊ตฌ์กฐํ๋ ์ค๋ช ์ ๊ณต
- Imperative API: ๋์ ์ํธ์์ฉ์ ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค
- W3C๋ฅผ ํตํด Google + Microsoft ๊ณต๋ ํ์คํ ์ถ์ง
์์ด์ ํธ๊ฐ ์น์ฌ์ดํธ๋ฅผ โ์คํฌ๋ํโํ๋ ์๋์์, ์น์ฌ์ดํธ๊ฐ ์์ด์ ํธ๋ฅผ โ์ด๋โํ๋ ์๋๋ก์ ์ ํ