Skip to content

보안 및 개인정보 ​

tapflow는 self-hosted 제품입니다. 빌드 파일, 기기 스트림, 세션 녹화물 — 모든 데이터가 여러분의 인프라 안에서만 움직입니다. 이 페이지는 tapflow가 설계상 어떻게 데이터를 보호하는지 설명합니다.

데이터는 네트워크를 벗어나지 않습니다 ​

tapflow는 외부 클라우드 서비스를 경유하지 않습니다.

데이터저장 위치외부 전송
빌드 파일 (.app.zip / .tar.gz / .apk)릴레이가 실행 중인 Mac의 로컬 스토리지❌
기기 스트림 (영상·터치)브라우저 ↔ 릴레이 ↔ 에이전트 — 모두 내부❌
세션 녹화물릴레이 서버(Mac)에 저장, 72시간 후 만료되며 자동 정리됨❌
로그릴레이와 에이전트가 실행 중인 Mac❌
계정·팀 정보릴레이의 SQLite DB (같은 Mac)❌

Appetize나 BrowserStack처럼 앱 바이너리를 외부 서버에 업로드할 필요가 없습니다. 바이너리는 여러분의 Mac에 머뭅니다.

LAN 우선 아키텍처 ​

tapflow의 권장 배포 구조는 에이전트와 릴레이가 같은 LAN 안에 있는 것입니다.

text
브라우저 (어디서든) ──WAN──▶ relay ◀──LAN──▶ agent
                              │
                              └── SQLite DB, 빌드 파일

에이전트 ↔ 릴레이 구간은 LAN 내부 트래픽입니다. 기기 스트림이 외부 서비스를 경유하지 않으므로, 앱의 UI와 동작이 네트워크 밖으로 노출될 위험이 없습니다.

브라우저 ↔ 릴레이 구간(WAN)에 TLS를 적용하려면 reverse proxy나 터널을 사용하세요. 외부 접속을 참고하세요. 릴레이의 tls 설정으로 릴레이가 직접 TLS를 종단할 수도 있습니다.

PAT 기반 인증 ​

tapflow의 프로그래밍 방식 접근은 개인 액세스 토큰(PAT)으로 제어됩니다.

  • PAT는 사용자별로 발급됩니다. 팀원을 제거하면 그 팀원의 토큰도 함께 삭제됩니다.
  • 각 토큰에는 권한을 제한하는 scope가 있습니다.
    • builds:write — 빌드 업로드 (CI/CD 파이프라인용, 대시보드 Settings → Tokens에서 발급)
    • view — 앱 목록, 업로드된 파일, 세션 스크린샷, UI 트리 조회. 원격에서 WebSocket으로 기기 세션을 열 때도 필요합니다.
    • agent — 원격 Mac의 에이전트를 릴레이에 연결. Admin만 발급할 수 있고 발급한 팀원이 Admin인 동안에만 쓸 수 있습니다.
  • 팀원의 대시보드 접근 권한은 PAT가 아니라 역할(role: Admin / Developer / QA / Viewer)로 별도 관리됩니다.
  • PAT로 호출해도 토큰 주인의 현재 역할이 적용됩니다. Viewer는 읽기 전용이므로 Viewer가 가진 builds:write 토큰으로는 빌드를 업로드할 수 없습니다. 역할을 확인하는 HTTP 엔드포인트는 요청마다 역할을 다시 읽으므로 역할을 바꾸면 그 엔드포인트에는 쿠키와 토큰 모두 바로 적용됩니다.
  • 이미 열린 기기 세션에도 바로 적용됩니다. 팀원을 제거하거나 토큰을 폐기하거나 agent 토큰을 발급한 Admin의 역할을 바꾸면 릴레이가 그 자격으로 열린 WebSocket 연결을 즉시 끊습니다. 토큰이나 로그인 세션이 만료된 연결도 30초 안에 끊깁니다.

접근 제어 경계 ​

tapflow가 제공하는 보호 범위와 여러분이 직접 관리해야 하는 범위는 다음과 같습니다.

tapflow가 담당하는 것:

  • API 인증: 빌드 업로드·조회, 댓글, 웹훅은 로그인 세션 또는 builds:write PAT로, 앱 목록·업로드된 파일·스크린샷·UI 트리는 로그인 세션 또는 view PAT로 호출할 수 있습니다. PAT를 받는 엔드포인트 목록은 REST API 레퍼런스에 있습니다.
  • 기기 스트림(WebSocket) 인증: 원격 연결은 로그인 세션이나 view scope PAT가 있어야 하며 원격 에이전트는 현재 Admin인 팀원이 발급한 agent scope PAT가 필요합니다.
  • 릴레이 로그(GET /api/v1/logs)는 릴레이 호스트에서만 조회할 수 있습니다.
  • 릴레이 포트에 loopback으로 들어오지 않은 모든 연결에 로그인 요구 (자체 loopback 포트로 들어오는 터널 트래픽 포함)
  • 외부 서비스로의 데이터 전송 없음

인프라 운영자가 담당해야 하는 것:

  • 릴레이가 실행되는 Mac의 OS 및 네트워크 보안
  • WAN 구간 TLS (reverse proxy 또는 터널 설정)
  • 릴레이 서버에 대한 네트워크 접근 제어 (방화벽, VPN 등)
  • 릴레이에서 사용하는 JWT_SECRET 등 환경변수 관리
  • 팀 분리: 릴레이 하나가 팀 하나를 담당하므로 팀끼리 빌드와 스트림을 격리하려면 릴레이를 따로 운영합니다.
  • 웹훅 관리 권한: 웹훅 수신처로 사내 사설망 주소를 쓸 수 있도록 설계되어 있어서 Admin·Developer·QA 역할의 팀원이나 builds:write PAT는 릴레이가 LAN 안의 호스트로 요청을 보내게 할 수 있습니다. 요청 본문은 고정된 빌드 상태 이벤트입니다. 응답은 웹훅을 등록한 사람에게 보이지 않습니다. 사내 네트워크에서 이 점이 중요하다면 이 역할을 누구에게 줄지 신중하게 정하세요.

내부 네트워크 전용으로 운영하는 경우

릴레이를 내부 LAN에서만 접근 가능하게 구성하면 WAN 구간 TLS 없이도 운영할 수 있습니다. 팀원 전체가 같은 네트워크(오피스 Wi-Fi, VPN)를 사용하는 경우에 적합합니다.

취약점 제보 ​

tapflow 코드에서 보안 문제를 발견했다면 공개 이슈 대신 비공개 채널로 제보해 주세요. 자세한 방법은 SECURITY.md를 참고하세요.

Released under the MIT License.