feat(frontend): 로그인된 기기 — 앱 세션 · 앱 로그인 기록을 보인다

앱 로그인 서버가 생겨 계정 보안 화면에 앱 세션 · 앱 로그인이 함께 들어온다.

- "로그인된 브라우저" → "로그인된 기기"(계약 5절), 개수는 세션의 client 로 "웹메일 2곳 ·
  ARA SYSTEM 앱 1곳"(0곳인 쪽은 쓰지 않음), 앱 세션은 늘 휴대폰 아이콘
- 로그인 기록 방식 "ARA SYSTEM 앱", 앱 줄의 기기 칸은 운영체제만(방식 칸이 이미 앱 이름)
- [다른 곳 모두 로그아웃] · 비밀번호 바꾸기 · 안내 글이 웹메일만이 아니라 앱까지 끊는다고 말한다
- 웹 · 앱은 client · method 로만 가른다(User-Agent 이름으로 짐작하지 않는다)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-06 16:40:54 +09:00
parent 5d3a018708
commit a111cd2fd4
17 changed files with 399 additions and 98 deletions
@@ -84,7 +84,7 @@ export function useAccountSecurity() {
return api.delete<null, null>(`/app-passwords/${segment(id)}`, options)
}
/** 로그인된 브라우저 — 지금 세션이 맨 앞, 그다음 최근 활동 차례 (서버 최대 100 을 한 번에) */
/** 로그인된 기기(웹메일 · 앱 세션 — 항목의 client) — 지금 세션이 맨 앞, 그다음 최근 활동 차례 (서버 최대 100 을 한 번에) */
function listAuthSessions(options?: AccountSecurityRequestOptions): Promise<PaginatedResult<AuthSession>> {
return api.get<PaginatedResult<AuthSession>, PaginatedResult<AuthSession>>('/auth/sessions', {
params: { limit: AUTH_SESSION_LIST_LIMIT },
@@ -97,7 +97,7 @@ export function useAccountSecurity() {
return api.delete<null, null>(`/auth/sessions/${segment(id)}`, options)
}
/** 이 요청의 세션만 남기고 모두 끊는다 */
/** 이 요청의 세션만 남기고 모두 끊는다 (앱 세션도) */
function endOtherAuthSessions(options?: AccountSecurityRequestOptions): Promise<EndedSessions> {
return api.delete<EndedSessions, EndedSessions>('/auth/sessions', options)
}