sequenceDiagram participant F as 프론트 participant B as 앱 브리지 participant N as 네이티브 participant S as 소셜 Provider participant ND as Node 서버 participant BE as 백엔드 F->>B: 소셜 로그인 요청 (provider) B->>N: 소셜 로그인 요청 N->>S: SDK 로그인 S-->>N: accessToken N->>ND: accessToken, provider 전달 ND->>BE: POST /v2/oauth2/verify-token {provider, accessToken} BE->>S: 사용자 정보 조회 (accessToken) S-->>BE: socialId, CI BE->>BE: SocialLoginResult 저장 (uuid 발급) Note over BE: nextAction 결정 (CI + socialId 기반)
회원 없음 → SIGN_UP
회원 있음 + 소셜 계정 없음 → LINK_SOCIAL_ACCOUNT
회원 있음 + socialId 일치 → SIGN_IN
회원 있음 + socialId 불일치 → ALREADY_LINKED_SOCIAL_ACCOUNT BE-->>ND: {uuid, nextAction} ND-->>F: {uuid, nextAction} alt nextAction = SIGN_IN F->>ND: 로그인 요청 (uuid) ND->>BE: POST /v2/oauth2/sign-in {uuid} BE-->>ND: accessToken, refreshToken Note over ND: 토큰 저장 및 세션 생성 ND-->>F: 세션 정보 (header: accessToken) else nextAction = SIGN_UP F->>F: 회원가입 플로우 진행 else nextAction = LINK_SOCIAL_ACCOUNT F->>BE: POST /v2/oauth2/link-social-account {uuid} BE-->>F: provider, linkedDtm end