보안 및 개인정보
tapflow는 self-hosted 제품입니다. 빌드 파일, 기기 스트림, 세션 녹화물 — 모든 데이터가 여러분의 인프라 안에서만 움직입니다. 이 페이지는 tapflow가 설계상 어떻게 데이터를 보호하는지 설명합니다.
데이터는 네트워크를 벗어나지 않습니다
tapflow는 외부 클라우드 서비스를 경유하지 않습니다.
| 데이터 | 저장 위치 | 외부 전송 |
|---|---|---|
| 빌드 파일 (.app.zip / .tar.gz / .apk) | 릴레이가 실행 중인 Mac의 로컬 스토리지 | ❌ |
| 기기 스트림 (영상·터치) | 브라우저 ↔ 릴레이 ↔ 에이전트 — 모두 내부 | ❌ |
| 세션 녹화물 | 릴레이 서버(Mac)에 저장, 72시간 후 만료되며 자동 정리됨 | ❌ |
| 로그 | 릴레이와 에이전트가 실행 중인 Mac | ❌ |
| 계정·팀 정보 | 릴레이의 SQLite DB (같은 Mac) | ❌ |
Appetize나 BrowserStack처럼 앱 바이너리를 외부 서버에 업로드할 필요가 없습니다. 바이너리는 여러분의 Mac에 머뭅니다.
LAN 우선 아키텍처
tapflow의 권장 배포 구조는 에이전트와 릴레이가 같은 LAN 안에 있는 것입니다.
브라우저 (어디서든) ──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:writePAT로, 앱 목록·업로드된 파일·스크린샷·UI 트리는 로그인 세션 또는viewPAT로 호출할 수 있습니다. PAT를 받는 엔드포인트 목록은 REST API 레퍼런스에 있습니다. - 기기 스트림(WebSocket) 인증: 원격 연결은 로그인 세션이나
viewscope PAT가 있어야 하며 원격 에이전트는 현재 Admin인 팀원이 발급한agentscope PAT가 필요합니다. - 릴레이 로그(
GET /api/v1/logs)는 릴레이 호스트에서만 조회할 수 있습니다. - 릴레이 포트에 loopback으로 들어오지 않은 모든 연결에 로그인 요구 (자체 loopback 포트로 들어오는 터널 트래픽 포함)
- 외부 서비스로의 데이터 전송 없음
인프라 운영자가 담당해야 하는 것:
- 릴레이가 실행되는 Mac의 OS 및 네트워크 보안
- WAN 구간 TLS (reverse proxy 또는 터널 설정)
- 릴레이 서버에 대한 네트워크 접근 제어 (방화벽, VPN 등)
- 릴레이에서 사용하는
JWT_SECRET등 환경변수 관리 - 팀 분리: 릴레이 하나가 팀 하나를 담당하므로 팀끼리 빌드와 스트림을 격리하려면 릴레이를 따로 운영합니다.
- 웹훅 관리 권한: 웹훅 수신처로 사내 사설망 주소를 쓸 수 있도록 설계되어 있어서 Admin·Developer·QA 역할의 팀원이나
builds:writePAT는 릴레이가 LAN 안의 호스트로 요청을 보내게 할 수 있습니다. 요청 본문은 고정된 빌드 상태 이벤트입니다. 응답은 웹훅을 등록한 사람에게 보이지 않습니다. 사내 네트워크에서 이 점이 중요하다면 이 역할을 누구에게 줄지 신중하게 정하세요.
내부 네트워크 전용으로 운영하는 경우
릴레이를 내부 LAN에서만 접근 가능하게 구성하면 WAN 구간 TLS 없이도 운영할 수 있습니다. 팀원 전체가 같은 네트워크(오피스 Wi-Fi, VPN)를 사용하는 경우에 적합합니다.
취약점 제보
tapflow 코드에서 보안 문제를 발견했다면 공개 이슈 대신 비공개 채널로 제보해 주세요. 자세한 방법은 SECURITY.md를 참고하세요.