Skip to content

[FIX] prod/dev Redis 공유 격리 — 키 네임스페이스 prefix 도입 #529

Description

@minij02

✨ 배경

Upstash 프리티어는 계정당 DB 1개 제한. 현재 .env (prod) 와 .env.dev 가 동일 Upstash DB 를 공유하고 있어 두 환경의 Redis 데이터가 뒤섞임.

✨ 문제

같은 DB 를 공유하는 이상 격리 없이는 다음 문제가 상시 존재:

  • 방문자 통계 오염visitors:hll:YYYY-MM-DD 키가 prod/dev 공용. GET /api/admin/stats/visitors 응답이 두 환경 트래픽 합산으로 나옴.
  • 정산 락 충돌CYCLE_LOCK_KEY (settlement-payout), SYNC_LOCK_KEY (settlement-sync) 를 두 환경 cron 이 서로 뺏음. 한쪽이 락 잡으면 다른쪽 cron 이 스킵.
  • Payple 인증 캐시 오염payple-billing/payple-refund/payple-settlementAUTH_CACHE_KEY 가 공유. prod 데모/실서비스 토큰이 dev 요청에 반환될 위험.
  • register-token 블랙리스트 공유 — 결제 리다이렉트 토큰 blacklist 가 섞임.
  • 그 외 user-activity throttle, payple 카운터 등도 공용.

✨ 해결 방향

process.env.NODE_ENV 기반으로 모든 Redis 키에 자동 prefix (prod: / dev:) 를 붙임. Upstash DB 는 그대로 하나, 논리적으로만 완전 격리.

// src/utils/redis-key.ts (신규)
const REDIS_KEY_NS = process.env.NODE_ENV === 'production' ? 'prod:' : 'dev:';
export const k = (key: string): string => `${REDIS_KEY_NS}${key}`;

각 caller 에서 키 생성 지점 (상수 정의 or 인라인 구성) 을 k(...) 로 감쌈. redisClient.* 호출 자체는 변경 없음.

✨ 개발 목록

  • src/utils/redis-key.ts 헬퍼 추가
  • src/utils/visitor-tracking.tsbuildHllKey 결과에 prefix
  • src/utils/user-activity.ts — throttle 키에 prefix
  • src/settlements/utils/register-token.ts — blacklist 키에 prefix
  • src/settlements/utils/payple.ts — 카운터/락 키에 prefix
  • src/settlements/utils/payple-billing.ts — auth cache 키에 prefix
  • src/settlements/utils/payple-refund.ts — auth cache 키에 prefix
  • src/settlements/utils/payple-settlement.ts — auth cache 키에 prefix
  • src/settlements/services/settlement-payout.service.tsCYCLE_LOCK_KEY 에 prefix
  • src/settlements/services/settlement-sync.service.tsSYNC_LOCK_KEY / lastKey 키에 prefix
  • grep 으로 남은 raw 키 없는지 최종 확인
  • pnpm build 통과

✨ 기타

  • Redis 안의 기존 (prefix 없는) 키들은 만료 (HLL 400d, 캐시 짧게) 되면 자연 소멸. 즉시 정리하려면 SCAN + DEL 필요하지만 오염 위험 크지 않아 방치 가능.
  • 이 PR 배포 즉시 방문자 카운트는 새 prefix 로 시작 → dev/prod 각자 카운트 별도 누적. 기존 공용 키의 카운트는 참조 불가.
  • 향후 유료 이전 / 계정 분리로 DB 를 실제로 나눠도 prefix 는 그대로 남겨두면 무해. 롤백 리스크 낮음.

Metadata

Metadata

Assignees

No one assigned

    Labels

    fixfixing codes

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions