KR Kakao 인증 이벤트 스토밍
1. 명령 → 도메인 이벤트 흐름
| 단계 | 명령/이벤트 | 설명 | 주체 |
|---|---|---|---|
| 1 | InitiateKakaoAuthCommand | 사용자가 Kakao 로그인을 선택하면 실행된다. | AuthController |
| 2 | KakaoAuthSessionCreatedEvent | KakaoAuthSession Aggregate가 state/nonce를 생성하고 Redis에 저장 완료. | InitiateKakaoAuthService |
| 3 | CompleteKakaoAuthCommand | Kakao 콜백 URL에서 authorization code와 state를 전달한다. | AuthCallbackController |
| 4 | KakaoAuthCompletedEvent | 토큰 교환 성공, 사용자 연결 및 JWT 발급 완료. | CompleteKakaoAuthService |
| 5 | ExternalAuthLinkedEvent | 신규/기존 사용자 계정에 Kakao ID 연결. | LinkKakaoIdentityPolicy |
| 6 | ExternalAuthLinkedIntegrationEvent | Notification/Analytics 등 외부 도메인으로 전달. | AuthEventPublisher |
| 7 | KakaoRefreshTokenRotatedEvent | 만료 임박 시 토큰 갱신 성공. | KakaoTokenRotationService |
| 8 | KakaoAuthSessionExpiredEvent | TTL을 넘긴 state/nonce를 정리. | 만료 워커 |
2. 실패 시나리오 브랜치
CompleteKakaoAuthCommand실행 도중 Kakao API 5xx →KakaoProviderUnavailableEvent발행, Circuit Breaker trip, 사용자에게 재시도 안내.state불일치 →KakaoStateMismatchError발생, 이벤트 발행 없음, 감사 로그 기록.- idempotency 키 충돌(재처리) →
KakaoAuthDuplicateCallbackEvent기록 후 흐름 종료.
3. 사용자 여정 (Given/When/Then)
-
Given 사용자가 로그인 화면에서 Kakao 로그인을 선택했고, state가 Redis에 저장되어 있다.
When Kakao에서 authorization code와 일치하는 state를 콜백으로 전달한다.
ThenKakaoAuthCompletedEvent가 발행되고, JWT 액세스/리프레시 토큰이 TimeMachine 기반 만료 시간과 함께 발급된다. -
Given 사용자가 이미 Kakao 계정과 연결되어 있다.
When 동일한 Kakao ID로 다른 계정에 연결을 시도하면
ThenKakaoIdentityAlreadyLinkedError가 반환되고, 기존 연결을 해제하기 전까지 재시도가 차단된다.
4. 읽기 모델 및 프로젝션
KakaoAuthReadModel: 현재 인가 요청 상태, TTL, redirect URI 등을 담아 UI에서 폴백 안내를 보여준다.ExternalAuthLinkProjection: 사용자별 연결된 외부 공급자 목록. 사용자 설정 화면에서 사용.KakaoTokenLedger: 토큰 갱신/만료 이력을 저장해 감사 및 장애 분석에 활용.