ADR-008 API Key 라이프사이클 = 해시 저장 + id 기반 조회 + 즉시 무효화
- 상태: 채택
- 날짜: 2026-07-03
- 근거: PRD FR-3/FR-6/FR-9 / TDD “인터페이스 시그니처”·“상태 전이 표” / AS-IS
McpTokenAuthenticationFilter
맥락
Partner API Key의 저장·조회·발급·재발급·폐기·상태 검증 방식을 확정한다. 기존 mcp 토큰 인증 필터가 검증된 패턴을 제공한다.
결정
- 형식:
partner_<keyId>_<random>(256-bit URL-safe random).mcp_<id>_<random>패턴 답습. - 저장: 해시만 저장(
PasswordEncoder=BCrypt 재사용). 평문은 발급 시 1회 응답으로만 노출, 재조회 불가. - 조회: 요청 키에서
keyId를 파싱 →findById(keyId)→matches(plain, keyHash). 전수 스캔 없음. - 재발급: 구 ACTIVE 키 즉시
REVOKED+ 신규 ACTIVE 발급(UseCase@Transactional). FR-6. - 폐기: ACTIVE → REVOKED. REVOKED 키 인증 시도는 401.
- 상태 코드: 무효/불일치/REVOKED 키 → 401. 키는 유효하나 파트너 SUSPENDED → 403(신원 확인됨, 접근 거부). FR-9.
- 즉시 반영: 필터가 요청마다 DB status 확인(캐시 없음) → 폐기 후 즉시 차단(<1분 NFR 충족).
근거
- 해시 저장·평문 1회 노출·prefix 식별은 Stripe/GitHub API Key 관행(TDD 벤치마킹).
- id 파싱 후 PK 조회는 O(1) — 전수 BCrypt 매칭 회피.
- 캐시 미도입은 폐기 즉시성(FR “1분 이내”)을 단순하게 보장. 1000건/일 규모에 DB 확인 비용 무시 가능.
대안 (미채택)
- 평문 저장: 유출 시 즉시 악용 — 금지.
- 전 키 스캔 매칭: BCrypt 비용 O(n) — 미채택.
- 만료 유예(grace) 롤: 지금 규모 불필요 — 즉시 무효화만.
- SUSPENDED도 401: 신원이 확인된 상태이므로 403이 의미상 정확.
영향
ApiKeyGeneratorgateway(random/hash/matches) +PartnerApiKeyRich Entity(revoke/recordUsage/isActive).- 재발급 API 재호출은 비멱등(매번 신규 키) — 의도적. 롤백: 재발급 실패 시 트랜잭션 롤백으로 구 키 ACTIVE 유지.