원문 캡처 · jon.oberheide.org
원문 캡처 · jon.oberheide.org

2026년 10월 24일

에이전트가 웹사이트에 로그인하려면 사용자 이름과 비밀번호뿐 아니라 2단계 인증(2FA)도 통과해야 할 때가 있다. 웹사이트가 API나 에이전트용 인터페이스를 제공하지 않는 상황에서, 한 개인용 앱에 사용되는 YubiKey의 물리적 터치를 자동화한 과정을 소개한다.

코딩 에이전트, 기업용 에이전트, 개인 비서 에이전트와 컴퓨터 사용 모델은 시연을 넘어 실제 업무를 처리하는 단계로 빠르게 나아가고 있다. 에이전트가 웹사이트에 접속해 대신 작업하려면 로그인이 필요하지만, CAPTCHA나 봇 방지 기능 때문에 막히기도 하고 인증 절차가 복잡해 어려움을 겪기도 한다. 여기서는 후자의 문제와 이를 해결하기 위해 만든 한 가지 우회 방법을 다룬다.

개인용 앱은 여러 웹 포털에 로그인한다. 이 포털들은 API, MCP 또는 에이전트가 이용하기 편리한 인터페이스를 제공하지 않아 현재로서는 브라우저 자동화와 스크래핑이 가장 나은 방법이다. 헤드리스 브라우저 자동화는 사람 계정의 자격 증명을 사용하며, 로그인에는 보통 사용자 이름과 비밀번호에 더해 웹 포털에 따라 여러 방식의 2FA가 적용된다.

듀오(Duo)를 창업한 경험에 비춰도 2FA 방식이 다양한 것은 놀랍지 않다. 이 방식들은 자동화가 아니라 사람이 직접 로그인하도록 설계됐다. 사용자 이름과 비밀번호를 에이전트에 제공하는 일은 쉽지만, 2FA를 자동화하는 일은 방식에 따라 조금 더 번거롭거나 훨씬 어려울 수 있다. 결정성이 없는 에이전트에 재사용 가능한 자격 증명을 제공하는 일은 위험할 수 있다. 다만 여기서 사용하는 자동화는 순수한 컴퓨터 사용 모델보다 결정성이 높다.

방식전제에이전트 자동화 난이도자동화 방법
TOTP(인증 앱)휴대전화에 공유 비밀 키가 있음쉬움TOTP 시드를 저장하고 필요할 때 일회용 비밀번호를 계산한다.
패스키/WebAuthn플랫폼 또는 비밀번호 관리자 인증기가 있음쉬움키 자료를 저장하고 필요할 때 서명을 계산한다. 일부 사이트는 하드웨어 증명이나 사용자 확인을 요구할 수 있다.
이메일 OTP읽을 수 있는 받은 편지함이 있음보통에이전트가 읽을 수 있는 주소로 이메일을 전달하고, 코드를 추출해 전송 지연에 대응한다.
SMS OTPSIM 카드가 있는 전화기가 있음해킹에 가까움Twilio 같은 서비스를 통해 가상 번호를 빌려 웹훅으로 문자를 받는다. VoIP 차단, 단축 번호 발신자 전송 등 여러 문제가 있다.
음성 통화 OTP전화를 받고 내용을 들을 사람이 있음더 큰 해킹가상 번호를 사용하고 음성-텍스트 변환으로 OTP를 추출한다. DTMF로 OTP를 입력해야 하는 모델도 대안이 될 수 있다.
푸시 승인휴대전화에 공급업체 앱이 있음가장 큰 해킹공급업체의 모바일 앱을 모방해야 하므로 수고에 비해 실익이 없다.
하드웨어 보안 키(U2F/FIDO2)물리적 보안 키와 사용자 존재 확인용 터치가 있음어렵지만 여기서 시도한다키는 비밀 정보를 내보내지 않고 서명할 때마다 물리적 터치가 필요하다. 정말 그럴까?

