17. 구현 - JWT

2025. 5. 8. 16:45현 프로젝트 시작단계

728x90

앞서 설명 다했다시피

 

 

모델 

class LoginResult {
  final String? jwt;
  final String? userId;
  final String? springResponse;
  final String? errorMessage;

  LoginResult({this.jwt, this.userId, this.springResponse, this.errorMessage});
}

 

 

전체 로그인 흐름 요약

1. View (LoginPage)

  • 사용자가 이메일, 비밀번호를 입력하고 로그인 버튼을 누름.
  • 로그인 버튼 클릭 시 → AuthViewModel.signIn() 호출됨.
  • 자동 로그인 체크, 에러 메시지, JWT, Spring 응답 등을 UI에 표시함.

2. ViewModel (AuthViewModel)

  • 사용자 입력을 받아 AuthService.signIn() 호출.
  • 응답 결과(LoginResult)에서 jwt, userId가 있으면:
    • 상태 변수에 저장
    • SessionManager().saveSession(jwt, userId)로 세션 저장
  • 실패하면 errorMessage에 메시지 설정
  • notifyListeners()로 UI 갱신

3. Service (AuthService)

  • Supabase SDK 사용해 이메일/비밀번호로 로그인 요청
    • 실패 시 에러 메시지 반환
  • 로그인 성공하면 Supabase에서 JWT + 유저 ID 추출
  • JWT를 Spring 서버로 전송 (_sendJwtToSpring)
    • Authorization 헤더에 Bearer 토큰으로 포함
    • Spring에서 응답을 받으면 반환

4. Spring 서버 (백엔드)

  • /api/user/profile API는 JWT가 유효한지 검증 후 사용자 정보를 반환
    • 유효하지 않으면 에러 반환
    • 유효하면 사용자 정보 JSON 반환 (예: 이름, 이메일 등)

5. 결과 처리

  • ViewModel에서 받은 JWT, 응답 등을 바탕으로
    • 화면에 JWT 일부 표시
    • Spring 응답을 문자열로 출력 (예: 사용자 이름, 상태 등)
    • 오류가 있을 경우 에러 메시지 표시

 

 

 

흐름도 

[사용자] → [LoginPage] → [AuthViewModel.signIn()]
             ↓
      [AuthService.signIn(email, pw)]
             ↓
    [Supabase 로그인 → JWT 발급]
             ↓
   [Spring 서버에 JWT 전송 (_sendJwtToSpring)]
             ↓
  [Spring 응답 (성공/실패)] → [LoginResult 반환]
             ↓
    [ViewModel 상태 업데이트 + notifyListeners()]
             ↓
           [UI 반영]

 

728x90