활동 2: 웹 자동화 — AI와 크롬 연결하기

English version

오늘은 공개 페이지 하나만 읽습니다

앞 편에서 만든 teacher-web-assistant를 엽니다. 오늘의 목표는 AI가 내가 보고 있는 공개 페이지를 읽는지 확인하고, 사용 후 연결을 끊는 것입니다. 학교 계정으로 로그인하지 않습니다.

준비가 끝나면 평소 사용하던 창과 별개인 Chrome 창이 하나 열립니다. 거기에 Example Domain이라는 제목이 보일 것입니다. AI에게 그 제목을 읽어 달라고 요청하고, 실제 화면과 답을 비교합니다.

브라우저 연결은 AI에게 화면을 보고 조작할 수 있는 도구를 주는 일입니다. “읽기만 해 줘”라고 해도 수정 기능이 사라지는 것은 아닙니다. 이번에는 로그인 없는 공개 페이지만 남겨 두고, 낯선 도구 요청은 승인하지 않습니다. 학교 기기에서 도구 설치나 자동화가 제한되면 그 정책을 우회하지 않습니다.

아래에서는 다음 버튼으로 별도 연습 페이지 열기 → 제목 대조 → 연결 종료를 살펴봅니다. 왼쪽 제목과 AI의 답이 같은지 확인해 보세요. 실제 준비에서 사용할 Example Domain과 달리, 이 장면의 제목은 “교사 연습 페이지”입니다.

가상의 교육용 시뮬레이션이며 실제 서비스 화면이나 조회 결과가 아닙니다. 버튼을 눌러도 사이트 연결, 내 컴퓨터의 파일 생성, 실제 알림 발송이나 예약은 하지 않습니다.

별도 페이지 확인부터 연결 종료까지Chrome 브라우저 모의 화면 · 학습용 재현
가상 교사 연습실학습용 재현
https://example.invalid/public

가상 학교 업무 화면 · 실제 학교 시스템이 아님

브라우저 상태 모의 연결 전

별도 연습 창

별도 연습 창
확인 항목내용
열린 페이지아직 없음
OpenCode 대화
opencode별도 페이지 확인부터 연결 종료까지실행 모드
실행 모드 · 모델 선택은 실제 환경에 따라 다름tab 에이전트
0:00 / 0:14
1 / 6

브라우저와 OpenCode 대화를 재현한 학습용 모의 화면입니다. 실제 웹사이트·학교 시스템·파일·AI에 연결되지 않으며, 자료와 알림은 모두 가상입니다.

1. 실습용 Chrome을 준비해 달라고 요청합니다

OpenCode에서 다음 요청을 보냅니다. 운영체제는 자신에게 맞게 Windows 또는 macOS라고 적습니다. 아래 접이식 안내도 함께 참고하라고 알려 주세요.

AGENTS.md를 먼저 읽어 줘. 나는 IT 비전공 교사야.
내 컴퓨터는 Windows야. 이 글의 '설정을 도와주는 사람과 AI를 위한 안내'를
참고해서 실습용 Chrome과 OpenCode 연결을 준비해 줘.

평소 Chrome과 학습지 폴더는 건드리지 마.
별도 Chrome에는 https://example.com/만 열어 줘.
학교 사이트를 열거나 로그인하지 마.
기존 OpenCode 설정은 보존하고 필요한 연결 항목만 추가해 줘.
설치나 설정 변경 전에는 무엇을 바꿀지 짧게 설명하고 내 확인을 기다려.
실행할 수 없는 단계는 내가 누를 곳이나 실행할 명령을 하나씩 안내해 줘.
방화벽이나 보안 정책을 바꾸지 마.
준비가 끝나면 내가 화면에서 확인할 것만 알려 줘.

AI가 프로그램 설치를 제안하면 기관이 허용한 것인지 먼저 확인합니다. 기존 설정을 통째로 지우거나 평소 Chrome을 종료하자는 제안은 그대로 승인하지 않습니다. 설치 권한이 없는 기기라면 승인된 실습 기기에서 같은 과정을 진행합니다.

