보안 및 운영 한도
왜 이 절이 따로 있는가
이 제품은 AI를 끄면 남는 게 없습니다. NPC 판단 자체가 LLM이라 LLM 비용 상한이 곧 가용성 한계입니다. 공개 오픈에서 가장 먼저 터지는 건 서버가 아니라 LLM 비용이며, 로그인 없는 익명 진입은 봇·크롤러·반복 접속에 그대로 노출됩니다. 그래서 비용 방어선을 공개 전에 걸어두는 것이 요구사항입니다. 상한 도달 시 게임이 멈추므로, 상한을 얼마로 잡을지가 곧 서비스 판단입니다.
인증 — 09-16 전환
09-03 설계는 인증 없음(익명 세션 키)이었습니다. 외부 API(Core Sonnet 5 · NPC Haiku 4.5)로 전환하면서 판당 $0.68~0.97의 변동비가 생겼고, 사용량을 사용자 기준으로 세기 위해 익명 진입을 폐기했습니다.
- 구글 로그인 필수. 판을 만들고 말하고 답을 내는 쓰기 요청은 전부 로그인이 필요합니다. 결과 조회 같은 읽기 요청은 로그인 없이 열립니다
- 판을 만든 사용자 기준으로 사용량을 셉니다. 하루 판 수 제한과 전역 정원이 이 기준으로 걸립니다
- 세션은 구글 OAuth +
rd_session쿠키. 회원가입 화면·프로필·토큰 갱신 UI는 여전히 없습니다
사용 한도 — 코드로 거는 방어선
| 층 | 무엇 | HTTP |
|---|---|---|
| 사용자당 | 하루 판 수 제한 (사용자당 하루 5판) | 403 daily_attempt_limit |
| 전역 | 하루 정원 | 503 daily_cap |
| 입력 | 발화·질문 길이 상한 (200자) | 413 / 422 |
| 빈도 | 요청이 너무 잦음 — Retry-After 헤더로 대기 시간 안내 | 429 |
| 계정 | Anthropic 콘솔 지출 한도 — 운영 투입 때 확인 | — |
| HTTP | 화면 |
|---|---|
| 401 | 로그인 안내 |
| 403 | 「오늘은 여기까지」 |
| 429 | 잠시 후 재시도 |
| 503 | 「오늘 정원이 마감됐다」 |
| 413 / 422 | 입력 오류 |
전역 정원은 곧 하루 최대 비용의 상한입니다. 세부 한도와 배포 설정은 공개 문서에 적지 않고 운영 환경에서 관리합니다. 비용 산정 근거는 인프라 및 배포 — LLM 비용에 있습니다.
지출 한도
| 항목 | 값 |
|---|---|
| 판당 변동비 | $0.68~0.97 (사람이 5회차까지 플레이한 판 기준) |
| 1명당 예상 | $0.3~0.5 (평균 1~2회차까지 진행) |
| 계정 한도 | Anthropic 콘솔 지출 한도. 환경변수가 아니라 콘솔 설정 + 판 수 허들로 대체 |
| 알림 | LLM 비용·토큰이 상한의 80% 도달 시 |
상한 80% 도달 시 대응 순서 — ① 세션/IP당 루프 제한 ② 캐싱 ③ 컨텍스트 축소 ④ Agent 역할만 저가 모델로 하향 ⑤ 최후에는 대기열.
시크릿
| 키 | 저장 위치 |
|---|---|
DATABASE_URL | GitHub Secrets + 서버 .env + Vercel 환경변수 |
ANTHROPIC_API_KEY | 서버 .env만. 운영 투입(09-20) 전까지는 빼 둔다 — 과금 방지 |
| 지출 한도 | 환경변수가 아니라 Anthropic 콘솔 지출 한도 + 판 수 허들로 대체 |
SESSION_SIGNING_KEY | 동일 |
레포에는 .env.example만 올립니다. Day 11(9/13)에 시크릿 스캔.
데이터 — 판정 기록은 수정하거나 지우지 않는다
로그 성격 테이블은 updated_at·deleted_at을 두지 않습니다. 판정 로그가 산출물이기 때문에 “판정 로그 유실”은 P0 버그입니다. 세션은 익명 식별자 대신 로그인 사용자에 묶이지만, 의심도·신뢰도 같은 NPC 내부 상태는 유저 화면에 노출되지 않고 인스펙터에서만 열립니다.
릴리스 체크리스트 — 보안·운영 항목
- 시크릿 스캔 0건
- 세션/IP당 루프 제한 + 일일 비용 상한 동작
- 비용 상한 도달 → 정해진 안내
- LLM 타임아웃 → 재시도 후 안내
- 네트워크 끊김 → 안내, 진행 상태 보존
- 프로덕션 마이그레이션 1회 성공,
downgrade→upgrade왕복 검증 - 롤백 리허설 성공
- 온콜 시간대·알림 경로 확정
결정 로그
| 날짜 | 결정 | 이유 |
|---|---|---|
| 2026-09-03 | LLM 비용 상한을 공개 전 필수 항목으로 | 익명 진입 = 봇 노출. 비용이 가용성 한계 |
| 2026-09-15~16 | 구글 로그인 도입, 익명 진입 폐기 | 판을 만든 사용자(attempts.user_id)가 하루 판 수·전역 정원 집계의 기준 |
| 2026-09-16 | 과잉 사용 방지 허들 — 사용자당 하루 판 수 · 전역 정원 · 요청 빈도 · 입력 길이 | 판당 API 비용의 상한을 코드로 건다. Anthropic 콘솔 지출 한도와 함께 방어선 |
| 2026-09-17 | 운영 보안·외부 키 한도 항목은 비공개 운영 문서에서 관리 | 공개 문서에 세부 한도를 적지 않는다 |