에이전트가 브라우저를 다루게 하려면 연결 입구가 필요했다. 나는 이 입구를 인터넷에 공개된 제어 서버로 만들지 않았다. 기존 앱이 소유한 로컬 파이프와 작은 연결 파일, 외부 대화와 통신하는 stdio 프로세스로 나눠 구성했다.
대화 연결과 앱 연결을 한 서버로 뭉치지 않는다
외부 대화는 Node stdio 서버와 MCP 메시지를 주고받는다. 이 서버는 실행 중인 브라우저의 연결 파일을 읽고 로컬 파이프에 요청을 전달한다. 브라우저 쪽은 기존 실행 호스트로 남는다. 대화를 연결했다고 새 브라우저나 다른 로그인 프로필을 만들지 않는다.
이 분리 덕분에 모델 의존성은 MCP 중계기에 들어가지 않는다. 브라우저가 새 판단을 자체 생성하는 대신 대화에서 정한 작업을 검증된 도구로 실행한다. 다만 로컬 경로와 OS 사용자 세션이 맞아야 연결되므로 인터넷 어디서나 접속하는 원격 브라우저라고 소개할 수 없다.
주소를 안다고 제어를 허용하지 않는다
앱은 실행 인스턴스별 파이프 이름과 무작위 토큰을 만든다. 요청은 토큰과 요청 ID, 정해진 계약의 request를 함께 보낸다. 서버는 길이를 확인한 뒤 timingSafeEqual로 토큰을 대조한다. 임의 문자열을 보내 연결에 성공한 것만으로 실행 함수에 도달하지 않는다.
토큰은 연결 파일의 실제 비밀 값이다. 로그나 공개 코드 예제에 복사하지 않는다. 공개 설명에는 값 대신 생성·전달·대조의 구조만 남긴다. 주소를 발견하는 기능과 제어 자격을 가진다는 사실을 같은 것으로 취급하면 로컬 연결에서도 불필요한 노출이 생긴다.
연결 파일 자체도 입력이다
중계기는 절대 경로의 연결 파일을 요구하고 일반 파일인지, 심볼릭 링크인지, 크기가 제한 안인지 확인한다. protocol과 endpoint 형태, 토큰 형식도 검사한다. 파일을 읽을 수 있다는 이유만으로 임의 주소를 브라우저의 진짜 입구로 믿지는 않는다.
앱은 임시 파일에 연결 정보를 쓴 뒤 정식 파일로 바꾼다. 종료 시에는 현재 파일의 instance가 자기 인스턴스인지 확인하고 지운다. 예전 프로세스가 늦게 종료되면서 새 프로세스의 연결 파일을 없애지 않도록 소유자를 대조하는 것이다. 파일 하나의 수명에도 실행 인스턴스 구분이 필요했다.
작은 연결에도 크기와 수명 제한을 둔다
파이프 서버는 입력 버퍼가 제한을 넘으면 소켓을 닫고 한 연결에서 첫 요청 한 개를 받는다. 중계기에도 응답 크기와 대기 제한이 있다. 이것이 모든 자원 소모를 해결하는 완전한 방어는 아니지만 정해지지 않은 크기의 메시지를 끝없이 쌓는 입구로 두지는 않았다.
시간 초과는 연결의 결과다. 브라우저 행동이 전송되지 않았다는 보증으로 해석하지 않는다. 중계 오류에는 요청 ID와 automaticReplay=false를 남긴다. 연결 안정성을 높이는 기능이 중복 입력을 만드는 기능으로 바뀌지 않게 하려면 통신 오류와 업무 결과를 나눠야 한다.
같은 OS 사용자라는 한계는 남는다
토큰을 쓴다고 같은 사용자 권한의 모든 프로그램을 서로 격리한 것은 아니다. 연결 파일에 접근할 수 있는 로컬 프로세스와 운영체제 권한, 실제 파일 접근 설정은 별도로 살펴야 한다. mode 값을 적었다고 모든 Windows ACL이 자동 검증됐다고 말할 수도 없다.
현재 입구는 공개 HTTP나 공개 CDP, 범용 자격 추출 도구를 제공하지 않는다. 이 사실을 PC 전체가 안전하다는 주장으로 넓히지 않는다. 업무용 연결은 무엇을 열지 않았는지보다 실제로 누가 파일을 읽고 어떤 요청을 보낼 수 있는지 설명해야 관리자가 범위를 이해할 수 있다.
연결 성공 다음에도 업무 검증은 계속된다
통합 시험에는 잘못된 토큰이 실행 함수 호출을 만들지 않는 확인이 있다. 이 글에서는 서버·중계기·시험 코드를 읽어 연결 책임을 대조했다. 실제 비밀을 복사하거나 새 공개 서버를 띄우지 않았고 현재 로그인 프로필을 변경하지 않았다.
정상 토큰으로 연결됐어도 작업 범위와 탭, 활성 플러그인, 결과 검사는 뒤에서 계속 필요하다. 나는 통신 입구의 인증을 업무 성공과 구분했다. 회사에 맞는 도구를 연결할 때도 연결 방식 하나로 모든 문제를 해결했다고 말하기보다 각 계층에서 확인하는 책임을 작게 나누는 편이 유지보수에 도움이 됐다.