전용 창이 열리면 교사가 확인할 것은 세 가지입니다. 평소 쓰던 탭들이 따라오지 않았는지, 학교 계정으로 로그인하지 않았는지, 주소가 https://example.com/인지 봅니다. Chrome 동기화나 계정 로그인 안내가 나오면 이번 실습에서는 건너뜁니다. 이름만 다른 창이 아니라 별도 프로필인지도 아래 준비 과정에서 확인해야 합니다.

설정을 도와주는 사람과 AI를 위한 안내

이 부분은 교사가 외울 내용이 아닙니다. 직접 설정하거나 실습을 도와주는 사람이 실행 순서와 근거를 확인할 때 사용합니다.

준비와 프로필 분리

공식 요구 사항에 맞는 Node.js LTS와 npm, 안정 버전 Chrome, OpenCode를 승인된 절차로 준비합니다. opencode --version, node --version, npm --version, npx --version으로 설치 여부를 확인합니다. 설치 후 명령을 찾지 못하면 새 터미널에서 PATH를 확인합니다. Windows 실행 정책에 막히면 승인된 npm.cmd, npx.cmd를 사용하되 실행 정책을 완화하지 않습니다.

Chrome 136부터 기본 사용자 데이터 폴더에 원격 디버깅 옵션이 적용되지 않습니다. 아래처럼 비기본 --user-data-dir가 필요합니다. 기존 프로필을 복사하지 않습니다. 예시의 teacher-browser-profile이 이미 다른 용도이거나 동기화되는 위치라면 승인된 별도 로컬 경로로 바꿉니다. 같은 전용 프로필을 사용 중인 이전 실습 창은 먼저 닫습니다. 평소 Chrome은 닫을 필요가 없습니다.

Windows PowerShell

다음 명령은 일반적인 설치 위치를 찾고 전용 Chrome을 엽니다. 관리자 권한은 필요하지 않습니다.

