목록으로 돌아가기

블로그

SSH를 넘어서: AI 코딩 에이전트에 WebSocket이 터미널 프로토콜보다 나은 이유

SSH는 대화형 세션용으로 설계되었습니다. AI 코딩 에이전트에는 다른 것이 필요합니다. WebSocket이 원격 에이전트 제어에 더 적합한 프로토콜인 이유를 설명합니다.

게시일 태그: 엔지니어링 / 아키텍처 / 비교 / seo
블로그

이 카테고리의 제품 및 엔지니어링 업데이트를 확인하세요.

카테고리 보기

개발자들이 폰에서 Claude Code를 제어한다는 얘기를 처음 들으면, 자연스러운 반응은 이렇습니다: "그냥 Mac에 SSH 접속하면 되는 거 아닌가?"

합리적인 질문입니다. SSH는 검증되고, 안전하고, 어디서나 사용 가능합니다. 모든 개발자가 알고 있습니다. Termius, Blink Shell, Prompt 같은 훌륭한 모바일 SSH 클라이언트도 있습니다. 왜 다른 것을 만드는 걸까요?

답은 SSH가 나쁘다는 게 아닙니다. AI 코딩 에이전트가 대화형 셸 세션과 근본적으로 다른 상호작용 패턴을 가지며, 그 차이가 SSH를 억지로 사용할 때 더 나쁜 경험으로 누적된다는 것입니다.

상호작용 모델 불일치

SSH는 1995년에 특정 모델을 위해 설계되었습니다: 사람이 터미널에 앉아 명령을 입력하고, 출력을 읽고, 다시 명령을 입력합니다. 세션은 대화형이고 동기적입니다 — 전체 시간 동안 능동적으로 참여합니다.

AI 코딩 에이전트는 이 모델을 뒤집습니다:

SSH (대화형 셸)AI 에이전트 제어
세션 지속 시간수분~수시간 능동 사용수시간~수일, 대부분 유휴 모니터링
사람의 주의지속적간헐적 — 알림 시 확인
입력 패턴빈번한 키 입력가끔 프롬프트 + 승인 결정
출력 패턴명령에 대한 응답읽기보다 훑어보는 긴 자율 스트림
중요 이벤트보고 있으니 바로 확인보고 있지 않으면 놓칠 수 있음
실패 모드즉시 인지에이전트가 승인을 무한 대기할 수 있음

마지막 두 줄이 문제입니다. Claude Code가 작업을 마치거나 위험한 작업에 승인이 필요할 때, SSH는 이를 알릴 방법이 없습니다. 보고 있어야만 합니다.

문제 1: 푸시 알림 없음

가장 큰 차이입니다. AI 코딩 에이전트에서 가장 가치 있는 워크플로는:

  1. 작업 전송: "결제 모듈을 새 API로 리팩토링해줘"
  2. 폰을 내려놓기
  3. Claude가 끝나거나 입력이 필요할 때 알림 받기
  4. 검토하고 계속 진행

SSH는 3번을 할 수 없습니다. SSH 프로토콜에는 모바일 기기에 알림을 푸시하는 메커니즘이 없습니다. TCP 연결은 SSH 클라이언트가 포그라운드에 있을 때만 존재합니다 (Mosh를 사용하면 UDP 세션이 살아있는 동안). 그때도 "터미널에 데이터가 나타남"과 "이 기기에 푸시 알림을 보냄" 사이에 다리가 없습니다.

외부 서비스로 알림을 보내는 셸 스크립트로 우회할 수 있지만, 직접 구축하고 유지해야 하는 취약한 인프라입니다.

WebSocket 접근: 서버가 Claude Code의 출력과 훅 이벤트를 모니터링합니다. 완료나 승인 요청을 감지하면 연결된 클라이언트에 구조화된 이벤트를 푸시합니다. iOS 앱은 이를 네이티브 푸시 알림으로 변환합니다. 폴링 없이, 외부 서비스 없이.

문제 2: iOS 백그라운드 동작

