Skip to content

feat: 게스트 인증 전환 + 소셜 로그인 제거 - #365

Merged
YuGeonHui merged 2 commits into
env/devfrom
feat/v2-guest-auth
Sep 24, 2026
Merged

YuGeonHui merged 2 commits into
env/devfrom
feat/v2-guest-auth

Conversation

@YuGeonHui

@YuGeonHui YuGeonHui commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

무엇을 고치나

앱 시작 시 스플래시에서 멈추고 타임아웃되던 문제를 해결합니다. 원인은 두 겹이었습니다.

겉: 앱이 바라보던 호스트가 둘 다 죽어 있었습니다.

호스트 상태
atcha.online (LIVE) DNS 등록 자체가 사라짐 (NXDOMAIN)
atcha.p-e.kr (DEV·STAGE) DNS는 남았으나 443·80 TCP 연결 불가

속 (진짜 원인): 서버가 소셜 로그인 → 게스트 계정 기반으로 옮겨갔고, 모든 경로에 /api 접두어가 붙었습니다. 앱이 호출하던 엔드포인트는 하나도 존재하지 않는 상태였습니다.

주요 변경

1. 부트스트랩을 게스트 인증으로

토큰이 없으면 POST /auth/guest {deviceId, fcmToken?}로 JWT를 받아 곧장 홈으로 갑니다. 로그인 화면 단계가 사라졌습니다.

토큰 만료도 로그인 화면으로 튕기지 않습니다 — reissue 실패 시 같은 deviceId로 /auth/guest를 다시 불러 같은 계정이 조용히 돌아옵니다 (서버 계약).

2. deviceId는 IDFV를 키체인에 고정

IDFV는 같은 개발사 앱을 전부 삭제 후 재설치하면 값이 바뀝니다. 게스트 모델에서 deviceId는 계정의 유일한 신원이라, 그대로 쓰면 재설치 시 기존 계정의 알림 설정·검색 이력에 영구히 접근 불가가 됩니다.

→ 최초 1회 읽은 값을 키체인에 고정합니다(앱 삭제 후에도 잔존). 기존 KeychainStore/TokenStore 패턴 재사용.

3. /api 접두어는 base URL에서만

URLSessionNetworkClient가 baseURL.appendingPathComponent(path)로 조립하므로, base URL에 /api를 두면 기존 15개 Endpoint의 path를 한 줄도 고치지 않고 새 체계에 맞습니다. 서버가 접두어를 또 바꾸면 AppEnvironment 한 줄만 고치면 됩니다.

4. 네트워크 진단 (재발 방지)

원인 추적에 시간이 걸린 이유는 앱이 아무것도 말해주지 않았기 때문입니다:

  • Core/Network·Core/Auth·Data 전체에 로깅 0건
  • URLError가 전부 .transport로 뭉개져 타임아웃(-1001)·연결 불가(-1004)·TLS 실패(-1200) 구분 불가

→ NetworkError가 URLError 코드를 노출하고, DEBUG에서 com.atcha.network에 메서드·URL·상태코드·소요시간을 남깁니다. Authorization과 본문은 토큰이 실리므로 로깅하지 않습니다.

부트스트랩이 비동기가 되면서, 기존에 호출처가 없던 데드코드였던 BootstrapFailureMessage와 SplashViewController.showRetry가 비로소 제 역할을 합니다.

소셜 로그인은 보존했습니다

AuthFeature·SignInUseCase·SocialLoginAdapter·AppCoordinator.showLogin()은 호출처만 끊고 남겨뒀습니다(@available(deprecated) 표시). 계정 승격이 도입되면 그대로 진입점이 됩니다.

리뷰 포인트: 승격 계획이 없다면 별도 PR로 제거하는 편이 깔끔합니다. 되돌리기 어려운 변경이라 이번엔 손대지 않았습니다.

검증

항목 결과
Debug · Stage · Release 빌드 ✅ 3구성 모두
Domain / AtchaData / AtchaV2 테스트 ✅ 100 / 58 / 20
실제 앱 동작 ✅ 초기화한 시뮬레이터 첫 실행에서 POST /api/auth/guest → 200, 홈 진입

실제 실행 로그:

GET  https://atcha.kro.kr/api/app/version  → 200 (101ms)
POST https://atcha.kro.kr/api/auth/guest   → 200 (170ms)

서버 계약 확인 (curl 직접):

  • 같은 deviceId 두 번 호출 → 둘 다 동일 id (같은 계정 복귀)
  • 다른 deviceId → 별도 계정
  • 응답 봉투 {responseCode, result:{id, accessToken, refreshToken}} → 기존 LoginResponseDTO 그대로 디코딩

별도 커밋: tuist 4.209.0

mise.toml은 4.202.0을 고정하고 있었으나 /usr/local/bin/tuist(3.33.3)가 PATH에서 앞서, tuist generate가 매니페스트 컴파일 단계에서 실패하던 상태였습니다. 우회법을 CLAUDE.md에 기록했습니다.

