보안 정책 · Security
최종 업데이트 · 2026-05-05
TubeFilter는 사용자가 분석한 영상 데이터와 라이브러리 정보를 안전하게 보호합니다. 이 페이지는 우리가 데이터를 어떻게 보호하는지에 대한 기술적 약속입니다.
01요약 · TL;DR
- 모든 데이터 전송은 TLS 1.3 (HTTPS) 암호화
- 인증은 Supabase Auth + Google OAuth — 비밀번호 직접 저장 안 함
- 데이터베이스는 Row-Level Security (RLS) 로 사용자 간 격리
- 결제는 Paddle (Merchant of Record) 위임 — 카드 정보 우리 서버 미저장
- API 키 노출/도난 방지 — 4중 키 회전 + Google Cloud API 제한
- 외부 위협 차단 — Cloudflare WAF + DDoS 보호
02인증 · Authentication
2.1 로그인 방식
TubeFilter는 비밀번호를 직접 받거나 저장하지 않습니다. 대신 Supabase Auth가 제공하는 Google OAuth 2.0 흐름을 사용합니다. 사용자의 Google 계정 자격증명은 Google 도메인에서만 처리되며, TubeFilter는 OAuth 동의 후 발급된 액세스 토큰만 사용합니다.
2.2 토큰 관리
모든 API 요청은 Authorization: Bearer <JWT> 헤더로 인증되며, 서버는 Supabase JWKS를 통해 토큰 위조를 방지합니다. 만료된 토큰은 자동 거부되고, 재발급은 OAuth refresh flow로만 가능합니다.
2.3 비로그인 사용자
가입 없이도 일부 분석을 체험할 수 있도록, 비로그인 사용자에게는 IP 기반 일일 한도를 적용합니다. 개인 식별 정보는 수집하지 않으며, IP 정보는 한도 카운팅 목적으로만 사용되고 24시간 후 자동 삭제됩니다.
03데이터 보호 · Data Protection
3.1 전송 중 암호화 (In Transit)
모든 사용자 ↔ TubeFilter 간 통신은 TLS 1.3 (HTTPS) 로 암호화됩니다. HTTP 요청은 자동으로 HTTPS로 리다이렉트되며, HSTS preload 등록으로 브라우저가 항상 HTTPS로 접속하도록 강제합니다.
3.2 저장 시 암호화 (At Rest)
데이터베이스 (Supabase Postgres) 의 모든 데이터는 AES-256 으로 암호화되어 디스크에 저장됩니다. 백업 파일도 동일하게 암호화됩니다.
3.3 사용자 간 데이터 격리
PostgreSQL Row-Level Security (RLS) 를 모든 사용자 데이터 테이블에 적용합니다. 사용자는 본인 영상 분석 결과 (라이브러리), 사용량, 구독 정보만 조회/수정 가능하며, 애플리케이션 코드 외에 데이터베이스 레벨에서도 격리가 강제됩니다.
04결제 보안 · Payment Security
모든 결제는 Paddle (Merchant of Record) 가 처리합니다. 신용카드 번호, CVC, 은행 계좌 정보는 TubeFilter 서버에 절대 저장되거나 전송되지 않습니다. PCI-DSS Level 1 인증을 받은 Paddle의 결제 페이지에서 직접 처리됩니다.
4.1 Webhook 검증
Paddle이 보내는 결제 이벤트 (구독 생성/갱신/취소) 는 다음 3겹 방어로 검증됩니다:
- HMAC-SHA256 서명 검증 (Paddle webhook secret)
- Timestamp 5분 윈도우 — replay 공격 방어
- Idempotency — event_id 중복 처리 방지
05API 보안 · API Security
5.1 키 관리
외부 AI API (Google Gemini) 키는 환경변수로만 관리되며 코드 저장소에 절대 커밋되지 않습니다. GitHub Secret Scanning + Push Protection 으로 실수 커밋도 차단됩니다.
5.2 키 로테이션 (Round-Robin)
Gemini API 키는 4개를 운영하며 매 호출마다 round-robin 으로 분산됩니다. 이는 (1) quota 분산, (2) 단일 키 노출 시 영향 최소화, (3) 키별 사용량 추적을 위한 설계입니다.
5.3 Rate Limit + Quota
모든 분석 엔드포인트에 사용자별 quota (분 단위) 와 동시 영상 수 제한이 적용됩니다. 비로그인 사용자는 IP 기반 일일 한도가 추가됩니다.
06인프라 · Infrastructure
6.1 호스팅
- Frontend: Vercel Edge Network (글로벌 CDN, 자동 HTTPS)
- Backend: Railway (격리된 컨테이너, 자동 재시작)
- Database: Supabase (관리형 Postgres, 일일 자동 백업)
- CDN/WAF: Cloudflare (DDoS 방어, Bot 차단)
6.2 보안 헤더
모든 응답에 다음 보안 헤더가 적용됩니다:
- HSTS — HTTPS 강제 (max-age 2년 + preload)
- Content-Security-Policy (CSP) — 허용된 도메인만 리소스 로드
- X-Frame-Options DENY + frame-ancestors none — 클릭재킹 차단
- X-Content-Type-Options nosniff — MIME 스니핑 차단
- Referrer-Policy strict-origin-when-cross-origin — 외부 URL 누출 최소화
- Permissions-Policy — 카메라/마이크/위치 자동 거부
07제3자 서비스 · Third-Party Services
서비스 운영을 위해 다음 제3자 처리자와 협력하며, 각각 자체 보안 인증을 갖추고 있습니다:
| 서비스 | 역할 | 인증/표준 |
|---|---|---|
| Supabase | DB · Auth · Storage | SOC 2 Type II, GDPR |
| Google Gemini API | AI 분석 · 임베딩 | ISO 27001, SOC 2/3 |
| YouTube Data API | 영상 메타데이터 | Google 데이터 처리 |
| Paddle | 결제 (Merchant of Record) | PCI-DSS Level 1, GDPR |
| Vercel | Frontend 호스팅 | SOC 2 Type II |
| Railway | Backend 호스팅 | SOC 2 Type II |
| Cloudflare | CDN · WAF · DDoS 방어 | SOC 2 Type II, ISO 27001 |
전송된 데이터는 각 서비스의 개인정보 처리방침에 따라 처리됩니다. 자세한 개인정보 처리는 개인정보 처리방침 페이지를 참조하세요.
08데이터 격리 · 사용자 라이브러리
분석된 영상은 사용자별 라이브러리 (user_videos 매핑) 로 격리됩니다. 한 사용자가 분석한 영상의 분리수거 결과는 다른 사용자에게 노출되지 않습니다. 글로벌 캐시는 LLM 비용 절감 목적으로만 운영되며, 라이브러리 매핑과는 분리됩니다.
09입력 검증 · Input Validation
9.1 Pydantic 스키마
모든 API 요청은 Pydantic 모델로 타입/포맷 검증됩니다. 잘못된 입력은 자동 422 응답으로 거부됩니다.
9.2 SQL Injection 방어
모든 데이터베이스 쿼리는 parameterized query 로 작성됩니다. 사용자 입력이 SQL 구문에 직접 결합되는 경로가 코드에 존재하지 않습니다.
9.3 LLM Prompt Injection 방어
사용자 자막/제목 등 외부 입력은 격리 컨테이너 (<user_transcript> 등) 로 감싸 LLM 시스템 지시와 분리됩니다. 알려진 오버라이드 패턴 ("ignore previous", "이전 지시 무시" 등) 은 zero-width space 삽입으로 약화됩니다.
10모니터링 · 로깅
서비스 운영을 위해 다음 정보를 로깅합니다:
- 요청 URL, HTTP 상태, 응답 시간 (개인 식별 정보 제외)
- 오류 발생 시 stack trace (사용자 입력은 마스킹)
- API 키, 토큰, 결제 정보는 자동 redact 처리
로그는 30일 보관 후 자동 삭제됩니다. 보안 사고 조사 등 법적으로 요구되는 경우에 한해 연장될 수 있습니다.
11취약점 신고 · Responsible Disclosure
보안 취약점을 발견하셨다면 공개 GitHub Issue 가 아닌 아래 이메일로 연락 부탁드립니다. 확인 후 24시간 이내 회신, 영향도에 따라 7~30일 내 패치를 목표로 합니다.
현재 별도의 버그 바운티 프로그램은 운영하지 않으나, 의미 있는 신고에 대해서는 감사 표시 (크레딧, 명예의 전당 등재) 를 검토합니다.
12사고 대응 · Incident Response
데이터 유출/침해 사고 발생 시 다음 절차를 따릅니다:
- 침해 확인 후 24시간 이내 영향 범위 파악 및 격리 조치
- 72시간 이내 영향받은 사용자에게 이메일 통지 (개인정보보호법 §34, GDPR Art. 33 준수)
- 관할 감독기관 (한국 개인정보보호위원회) 에 법정 기한 내 신고
- 사후 보고서 공개 (재발 방지 조치 포함)
13사용자 권리 · Your Rights
사용자는 언제든 다음 권리를 행사할 수 있습니다:
- 열람 — 본인 데이터 확인 (계정 페이지)
- 정정 — 잘못된 정보 수정 요청
- 삭제 (잊혀질 권리) — 계정 + 모든 라이브러리 영구 삭제
- 이동성 — JSON/CSV 형식으로 본인 데이터 다운로드
- 처리 제한 — 특정 용도 사용 거부
요청은 yangyeongjin458@gmail.com 으로 부탁드리며, 30일 이내 처리됩니다.
14Chrome 확장 프로그램 · Browser Extension
공식 확장 TubeFilter — Watch Later Selector 는 사이트와 동일한 보안 원칙을 따릅니다.
14.1 권한 (Manifest V3)
storage— 선택한 영상 큐를 사용자 기기에 저장 (chrome.storage.local). 외부 서버 전송 없음.host_permissions: youtube.com, tubefilter.app— YouTube 영상 카드에 [+ 추가] 버튼 삽입 + 보내기 클릭 시 TubeFilter로 핸드오프.
14.2 수집·전송하는 데이터
- 로컬 저장 (브라우저): 사용자가 선택한 영상의 video_id, 제목, 채널명, 추가 시각. 확장 제거 시 함께 삭제.
- TubeFilter로 전송: 보내기 클릭 시 선택된 영상 URL 목록만 (
?items=파라미터). 사용자 식별자·시청 기록·쿠키 전송 안 함. - 외부로 전송 안 함: 광고 SDK·분석 도구·텔레메트리 일체 없음.
14.3 인증 분리
확장은 사용자 로그인 정보에 접근하지 않습니다. TubeFilter 사이트 도착 후 사이트의 Supabase Auth 세션으로 별도 인증.
14.4 코드 공개
확장 소스 전체는 GitHub에 공개되어 있으며 (youtube-watchlater-url-extractor), Chrome Web Store 검토 외에도 누구나 코드 검증 가능합니다.
15규정 준수 · Compliance
TubeFilter는 다음 규정을 준수합니다:
- 대한민국 개인정보 보호법 (PIPA)
- EU 일반 데이터 보호 규정 (GDPR)
- 캘리포니아 CCPA / CPRA (해당 사용자에 한함)
국제 데이터 이전이 발생할 경우 (예: 미국 소재 Vercel/Gemini), 표준 계약 조항 (SCC) 을 적용한 처리자와만 협력합니다.
16변경 이력 · Changes
이 정책의 중요 변경 사항은 최소 30일 전 이메일로 공지하며, 사소한 표현 수정은 본 페이지에 즉시 반영됩니다. 이전 버전은 GitHub 변경 이력 에서 확인 가능합니다.
연락처: yangyeongjin458@gmail.com
관련 문서: 개인정보 처리방침 · 이용약관 · 환불 정책