iOS는 포그라운드에 없는 앱을 공격적으로 중단합니다. SSH 클라이언트가 백그라운드로 가면 약 30초 후 네트워크 연결이 중단됩니다. 그 후:

  • SSH: 연결 끊김. 앱을 다시 열면 "broken pipe" 오류. 재연결되지만 스크롤 위치와 부재 중 출력이 손실.
  • Mosh: 개선됨 — UDP를 사용하고 재개 가능. 하지만 중단 중 발생한 모든 것을 놓침. 알림 문제는 해결 못함.

이것은 근본적인 iOS 제약이지, SSH 클라이언트의 버그가 아닙니다. Apple은 배터리 절약을 위해 임의의 백그라운드 네트워크 연결을 허용하지 않습니다.

WebSocket 접근: 서버가 클라이언트 연결 상태에 관계없이 터미널 출력을 버퍼링합니다. iOS 앱이 포그라운드로 돌아오면 자동 재연결 후 다단계 상태 복원을 수행합니다 — 재연결 후 0.2초, 0.7초, 1.5초에 새로고침하여 완전한 현재 상태를 캡처합니다. 중요 이벤트(작업 완료, 오류)는 앱이 중단된 상태에서도 푸시 알림으로 전달됩니다.

문제 3: 세션 상태 관리

AI 코딩 에이전트는 종종 여러 병렬 작업을 실행합니다:

  • 세션 A: 인증 모듈 리팩토링
  • 세션 B: API 레이어 테스트 작성
  • 세션 C: 프로덕션 버그 수정

SSH로 관리하면:

  1. Mac에 SSH 접속
  2. 올바른 tmux 세션에 수동 연결: tmux attach -t session-a
  3. 상태 확인, 분리: Ctrl+B, D
  4. 다음 세션 연결: tmux attach -t session-b
  5. 반복

동작은 하지만, 폰 키보드에서는 수동적이고 실수가 잦습니다.

WebSocket 접근: 서버가 세션 관리를 구조화된 명령으로 노출합니다. iOS 앱은 현재 상태와 함께 활성 세션 목록을 표시합니다. 탭으로 전환. Mac의 파일시스템을 탐색하는 경로 선택기로 새 세션 생성. 스와이프로 세션 삭제. 서버가 모든 tmux 오케스트레이션을 처리합니다.

문제 4: 에이전트 이벤트 시맨틱

SSH는 원시 바이트를 전송합니다. 터미널에서 무슨 일이 일어나는지 이해하지 못합니다. Claude가 생각하는 건지, 코드를 쓰는 건지, 승인을 기다리는 건지, 작업을 완료한 건지 구분하지 못합니다.

Claude Code에는 특정 이벤트에서 셸 스크립트를 실행하는 훅 시스템이 있습니다: 작업 시작, 작업 완료, 알림 이벤트.

SSH 제한: 이런 훅 이벤트를 SSH 세션을 통해 깔끔하게 라우팅할 방법이 없습니다. 터미널 세션과 함께 별도 채널(다른 SSH 연결, 웹훅 서비스 등)이 필요합니다.

WebSocket 접근: 서버가 Claude Code의 훅 스크립트에서 HTTP POST로 훅 이벤트를 수신합니다. 이를 파싱하고, 중복 제거(3초 윈도우)하고, 터미널 데이터를 전달하는 동일한 WebSocket 연결로 iOS 앱에 푸시합니다. 하나의 연결, 여러 데이터 타입.

문제 5: 인증과 접근 제어

SSH 인증은 강력하지만 모바일 사용 사례에서는 복잡합니다:

  • iOS에서의 키 관리가 번거로움
  • Mac에 sshd를 설정해야 함
  • NAT를 통한 포트 포워딩에 추가 설정 필요
  • SSH를 인터넷에 노출하면 세심한 보안 설정이 요구됨

WebSocket 접근: Tactic Remote는 WebSocket을 통한 API 키 인증을 사용합니다. LAN 연결에서 API 키는 선택적(홈 네트워크가 신뢰 경계). Cloudflare Tunnel 연결에서는 API 키가 필수. Mac 앱이 32자 랜덤 키를 생성하고 QR 코드로 전달 — 키 파일 관리 없이, sshd 설정 없이.

이것은 의도적으로 단순화된 보안 모델입니다. SSH의 유연성을 설정 편의성과 교환합니다. SSH 공개 키 인증의 보안 보장이 필요하다면 SSH가 적합한 도구이지만, 아마 다른 사용 사례일 것입니다.

