@startuml 로그인플로우 !theme mono title 로그인 플로우 - 외부 시퀀스 다이어그램 actor "Mobile Client" as Client participant "API Gateway" as Gateway participant "User Service" as UserService database "Redis Cache" as Redis == 로그인 화면 접근 == Client -> Gateway: GET /login-page activate Gateway Gateway -> Client: 200 OK (로그인 화면) deactivate Gateway == 로그인 처리 == Client -> Gateway: POST /api/v1/users/auth/login\n{userId, password} activate Gateway Gateway -> UserService: 로그인 요청 전달 activate UserService UserService -> UserService: 사용자 인증 처리\n(비밀번호 검증) alt 인증 성공 UserService -> UserService: JWT 토큰 생성 UserService -> Redis: 세션 정보 저장\n(userId, token, TTL) activate Redis Redis -> UserService: 저장 완료 deactivate Redis UserService -> Gateway: 200 OK\n{token, userId, profile} Gateway -> Client: 로그인 성공\n{token, profile} Client -> Client: 토큰 저장\n(localStorage) Client -> Client: 대시보드로 이동 else 인증 실패 UserService -> Gateway: 401 Unauthorized\n{error: "아이디 또는 비밀번호를 확인해주세요"} Gateway -> Client: 로그인 실패 메시지 alt 5회 연속 실패 UserService -> Redis: 계정 잠금 정보 저장\n(userId, lockTime: 30분) UserService -> Gateway: 423 Locked\n{error: "30분간 계정 잠금"} Gateway -> Client: 계정 잠금 안내 end end deactivate UserService deactivate Gateway == 로그인 상태 확인 == Client -> Gateway: GET /api/v1/users/profile\n(Authorization: Bearer {token}) activate Gateway Gateway -> Gateway: JWT 토큰 검증 alt 토큰 유효 Gateway -> Redis: 세션 조회\n(userId) activate Redis Redis -> Gateway: 세션 정보 반환 deactivate Redis Gateway -> UserService: 프로필 조회 activate UserService UserService -> Gateway: 사용자 프로필 반환 deactivate UserService Gateway -> Client: 200 OK\n{userId, name, email, avatar} Client -> Client: 프로필 표시\n(헤더 아바타) else 토큰 무효 Gateway -> Client: 401 Unauthorized Client -> Client: 로그인 화면으로 이동 end deactivate Gateway == 로그아웃 처리 == Client -> Client: 로그아웃 확인 다이얼로그 표시 Client -> Gateway: POST /api/v1/users/auth/logout\n(Authorization: Bearer {token}) activate Gateway Gateway -> UserService: 로그아웃 요청 activate UserService UserService -> Redis: 세션 삭제\n(userId) activate Redis Redis -> UserService: 삭제 완료 deactivate Redis UserService -> Gateway: 200 OK\n{message: "안전하게 로그아웃되었습니다"} deactivate UserService Gateway -> Client: 로그아웃 완료 deactivate Gateway Client -> Client: 토큰 삭제\n(localStorage) Client -> Client: 로그인 화면으로 이동 note right of Client 대시보드(01) 화면의 헤더에서 프로필 아바타를 클릭하면 드롭다운 메뉴가 표시됨: - 내 정보 보기 - 프로필 편집 - 로그아웃 end note note right of UserService 로그인 시 검증 사항: - 아이디/비밀번호 확인 - 계정 잠금 상태 확인 - 연속 실패 횟수 체크 - JWT 토큰 생성 및 발급 end note note right of Redis 캐시 저장 정보: - 세션 정보 (토큰, 사용자ID) - 로그인 실패 횟수 - 계정 잠금 상태 - TTL 기반 자동 만료 end note @enduml