위 방식의 자동화 편의성은 각 방식의 보안성이나 사용 편의성과는 별개의 문제다. 보안성이 높을수록 자동화하기 어렵다는 반비례 관계가 항상 성립하는 것도 아니다. 예를 들어 패스키는 보안성이 높고 사용하기 편리하며 자동화하기도 쉽다. 이상적인 환경이라면 에이전트에 범위가 제한되고 취소할 수 있으며 감사를 지원하는 자격 증명을 위임하는 API나 MCP가 있어야 한다. 하지만 더 나은 환경이 마련되기 전까지는 현재 웹을 활용해야 한다.

YubiKey 터치를 자동화하는 방법

앱이 로그인하는 웹 포털 대부분은 TOTP, SMS 또는 이메일 코드를 지원해 자동화하기가 비교적 수월하다. TOTP가 가장 적합하다. 전용 프로그램용 받은 편지함을 별도 계정으로 설정할 수 있다면 이메일도 괜찮다. 예를 들어 Resend를 사용할 수 있다. Twilio를 통한 SMS도 쓸 만하지만 단축 번호 발신자에는 일부 제약이 있다.

앱에 중요한 웹 포털 하나는 전화 통화 또는 하드웨어 보안 키만 지원한다. 구체적으로는 증명이 필요한 Yubico YubiKey를 요구한다. 전화 통화 방식은 작동하지만 전송 가능성, 음질, 타이밍, 음성 인식 오류 등 VoIP로 이뤄지는 통화에서도 예상할 수 있는 문제가 있다. 이에 FIDO의 챌린지-응답 절차에서 YubiKey 터치를 자동화해 보기로 했다. 꼭 필요한 작업은 아니지만, 기존 로그인보다 안정성과 보안을 높일 수 있고 흥미로운 도전처럼 보였다.

일반적인 YubiKey 로그인에서는 웹사이트가 브라우저에 챌린지를 보내고, 브라우저는 CTAP2를 통해 USB로 YubiKey와 통신한다. 사용자는 PIN을 입력하고 YubiKey의 정전식 센서를 터치해 사용자 존재를 확인할 수 있다.

일반적인 WebAuthn 흐름

이를 자동화하려면 브라우저의 FIDO 챌린지를 중계하고 YubiKey의 정전식 센서를 물리적으로 터치하는 동작을 자동화해야 한다.

앱은 Vercel에서 실행되고 자동화 작업은 일회용 Vercel Sandbox에서 실행된다. 자동화에는 Playwright와 헤드리스 Chromium 브라우저를 사용한다. YubiKey는 클라우드가 아닌 물리적 호스트의 USB 포트에 연결돼 있으며, 이 호스트는 샌드박스와 통신할 수 있다. 앱이 포털에 로그인하면 헤드리스 브라우저가 FIDO 챌린지를 가로채 물리적 호스트로 전달한다. 호스트는 챌린지를 YubiKey로 보내고, YubiKey 터치가 이뤄지면 서명 응답을 생성한다. 이 응답은 샌드박스로 돌아가 포털 웹사이트에 전달된다.

중계된 WebAuthn 흐름

이 구성은 인터넷에 공개된 YubiKey 서명 오라클이 아니다. 샌드박스의 자동화 작업만 서명을 요청할 수 있고, 요청 가능한 출처와 URL도 특정 범위로 제한하도록 여러 보완 통제를 둔다.

터치 회로와 자동화

YubiKey는 형태와 관계없이 금색 접점의 정전식 터치 센서를 갖고 있다. 이 센서는 로그인이나 거래에 사람의 확인이 있었는지 확인한다. 터치가 요구되면 해당 로직은 키의 펌웨어에 들어 있어, 터치 없이는 개인 키 자료로 챌린지에 서명하지 않는다.

YubiKey 이미지

2022년 Cisco의 요시 멜로크(Yossi Meloch)는 기계식 장치로 YubiKey 버튼을 누르는 자동화 방법을 소개했다. API로 작동하는 SwitchBot 버튼 누름 장치가 금속 도어 핀을 터치 영역에 대고, 접지된 헤드폰 케이블은 센서가 금속을 손가락처럼 인식하게 했다. 여기서는 기계적으로 움직이는 부품 없이 좀 더 안정적으로 만들고자 했다.