SSH가 여전히 나은 경우

SSH가 유리한 경우:

  • 많은 서버를 관리 — SSH는 서버 접속의 표준 프로토콜. 하나의 클라이언트로 여러 호스트.
  • 파일 전송이 필요 — SFTP/SCP가 SSH에 내장. Tactic Remote는 파일 전송을 하지 않음.
  • Claude 외 도구를 사용 — SSH는 에이전트 불문. 모든 터미널 앱에서 동작.
  • 포트 포워딩이 필요 — SSH 터널은 서비스 프록시에 실전 검증됨.
  • 컴플라이언스가 SSH를 요구 — 일부 조직은 감사 및 접근 제어를 위해 SSH를 요구.

실제 아키텍처

Tactic Remote의 WebSocket 아키텍처는 다음과 같습니다:

iPhone 앱                     Mac 서버                      Claude Code
    │                             │                              │
    │  WebSocket (ws:// or wss://)│                              │
    │◄───────────────────────────►│  tmux send-keys              │
    │  • 터미널 I/O              │─────────────────────────────►│
    │  • 세션 명령               │  tmux capture-pane           │
    │  • 이벤트 스트림           │◄─────────────────────────────│
    │                             │                              │
    │  푸시 알림                  │  HTTP POST /hook             │
    │◄────────────────────────────│◄─────────────────────────────│
    │  (WebSocket 이벤트 경유)    │  (Claude Code 훅 스크립트)    │
    │                             │                              │

서버가 폰과 Claude Code 사이에서 다음을 추가합니다:

  • 이벤트 시맨틱 (원시 터미널 바이트가 구조화된 이벤트로)
  • 세션 관리 (하나의 서버, 여러 tmux 세션)
  • 재연결 복원력 (버퍼된 상태, 자동 복원)
  • 알림 라우팅 (훅 이벤트가 푸시 알림으로)

SSH는 원시 터미널 연결(위쪽 화살표)만 제공하고, 중간의 지능은 제공하지 않습니다.

Mosh는 어떤가요?

Mosh(Mobile Shell)는 모바일에서 SSH를 개선하는 가장 일반적인 제안입니다. TCP 대신 UDP를 사용하여 다음에 도움:

  • 네트워크 로밍 (WiFi와 셀룰러 전환)
  • 연결 지속성 (클라이언트가 연결 해제되어도 서버가 상태 유지)
  • 로컬 에코 (지연 시간에 관계없이 즉각적인 키 입력 피드백)

Mosh는 모바일 SSH 경험을 진정으로 개선합니다. 하지만 근본적인 문제는 해결하지 못합니다:

  • 푸시 알림 없음
  • 에이전트 이벤트 인식 없음
  • 구조화된 세션 관리 없음
  • 여전히 iOS 백그라운드 중단 대상 (다만 복구가 빠름)

SSH 기반 도구에 전념한다면, Blink Shell + Mosh가 최고의 iOS 옵션입니다. 하지만 다른 문제를 풀어주는 좋은 도구입니다.

결론

질문은 추상적인 프로토콜 비교로서의 "SSH 대 WebSocket?"이 아닙니다. "워크플로에 어떤 상호작용 모델이 필요한가?"입니다.

서버를 관리하고 대화형 명령을 실행한다면, SSH가 수십 년간 검증된 신뢰성을 가진 적합한 프로토콜입니다.

자율적으로 실행되고, 간헐적으로 주의가 필요하며, 푸시 알림과 구조화된 이벤트 처리가 도움이 되는 AI 에이전트를 제어한다면, 전용 WebSocket 아키텍처가 SSH가 해결할 수 없는 문제를 풉니다 — SSH에 결함이 있어서가 아니라, 인간-컴퓨터 상호작용의 다른 시대를 위해 설계되었기 때문입니다.

Tactic Remote 사용해 보기

휴대전화로 코딩 에이전트를 원격 제어하세요

Mac, Windows, Linux 컴퓨터의 Claude Code, Codex 등에 연결하세요. iPhone이나 iPad에서 진행 상황을 확인하고 다음 요청을 보낼 수 있습니다.