이 PR 범위 밖

  • SSE 막차 조회 (GET /api/routes/v3/guest/last-routes/stream) — 현재 네트워크 레이어가 단발 요청 전용이라 스트리밍 지원 추가가 필요. 서버 문서 두 곳의 경로가 갈려 백엔드 확인 필요.
  • 서버 최근 검색 (/api/locations/histories) — 현재 UserDefaults 로컬.
  • FCM 갱신 (PUT /api/members/me) — 현재 no-op인 UnconfirmedPushTokenRepository 한 곳만 교체하면 됩니다.
  • 도착 시간 (/bus-arrival, /subway-arrival) — 신규 기능.

🤖 Generated with Claude Code


추가: 소셜 로그인 전면 제거 (커밋 d9bb9ec)

게스트 계정 전환으로 로그인 화면 단계 자체가 사라져, 호출처가 없어진 소셜 경로를 전부 걷어냈습니다.

제거: Projects/Feature/Auth 모듈 전체(4타겟) · SignInUseCase/SocialLoginService/SocialCredential/SignUpForm · AuthEndpoint(/auth/check·/auth/login·/auth/sign-up) · SocialLoginAdapter/KakaoConfig/showLogin() · 카카오 SDK 링크 · Apple Sign In entitlement · 카카오 URL 스킴·TUIST_KAKAO_APP_KEY

유지: Core/Auth(세션·토큰 관리는 게스트가 그대로 사용) · LoginSession/LoginResponseDTO(응답 계약 동일) · Tuist/Package.swift의 kakao 패키지 선언 — 레거시 앱이 KakaoSDK umbrella를 직접 참조하므로(Projects/Legacy/Project.swift:94) V2 타겟에서만 링크를 뺐습니다

검증: 11개 모듈 391 테스트 통과 (Domain 92 / AtchaData 53 / AtchaV2 20 / Home 66 / Search 26 / Settings 12 / DesignSystem 65 / CoreAuth 34 / CoreAlarm 11 / CoreNetwork 8 / CoreStorage 5)

리뷰 노트: 제거 과정에서 테스트 스텁 2곳을 놓쳐 한 번 실패했습니다(3c676dd로 수정). xcodebuild build가 테스트 타겟을 컴파일하지 않아 3구성 빌드 성공에 가려졌던 건이라, 이후로는 제거 작업 시 테스트까지 함께 확인했습니다.

YuGeonHui and others added 2 commits September 24, 2026 18:29
게스트 계정 전환으로 로그인 화면 단계 자체가 사라졌으므로, 더 이상 호출되지
않는 소셜 로그인(카카오·애플) 경로를 전부 걷어낸다.

## 제거

- `Projects/Feature/Auth` 모듈 전체(4타겟: Feature/Interface/Tests/Example)
- `SignInUseCase`, `SocialLoginService`, `SocialCredential`, `SignUpForm`
- `AuthEndpoint`(/auth/check·/auth/login·/auth/sign-up), `SignUpRequestDTO`,
  `AuthCheckResponseDTO`
- `SocialLoginAdapter`, `KakaoConfig`, `AppCoordinator.showLogin()`
- 카카오 SDK 링크(KakaoSDKCommon/Auth/User), Apple Sign In entitlement,
  카카오 URL 스킴·LSApplicationQueriesSchemes·KAKAO_APP_KEY 주입,
  SceneDelegate의 카카오 복귀 URL 핸들링, AppDelegate의 KakaoSDK.initSDK

## 유지

- `Projects/Core/Auth` — 세션·토큰 관리(single-flight reissue, 401 복구)는
  게스트 인증이 그대로 쓴다.
- `LoginSession`·`LoginResponseDTO` — 게스트 응답 계약이 동일하다.
- `Tuist/Package.swift`의 kakao-ios-sdk 선언 — **레거시 앱이 KakaoSDK umbrella를
  직접 참조한다**(`Projects/Legacy/Project.swift:94`). V2 타겟에서만 링크를 뺀다.

## 검증

- Debug·Stage·Release 3구성 빌드 성공
- `tuist generate` 성공 — AuthFeature가 그래프에서 빠지고 AtchaLegacy는 유지

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
앞선 커밋에서 프로덕션 코드는 정리했으나 테스트 타겟에 삭제된 타입 참조가
남아 있었다. `xcodebuild build`는 테스트 타겟을 컴파일하지 않으므로 3구성
빌드 성공에 가려져 있었다.

- `DefaultSignInAsGuestUseCaseTests`의 `StubGuestAuthRepository`에서
  `AuthRepository`가 더 이상 요구하지 않는 소셜 메서드 3개 제거
- `AuthResponseDTOTests.checkResponse_decodesExists` 제거
  (`/auth/check` 엔드포인트와 `AuthCheckResponseDTO`가 함께 사라졌다)

검증: 11개 모듈 391 테스트 전부 통과
(Domain 92 / AtchaData 52 / AtchaV2 20 / Home 66 / Search 26 / Settings 12 /
 DesignSystem 65 / CoreAuth 34 / CoreAlarm 11 / CoreNetwork 8 / CoreStorage 5)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@YuGeonHui
YuGeonHui merged commit df141ea into env/dev Sep 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant