Cloudflare가 OAuth 인프라를 Hydra 1.X에서 2.X로 업그레이드하면서 자체 관리 OAuth를 전체 개발자에게 개방한 과정을 다룬다. 스키마 변경으로 인한 인덱스 락 문제, 블루-그린 배포 전략, 전환 중 revocation 큐 설계, 전환 후 리프레시 토큰 버그까지 실제 운영 사고와 해결을 상세히 기록했다.
핵심 포인트- 1.X 업그레이드 시 Hydra DB 인덱스 생성이 critical 테이블에 exclusive lock 유발 — CREATE INDEX CONCURRENTLY 재작성과 SELECT * 제거 커스텀 빌드로 해결.
- 2.X는 스키마 변경이 방대해 in-place 불가 — 블루-그린 전략으로 약 3시간 만에 무중단 전환 완료.
- 마이그레이션 창 동안 Cloudflare Queues로 revocation 이벤트를 큐잉 후 그린 전환 후 재생, 데이터 유실 없이 무효화 처리.
- 1.X 전환 후 리프레시 토큰 strict 재사용 무효화 버그 → Worker 레이어 coalescing 임시 해결, 2.X에서 native grace period로 영구 해결.
- 전환 후 Hydra P95 185ms→101ms(-45%), 메모리 888MB→763MB(-14%), CPU 1.07→0.67코어(-37%) 개선.
상세 정리- 배경: OAuth 파트너 연동이 Wrangler/PlanetScale 등 소수에 한정 — API 토큰 방식은 위임 흐름에 부적합해 전체 개방이 목표였다.
- 보안 강화 선행: OAuth 동의 화면 개선, 대시보드 revocation 기능 추가, 앱 소유권 가시성 향상(피싱 방지)을 먼저 배포했다.
- 1.X 첫 장벽: Hydra DB 마이그레이션이 critical 테이블에 exclusive lock 유발 → CREATE INDEX CONCURRENTLY로 SQL 재작성 + SELECT * 대신 명시적 컬럼 선택 커스텀 Hydra 빌드.
- 2.X 전략 선택: 스키마 변경이 방대해 in-place 불가 → 블루-그린 배포 채택, 기존(blue)을 살린 채 그린으로 트래픽 전환.
- 토큰 만료 연장: 전환 전 발급된 토큰이 마이그레이션 창 내내 유효하도록 만료를 수 시간으로 연장해 즉각적인 재발급 없이 서비스 유지.
- Revocation 큐 설계: 전환 창 중 revocation 이벤트를 Cloudflare Queues에 수집 → 그린 DB 전환 후 재생, 무효화 이벤트 유실 차단.
- 2.X 실행 순서: 생산 DB를 그린 타겟에 복사 → 제약 위반 데이터 정리 → Hydra + 내부 2개 시스템 동시 전환, 총 약 3시간 소요.
- 1.X 전환 후 버그: 리프레시 토큰 에러 급증 — 신버전의 strict 재사용 무효화 정책이 원인으로 Wrangler/MCP 클라이언트처럼 요청이 많은 클라이언트가 피해를 입었다. Worker 레이어에서 refresh token 요청을 짧게 캐시하는 coalescing 로직으로 임시 처리.
- 2.X 전환 후 403 급증: authorization 서비스 정리 잡이 Hydra 마이그레이션으로 변형된 세션을 과잉 삭제 → 시스템 간 OAuth 정책 데이터 불일치 발생 → 데이터 복원 + 정적 정책 의존도 감소로 수습.
- DB 규모: 1억3250만 행 업데이트, 1억1470만 행 삽입, temp 136.97GB, 트랜잭션 커밋 22,200회.
- 성능 개선 결과: P95 185ms→101ms(-45%), RSS 메모리 888MB→763MB(-14%), Go 힙 449MB→271MB(-40%), Goroutine 4015→3076(-23%), CPU 1.07→0.67코어(-37%).
왜 읽나OAuth 서버 대규모 버전 업그레이드나 PostgreSQL 무중단 인덱스 마이그레이션을 고민하는 백엔드/인프라 엔지니어에게 블루-그린 전환 + revocation 큐 + 토큰 coalescing까지 실전 레퍼런스.