1. 초기 로그인 요청
- 사용자가 카카오 로그인 버튼 클릭
/auth/oauth/kakao/login?state={디바이스 타입} 엔드포인트 호출 (디바이스 타입을 state 파라미터로 전달)
- OAuthController.redirectToOAuthLoginPage() 에서 카카오 로그인 페이지로 리다이렉션
- 카카오 인증 페이지에서 사용자가 로그인 및 권한 승인
2. 카카오 인증 콜백 처리
- 카카오가 승인 코드(code)를 포함하여
/auth/oauth/{provider}/callback 엔드포인트로 콜백
- OAuthController.handleOAuthCallback() 메서드 실행
- OAuthLoginService.handleOAuthCallback() 호출하여 로그인 처리 시작
3. OAuth 사용자 정보 조회
- OAuthLoginService.processOAuthLogin() 메서드에서 로그인 처리
- 적절한 OAuth 서비스 구현체(KakaoOAuthService) 선택
- KakaoOAuthService.getUserInfo() 메서드로 인증 코드를 통해 사용자 정보 요청:
- 카카오 토큰 API 호출하여 액세스 토큰 획득
- 획득한 토큰으로 카카오 사용자 정보 API 호출
- OAuthUserInfo 객체로 응답 파싱 (소셜 ID, 이메일, 이름, 토큰 정보 등)
4. 사용자 매핑 확인
- OAuthRepository.findBySocialUserIdAndProvider() 호출하여 기존 매핑 확인
- 매핑 결과에 따라 분기:
4-1. 기존 매핑이 있는 경우
- 기존 매핑에 새로운 OAuth 토큰으로 업데이트
- 매핑의 userId와 temporary 상태 확인:
- userId가 존재하고 temporary가 false인 경우: 이미 가입된 회원으로 처리
- JWT 토큰 발급 후 OAuthLoginResponse.toJwt() 반환
- 그 외 경우: 회원가입 필요 상태로 처리
- OAuthLoginResponse.toSignUp() 반환 (매핑 ID 포함)
4-2. 기존 매핑이 없는 경우