먼저 손가락을 접지로 쓰지 않고 수동으로 터치를 유발할 방법을 시험했다. 점퍼 와이어를 전도성 구리 테이프로 YubiKey 센서에 붙이고, 요청이 오면 와이어를 접지에 접촉시키자 터치가 작동했다. 단, USB 전원을 처음 연결했을 때 정전식 센서가 초기화와 보정을 하는 것으로 보였다. 따라서 배선이 연결되지 않은 상태에서 대기하도록 해야 한다.

다음으로 기계식 스위치 대신 프로그램으로 제어할 수 있는 간단한 릴레이 스위치를 적용해 센서 패드를 접지에 연결하려 했다. 전기공학자가 아니어서 여러 차례 시행착오를 겪었다. 작동하지 않은 PC817 광절연기를 포함해 몇 가지 스위치를 시험한 끝에 SIP-1A05 리드 릴레이를 사용해 성공했다.

전체 자동화의 중심에는 Raspberry Pi Pico가 있다. 이 USB 마이크로컨트롤러는 MicroPython으로 프로그래밍할 수 있다. 호스트의 중계 프로그램이 터치 요청을 보내면 Pico가 센서를 터치하도록 동작한다. 중계 프로그램이 FIDO 챌린지를 YubiKey로 보내면 키는 터치를 기다리는 중임을 나타내는 UPNEEDED 상태의 CTAP keepalive를 보낸다. 중계 프로그램은 이 상태를 감지한 뒤 USB 직렬 연결을 통해 Pico에 TOUCH 300 명령을 보낸다. 실행 중인 MicroPython 프로그램은 300ms 동안 키를 터치하도록 지시받는다. 이때 Pico의 GPIO 핀 하나가 3.3V로 올라가 리드 릴레이 코일을 작동시킨다. 코일은 5V 정격이지만 이 전압으로도 접점이 닫혀 YubiKey 센서와 접지를 연결하고 터치를 유발한다.

터치 회로도

작동하지 않은 PC817을 포함한 브레드보드 시험 구성은 다소 복잡했다.

브레드보드 시험 구성

납땜한 최종 구성은 더 깔끔하게 정리됐다.

최종 Pico 구성

브라우저 자동화가 실행되는 Vercel Sandbox부터 물리적 호스트의 중계 프로그램, 자동 터치를 수행하는 Pico, 그리고 다시 브라우저로 돌아오는 전체 과정이 작동했다. 이 구성은 기존에 사용하던 전화 통화 로그인보다 더 빠르고 안정적이며 보안성이 높다고 설명한다. 다만 이는 이 앱의 사용 사례에 대한 판단이다. 웹에서 에이전트가 접근하는 방식은 지난 수십 년과 달라질 수 있으며, 에이전트 인증과 권한 부여를 위해 새로운 작업이 필요할 수 있다. 그때까지는 원하는 대로 작동하게 하려고 여러 우회 방법을 조합해야 할 수도 있다.

소프트웨어와 부품

Vercel Sandbox의 Playwright 브라우저 심, 물리적 호스트에서 실행되는 중계 프로그램, Pico 펌웨어는 모두 Claude Code로 작성했다. 코드는 특정 앱과 사용 사례에 맞춰져 있다. 정리해 GitHub에 공개할 계획은 언급했지만, 이 글에는 코드 저장소를 제공하지 않는다.

아래는 설명한 구성을 재현할 때 필요한 부품과 구매처다.

부품구매처참고
YubiKey 5 NFC (USB-A)Amazon, Yubico에이전트 전용 하드웨어 키
Raspberry Pi Pico H (RP2040)Amazon, DigiKeyMicroPython을 실행한다. 마이크로 USB 케이블이 필요하다.
SIP-1A05 리드 릴레이Amazon, DigiKey작동한 릴레이다. 다이오드가 내장된 SIP-1A05D도 사용할 수 있다.
1N4148 다이오드Amazon, DigiKey코일의 역기전력 보호용이다.
전도성 구리 테이프Amazon키의 터치 센서에 붙일 작은 조각이다.
주석 도금 단선 구리선Amazon원하는 종류의 전선이다.
납땜용 브레드보드Amazon, Adafruit더 완성도 있게 납땜한 구성에 사용한다.