$candidates = @(
  "$env:ProgramFiles\Google\Chrome\Application\chrome.exe",
  "${env:ProgramFiles(x86)}\Google\Chrome\Application\chrome.exe",
  "$env:LOCALAPPDATA\Google\Chrome\Application\chrome.exe"
)
$chrome = $candidates | Where-Object { Test-Path $_ } | Select-Object -First 1
if (-not $chrome) { throw "Chrome path not found. Check the approved installation path." }
$profile = Join-Path $env:USERPROFILE "teacher-browser-profile"
Start-Process -FilePath $chrome -ArgumentList @(
  '--remote-debugging-address=127.0.0.1',
  '--remote-debugging-port=9222',
  "--user-data-dir=`"$profile`"",
  'https://example.com/'
)

사용자 지정 설치라면 Chrome 바로가기 속성에서 실행 파일 경로를 확인하고 $chrome에 실제 경로를 넣어 실행 부분을 사용합니다. 프로필 경로의 따옴표는 사용자 이름의 공백을 보존합니다.

macOS 터미널

일반적인 시스템 설치에서는 다음을 실행합니다. sudo는 사용하지 않습니다.

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --remote-debugging-address=127.0.0.1 \
  --remote-debugging-port=9222 \
  --user-data-dir="$HOME/teacher-browser-profile" \
  https://example.com/

사용자별 설치가 ~/Applications에 있다면 첫 줄을 "$HOME/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"으로 바꿉니다. 다른 설치 위치는 Finder에서 확인합니다. 실행 로그가 계속 나오는 터미널은 그대로 두고 다음 확인은 새 탭에서 합니다.

로컬 연결 확인

전용 창의 chrome://version에서 프로필 경로가 teacher-browser-profile 아래인지 확인하고 그 탭을 닫습니다. 공개 연습 페이지만 남깁니다. Windows에서는 다음을 실행합니다.

Get-NetTCPConnection -LocalPort 9222 -State Listen |
  Select-Object LocalAddress, LocalPort, OwningProcess
Invoke-RestMethod http://127.0.0.1:9222/json/version |
  Select-Object Browser, webSocketDebuggerUrl

macOS에서는 다음을 실행합니다.

lsof -nP -iTCP:9222 -sTCP:LISTEN
curl --fail --silent --show-error http://127.0.0.1:9222/json/version

수신 주소가 127.0.0.1 또는 ::1 같은 루프백이고 JSON에 Browser, webSocketDebuggerUrl이 있는지 확인합니다. 이것은 Chrome의 응답 확인이며 아직 AI 연결 성공은 아닙니다. 0.0.0.0, *, :: 등 전체 인터페이스 수신이거나 다른 프로세스가 포트를 쓰면 중단하고 원인을 확인합니다. 다른 프로세스를 임의로 종료하지 않습니다. 방화벽 개방이나 포트 포워딩은 하지 않습니다. 디버깅 연결 정보는 대화나 공유 문서에 붙여 넣지 않습니다. 루프백도 같은 컴퓨터의 다른 프로그램으로부터 완전히 격리되는 것은 아닙니다.

OpenCode 연결 설정

teacher-web-assistant/opencode.json이 있으면 안전한 로컬 사본을 두고 기존 설정을 보존합니다. mcp 아래에 다음 chrome-devtools 항목만 병합합니다. 동일 이름이 있으면 수정하며 중복 키를 만들지 않습니다. 다음 전체 예시는 새 파일일 때만 그대로 사용합니다.

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "chrome-devtools": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "chrome-devtools-mcp@latest",
        "--browser-url=http://127.0.0.1:9222",
        "--no-usage-statistics",
        "--no-performance-crux"
      ],
      "enabled": true
    }
  }
}

OpenCode 형식은 실행 파일과 인수를 command 배열에 함께 넣습니다. 여기서 type은 local입니다. Chrome의 HTTP 주소를 원격 MCP 서버로 설정하지 않습니다. Windows에서 npx를 찾지 못하면 PATH와 설치를 확인하고 필요하면 첫 항목에 npx.cmd나 승인된 실행 파일 경로를 사용합니다.

-y는 패키지 설치 확인을 자동 수락하고 @latest는 최신 패키지를 가져오므로 설치 허가를 먼저 확인합니다. 첫 다운로드가 느리면 연결 제한 시간에 걸릴 수 있습니다. 설치 로그와 오류부터 확인하고 무작정 재시도하지 않습니다.

공식 옵션 문서에 따르면 마지막 두 옵션은 MCP 사용 통계와 성능 추적 URL의 CrUX 전송을 끕니다. 모델로 보내는 화면·텍스트나 Chrome 자체 통계를 모두 차단하는 옵션은 아닙니다. 읽기 전용 접근 통제도 아니므로 기관 정책에 맞는 도구 권한을 별도로 적용합니다.

저장 후 OpenCode 세션을 종료하고 이 작업 폴더에서 다시 시작합니다. MCP 상태에서 chrome-devtools 연결을 확인합니다. 실패하면 Chrome 포트 응답, 패키지 실행, OpenCode 설정 순서로 원인을 나눠 봅니다. 보안 경고나 기관 차단은 우회하지 않습니다.

2. AI에게 페이지 제목을 읽어 달라고 합니다

준비 과정에서 OpenCode를 다시 열라고 안내받으면, 기존 대화를 종료하고 같은 teacher-web-assistant 폴더에서 다시 시작합니다. 전용 Chrome은 열어 둡니다. 그런 다음 다음 요청을 보냅니다.

AGENTS.md를 먼저 읽어 줘. 이번에는 공개 연습 페이지뿐이야.
연결된 브라우저 도구로 탭을 확인해 줘.
example.com이 없거나 예상하지 않은 탭이 있으면 내용을 읽지 말고 멈춰.
https://example.com/의 제목과 주소, 화면의 첫 제목을 실제로 읽어 줘.
클릭, 입력, 로그인, 다운로드, 다른 사이트 이동은 하지 마.
확인 시점과 결과를 outputs/browser-check.md에 적어 줘.
도구 연결에 실패하면 알고 있는 제목을 답하지 말고 확인 실패라고 해 줘.

AI가 Example Domain이라고 답하면 전용 Chrome 화면과 비교합니다. OpenCode에 브라우저 도구를 호출한 기록과 응답도 있어야 합니다. AI는 이 페이지의 제목을 원래 알고 있을 수 있으므로 정답만 맞았다고 연결된 것은 아닙니다.

outputs/browser-check.md를 열어 이번 확인 시점과 관찰 결과를 봅니다. 실패했다면 “확인 실패”라고 남기는 것이 맞습니다. 낯선 탭이 보이면 더 읽게 하지 말고 준비 단계로 돌아갑니다.

3. 연결을 끊는 것까지 연습합니다

제목을 읽었으면 오늘의 조회는 끝입니다. 다음처럼 종료를 요청합니다.

오늘 실습을 끝낼게. 이 작업 폴더의 브라우저 연결만 비활성화해 줘.
평소 Chrome과 다른 설정은 건드리지 마.
내가 OpenCode를 종료하고 전용 Chrome을 닫은 뒤,
브라우저 제어 연결이 남지 않았는지 확인하는 방법을 안내해 줘.
파일 설정만 바꾸고 이미 연결이 끊겼다고 말하지 마.

교사는 OpenCode 세션을 종료하고 전용 Chrome 창만 모두 닫습니다. 평소 쓰던 창은 그대로 둡니다. 연결을 도와준 사람이나 아래 명령으로 종료까지 확인합니다.

설정을 도와주는 사람과 AI를 위한 종료 확인

해당 MCP 항목을 "enabled": false로 저장하고 현재 OpenCode 세션을 종료합니다. 같은 브라우저에 연결한 다른 세션도 종료합니다. 파일 변경만으로 현재 연결이 즉시 끊긴다고 가정하지 않습니다.

전용 Chrome을 닫은 뒤 앞의 포트 확인 명령을 다시 실행합니다. 9222 수신 항목이 없어야 하고 /json/version 요청은 연결 실패해야 합니다. 이때의 연결 실패는 정상 종료의 증거입니다. macOS에서 직접 실행한 전용 Chrome이 터미널에 남아 있다면 해당 터미널의 Control-C로 종료합니다. 포트가 남아 있다면 소유 프로세스와 경로를 확인해 자신이 시작한 전용 Chrome만 종료합니다. 모든 Chrome을 일괄 종료하지 않습니다.

다음 실습에서는 전용 Chrome을 다시 실행하고 MCP를 활성화합니다. 프로필은 작업 폴더 밖에 보관하고 공유하거나 저장소에 올리지 않습니다. 창 닫기는 프로필 삭제나 사이트 로그아웃과 다릅니다.

컴퓨터 안에서 연결했더라도 화면 내용은 사용 중인 외부 AI 서비스로 전달될 수 있습니다. 이번에는 공개 페이지였지만, 실제 업무 사이트에서는 자동화와 AI 데이터 처리에 대한 기관 허가를 먼저 확인해야 합니다. 로그인할 때는 브라우저 연결을 비활성화하고 OpenCode 세션을 종료한 뒤 교사가 직접 인증합니다. 로그인 화면이 닫히고 허용된 업무 화면만 남았는지 확인한 뒤에만 다시 연결합니다. 인증 정보를 대화에 넣지 않습니다.

공개 페이지 관찰과 연결 종료를 모두 확인했다면 이번 실습은 끝입니다. 다음 편: 요청한 공문 찾아 정리하기에서는 교사가 검색 범위를 정하고 결과를 확인하는 연습으로 이어갑니다.

참고 자료

💬 댓글

이 글에 대한 의견을 남겨주세요