보안 & 폴백 정책

택클은 분배만 합니다. 분배가 실패해도 호스트 앱은 절대 깨지지 않습니다. 이 페이지는 택클이 지금 코드 레벨에서 어떤 보안·폴백 처리를 보장하는지 약속 형태로 정리한 문서입니다. 새로운 기능을 권하는 글이 아니라, 이미 구현되어 운영 중인 동작을 옮긴 것입니다.

1. API 키 처리

2. 요청 인증 & 호출 한도

모든 SDK 요청은 아래 단계를 순서대로 거칩니다:

  1. 봇 차단 (선택) — 봇으로 의심되는 트래픽을 키 검증 이전에 차단합니다. 처음 24시간은 차단 없이 기록만 하다가 검수 후 차단 모드로 전환.
  2. 키 검증 — 헤더의 API 키를 해시해서 DB와 비교. 잘못된 키, 만료·회수·일시정지된 키는 즉시 인증 실패 응답.
  3. 도메인 확인 — 키에 허용 도메인 목록이 있으면 그 안에 있는 도메인에서만 동작. 없으면 권한 없음 응답.
  4. 호출 한도 확인 — 키별 일일 한도 + 키와 IP 조합별 최근 1분간 호출 한도를 확인합니다. 우리 캐시에 일시 장애가 있어도 가용성을 위해 한도 검사는 건너뛰고 통과시킵니다.

한도를 넘으면 호출 한도 초과 응답과 다시 호출 가능한 시각이 응답 헤더에 적힙니다. 이때 SDK는 마지막에 받은 플래그 값으로 계속 동작해서 호스트 앱은 영향이 없어요.

엔드포인트키+IP당 한도초과 시
GET /api/sdk/version (v0.2+)200 req60 s429 + 2s 엣지 캐시로 흡수
GET /api/sdk/definitions (v0.2+)200 req60 s429 + 30s 엣지 캐시로 흡수
POST /api/sdk/evaluate (legacy)200 req60 s429 + Retry-After
POST /api/sdk/identify60 req60 s429 + Retry-After
POST /api/sdk/exposure600 req60 s429 + Retry-After (드물게 — 클라이언트 배치 송신)

위 분당 한도와 별도로 키별 일일 한도가 우선 검사됩니다 (v0.2+). 일일 한도 초과 시 429 + X-RateLimit-Limit/Remaining/Reset 헤더가 응답에 포함됩니다.

어드민 변경 엔드포인트는 별도로 Same-Origin 가드(Origin/Referer 검사)와 Auth.js의 SameSite=Lax 쿠키로 CSRF를 막습니다. 오픈 리다이렉트는 safeRedirect()/로 시작하지 않거나 //로 시작하는 모든 타깃을 차단합니다.

3. 입력 검증

4. 호스트 앱 안전 — "절대 안 깨진다"의 의미

SDK 내부에서 어떤 예외가 나든, 어떤 입력이 깨져 있든, 호스트 앱 코드 경로로는 던지지 않습니다. 아래 표는 모든 실패 경로와 SDK의 응답을 1:1로 정리한 것입니다.

상황SDK 동작호스트 앱 영향
isEnabled() 내부 예외try/catch → caller fallback(기본 false)없음
getVariantWithReason() 내부 예외{ variant: fallback, reason: 'fallback' }없음
API 5xx / 네트워크 단절마지막 캐시 유지(디스크/localStorage)없음
malformed 쿠키(깨진 %XX)decodeURIComponent throw 흡수 → raw 값 반환없음
응답 shape 깨짐(variants가 문자열 등)refresh(){}으로 정규화, 직전 스냅샷 보존없음
빈 snapshot / 누락 키fallback 반환없음
빈 variants / 가중치 합 0fallback 반환없음
exposure 기록 실패(401/500/네트워크).catch(() => {}) — best-effort, drop없음
Rate limit(429)현재 스냅샷 그대로 사용, 다음 폴링까지 대기없음

이 표의 모든 행은 packages/sdk-core/src/fallback-safety.test.ts에서 회귀 테스트로 잠겨 있습니다. SDK 릴리스마다 자동으로 검증됩니다.

5. 다운타임 동작

6. 브라우저 환경 안전 (SSR / Edge)

SDK는 모든 전역 객체 접근에 typeof 가드를 둡니다.

7. 테스트 환경에서의 안전

8. 시크릿 취급

9. 데이터 취급 & 보존 정책

10. 취약점 제보

보안 이슈는 #cell-platform 채널로 비공개 제보 부탁드립니다. 공개 GitHub 이슈로 올리지 말아주세요. 보고 후 24시간 내 1차 회신을 목표로 합니다.

참고