---
template: flow-doc@1
doc_id: 04-mypage-account
title: site 가입·로그인·계정 절차군
config: ../_meta/template-config.yaml
last_verified: 767d1e44
flows:
  - id: account-signup
    actor: 일반회원
    status: active-prod
    status_source: ./00-ia.md#site-auth-join
    evidence: [S-route, S-component]
    limitations:
      - 가입 자격의 서버 판정은 이 문서가 다루지 않는다. site 는 화면 순서와 이동만 갖는다
      - 초대 코드로 들어오는 갈래의 코드 발급처는 이 창에서 확인하지 않았다
    refs:
      - ./00-ia.md#site-auth-join
      - ./00-ia.md#site-auth-join-invite
      - ./00-ia.md#site-auth-join-agreement
      - ./00-ia.md#site-auth-login
    anchors:
      - insuniverse-site/front/src/App.tsx:276
      - insuniverse-site/front/src/App.tsx:278
      - insuniverse-site/front/src/features/joinForm/hooks/useJoinForm.ts:67
      - insuniverse-site/front/src/features/loginForm/ui/LoginForm.tsx:44
  - id: account-signin
    actor: 일반회원
    status: conditional-unknown
    status_source: ../06-vendors/04-messaging.md#messaging:__bridge__:platform
    unknown_reason: 앱 껍데기에서 도는 진입 절차(최소버전 확인·자동 로그인 준비·제스처 제어)가 웹뷰 브리지에 달려 있고, 브리지 존재 판정이 빌드 환경변수와 실행 단말의 웹뷰 주입에 함께 걸려 있어 이 저장소의 동결 트리만으로 어느 경로가 도는지 판정할 수 없다
    evidence: [S-route, S-component, S-guard, S-constant]
    limitations:
      - 앱 최소버전 값은 파일 상수이며 배포 설정이 아니다. 값을 올리려면 웹 빌드를 다시 내보내야 한다
      - 세션 만료 판정은 클라이언트가 들고 있는 만료 시각과 현재 시각의 비교다. 서버 쪽 무효화와 어긋날 수 있으며 그 간극은 이 문서가 판정하지 않았다
    refs:
      - ./00-ia.md#site-auth-login
      - ./00-ia.md#site-root
      - ./00-ia.md#site-main
      - ../06-vendors/04-messaging.md#messaging:__bridge__:platform
    anchors:
      - insuniverse-site/front/src/App.tsx:152
      - insuniverse-site/front/src/App.tsx:206
      - insuniverse-site/front/src/shared/hooks/App/useAppVersionCheck.ts:11
      - insuniverse-site/front/src/shared/hooks/App/useAuthGuard.tsx:52
      - insuniverse-site/front/src/features/loginForm/hooks/useLoginForm.ts:50
  - id: account-recovery
    actor: 일반회원
    status: active-prod
    status_source: ./00-ia.md#site-auth-find
    evidence: [S-route, S-component]
    limitations:
      - 이 흐름의 이동 대상 하나에 등록된 라우트가 없다. 그 사실을 실패·이탈 표에 이름으로 적었고 코드는 고치지 않았다
      - 찾기 결과의 서버 판정 규칙은 이 문서가 다루지 않는다
    refs:
      - ./00-ia.md#site-auth-find
      - ./00-ia.md#site-auth-login
    anchors:
      - insuniverse-site/front/src/App.tsx:279
      - insuniverse-site/front/src/pages/auth/find/FindPage.tsx:1
      - insuniverse-site/front/src/features/findForm/ui/FindIdFail.tsx:9
      - insuniverse-site/front/src/features/findForm/hooks/useFindPwResetForm.ts:46
  - id: account-profile
    actor: 일반회원
    status: conditional-unknown
    status_source: ../06-vendors/04-messaging.md#messaging:fcm:token-lifecycle
    unknown_reason: 푸시 설정 화면이 켜고 끄는 값의 실제 발송 경로가 푸시 공급자 자격과 토큰 수명 규약에 달려 있고, 그 규약의 활성 조건이 배포 환경 게이트에 있어 이 저장소에서 판정할 수 없다
    evidence: [S-route, S-component]
    limitations:
      - 탈퇴의 서버 처리와 보존 기간은 이 문서가 다루지 않는다. 보존 규칙의 정본은 스케줄 총론이다
      - 초대 보상 규칙은 서버 소유다. site 는 초대 수단을 여는 화면만 갖는다
    refs:
      - ./00-ia.md#site-mypage
      - ./00-ia.md#site-mypage-edit
      - ./00-ia.md#site-mypage-invite
      - ./00-ia.md#site-mypage-push-settings
      - ./00-ia.md#site-mypage-with-drawall
      - ../06-vendors/04-messaging.md#messaging:fcm:token-lifecycle
    anchors:
      - insuniverse-site/front/src/App.tsx:367
      - insuniverse-site/front/src/App.tsx:387
      - insuniverse-site/front/src/pages/mypage/withDrawall/WithDrawallPage.tsx:100
      - insuniverse-site/front/src/pages/mypage/withDrawall/WithDrawallPage.tsx:174
---

# site 가입·로그인·계정 절차군

이 문서는 **계정을 만들고, 들어오고, 잃어버린 것을 찾고, 자기 정보를 고치는** 절차군을 담는다. 화면 구조의 정본은 [화면 인벤토리](./00-ia.md)이고, 세션 규칙의 정본은 [인증 총론](../02-access/01-authn.md)이다. 여기서는 순서만 쓴다.

네 흐름이 서로 다른 것을 보여준다. `account-signup` 은 계정을 만드는 구간, `account-signin` 은 들어오는 구간과 **앱 껍데기가 웹 앞에 얹는 것들**, `account-recovery` 는 아이디·비밀번호를 되찾는 구간, `account-profile` 은 들어온 뒤 자기 정보를 다루는 구간이다.

**웹과 앱 웹뷰가 갈라지는 지점은 대부분 `account-signin` 에 모여 있다.** 앱 최소버전 강제·자동 로그인 준비·당겨서 새로고침·뒤로가기 제스처가 전부 껍데기 진입에서 걸리며, 그 서술은 아래 플랫폼 차이 절에 있다. 결과 저장(PDF)의 갈림만 [진료·손해 분석 절차군](./01-analysis-flow.md)에 있다.

## 흐름 목록

| flow id | 목적 | actor | status |
|---|---|---|---|
| account-signup | 계정을 만들고 로그인 화면까지 도달한다 | 일반회원 | active-prod |
| account-signin | 로그인해 세션을 얻고 앱 껍데기의 진입 조건을 지난다 | 일반회원 | conditional-unknown |
| account-recovery | 아이디를 찾거나 비밀번호를 다시 정한다 | 일반회원 | active-prod |
| account-profile | 내 정보를 고치고 초대·푸시·탈퇴를 다룬다 | 일반회원 | conditional-unknown |

## 흐름

### account-signup

**전제**

- 로그인 세션이 없다. 세션이 있으면 이 경로들은 메인으로 되돌려진다
- 초대 코드가 있으면 초대 갈래로, 없으면 일반 갈래로 들어온다

**절차**

1. `site-auth-login` 에서 회원가입 진입을 누르면 `site-auth-join-agreement` 로 간다 (`LoginForm.tsx:44`).
2. 약관에 동의하면 `site-auth-join` 에서 정보를 넣는다.
3. 초대 코드로 들어온 경우는 `site-auth-join-invite` 가 그 갈래를 맡는다.
4. 가입이 끝나면 `site-auth-login` 으로 돌려보낸다 (`useJoinForm.ts:67`).

**가입 완료가 자동 로그인은 아니다.** 네 자리의 완료 분기가 모두 로그인 화면으로 돌려보낸다.

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 역방향으로 걸린다 — 세션이 있으면 세션 가드가 이 경로들을 메인으로 되돌린다 (`useAuthGuard.tsx:61`) | 메인으로 이동 |
| 계정 종류 | 차단 | 해당 없음 — 아직 계정이 없다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 해당 없음 — 인증 전용 레이아웃이라 사이드바가 없다 | 해당 없음 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 1단계 진입 | 이미 로그인돼 있다 | ./00-ia.md#site-main 으로 되돌린다 |
| 2단계 제출 | 서버가 중복이나 형식 오류를 낸다 | 계속 같은 화면에서 안내한다 |
| 4단계 완료 | 가입이 끝난다 | ./00-ia.md#site-auth-login 으로 보낸다 |
| 3단계 진입 | 초대 코드가 유효하지 않다 | 계속 일반 갈래와 같은 화면에 머문다 |

### account-signin

**전제**

- 웹 브라우저이거나 앱 웹뷰다. 앱 웹뷰면 브리지가 주입돼 있을 수 있다
- 앱이면 최소 허용 버전 이상이어야 한다. 미만이면 업데이트 팝업이 닫히지 않는다

**절차**

1. 앱 껍데기가 열리면 최소버전 확인이 브리지로 나간다 (`useAppVersionCheck.ts:11`). 응답이 없으면 구버전으로 보고 업데이트 팝업을 띄운다.
2. 자동 로그인 준비 신호를 앱에 보낸다 (`App.tsx:206`).
3. `site-auth-login` 에서 자격 증명을 제출한다. 성공하면 세션이 서고, 그 세션을 본 세션 가드가 인증 전용 경로에서 `site-main` 으로 되돌린다 (`useAuthGuard.tsx:61`). **로그인 훅 안의 이동 호출은 주석 처리돼 있어 도달하지 않는다** (`useLoginForm.ts:50`) — 실제 이동은 가드 쪽 한 자리뿐이다.
4. `site-root` 로 들어오면 라우트 요소가 곧바로 메인으로 넘긴다.
5. 세션이 있는 채로 화면을 옮길 때마다 만료 시각을 확인하고, 지났으면 로그아웃 신호를 보낸다 (`useAuthGuard.tsx:52`).

**업데이트 팝업은 뒤로가기로 빠져나갈 수 없다.** 팝업을 띄우기 전에 히스토리를 한 겹 쌓고, 뒤로가기가 오면 다시 쌓아 화면을 고정한다. 닫기 버튼도 없고 버튼은 스토어로 나가는 것 하나다.

**최소 허용 버전은 파일 상수다.** iOS 와 Android 가 서로 다른 버전 체계를 쓰며 두 값 모두 소스에 박혀 있다. 배포 설정이 아니므로 값을 올리려면 웹을 다시 빌드해야 한다.

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 세션 가드가 비허용 경로의 무세션 진입을 로그인 화면으로 보낸다 (`useAuthGuard.tsx:52`) | 로그인 화면으로 이동 |
| 계정 종류 | 차단 | 해당 없음 — 로그인 자체는 계정 종류로 갈리지 않는다. 갈림은 로그인 뒤 화면들이 각자 진다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 로그인 뒤 사이드바가 계정에 따라 그려진다. 이 흐름은 그 계산의 입력만 만든다 | 사이드바에서 사라져도 경로를 직접 열면 인증 층만 통과하면 열린다 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 1단계 확인 | 앱이 브리지 응답을 2초 안에 주지 않는다 | 막다름. 업데이트 팝업을 띄우고 닫기를 막는다 |
| 1단계 확인 | 앱 버전이 최소 허용 미만이다 | 막다름. 같은 팝업을 띄운다 |
| 3단계 제출 | 자격 증명이 맞지 않는다 | 계속 로그인 화면에 머문다 |
| 3단계 성공 | 로그인이 끝난다 | ./00-ia.md#site-main 으로 이동한다 |
| 4단계 진입 | 세션이 없다 | ./00-ia.md#site-auth-login 으로 보낸다 |
| 5단계 확인 | 만료 시각이 지났다 | fail-closed 로그아웃 신호를 보내고 세션을 버린다 |

### account-recovery

**전제**

- 로그인 세션이 없다
- 찾을 대상의 본인 확인 수단이 있다

**절차**

1. `site-auth-find` 에서 아이디 찾기와 비밀번호 찾기 중 하나를 고른다.
2. 아이디를 찾으면 결과 화면이 그 값을 보여주고 로그인으로 돌아가는 경로를 준다.
3. 비밀번호는 재설정 화면을 지나 새 값을 정한다 (`useFindPwResetForm.ts:46`).
4. 끝나면 `site-auth-login` 으로 돌아간다.

**찾지 못했을 때의 이동 대상에 등록된 라우트가 없다.** 아이디·비밀번호 두 실패 화면 모두 회원가입 버튼이 `/join` 으로 보내는데 (`FindIdFail.tsx:9`) 라우트 트리에 그 경로가 없다. 실제 가입 경로는 `/auth/join` 이다. **이 창은 코드를 고치지 않는다** — 사실을 여기 적고 이월했다.

**이 자리는 화면의 페이지 파일 한 겹만 보면 보이지 않는다.** 두 실패 화면은 페이지가 직접 렌더하지 않고 기능 묶음의 배럴을 두 겹 지나 들어오며, 이 문서의 이동 대상 유도는 그 배럴을 따라가 얻은 것이다.

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 역방향으로 걸린다 — 세션이 있으면 메인으로 되돌린다 (`useAuthGuard.tsx:61`) | 메인으로 이동 |
| 계정 종류 | 차단 | 해당 없음 — 아직 세션이 없다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 해당 없음 — 인증 전용 레이아웃이라 사이드바가 없다 | 해당 없음 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 2단계 조회 | 일치하는 아이디가 없다 | 막다름. 회원가입 버튼이 `/join` 으로 보내는데 그 경로의 라우트가 등록돼 있지 않다 |
| 3단계 조회 | 일치하는 계정이 없다 | 막다름. 같은 미등록 경로로 보낸다 |
| 2단계 성공 | 아이디를 찾았다 | ./00-ia.md#site-auth-login 으로 돌아가는 경로를 준다 |
| 3단계 완료 | 비밀번호를 다시 정했다 | ./00-ia.md#site-auth-login 으로 보낸다 |
| 1단계 진입 | 이미 로그인돼 있다 | ./00-ia.md#site-main 으로 되돌린다 |

### account-profile

**전제**

- 로그인 세션이 있다
- 푸시 설정을 바꾸려면 단말이 알림을 받을 수 있어야 한다

**절차**

1. 회원이 `site-mypage` 에서 자기 계정 화면을 연다.
2. 정보 수정은 `site-mypage-edit` 이 맡는다.
3. 친구 초대는 `site-mypage-invite` 가 맡는다.
4. 알림 수신 설정은 `site-mypage-push-settings` 가 맡는다.
5. 탈퇴는 `site-mypage-with-drawall` 이 맡고, 진행 전에 남은 구독을 먼저 정리하도록 보낸다 (`WithDrawallPage.tsx:100`).

**탈퇴 화면은 두 방향으로 되돌린다.** 구독이 남아 있으면 구독 화면으로, 정보가 모자라면 정보 수정 화면으로 보낸다 (`WithDrawallPage.tsx:174`). 두 경로 모두 탈퇴를 막는 것이 아니라 선행 조건을 채우게 하는 것이다.

**푸시 수신 여부가 실제 발송으로 이어지는지는 이 문서가 판정하지 않는다.** 발송 자격과 토큰 수명의 정본은 [메시징 벤더 정책](../06-vendors/04-messaging.md)이며 그 활성 조건이 배포 게이트에 있다.

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 라우트 트리의 세션 가드 (`useAuthGuard.tsx:52`) | 로그인 화면으로 이동 |
| 계정 종류 | 차단 | 해당 없음 — 마이페이지 화면들은 계정 종류를 보고 되돌리지 않는다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 마이페이지 카드에서 연다 | URL 을 직접 치면 인증 층만 통과하면 열린다 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 5단계 진입 | 구독이 남아 있다 | ./00-ia.md#site-mypage-subscription 으로 보낸다 |
| 5단계 진입 | 정보가 모자란다 | ./00-ia.md#site-mypage-edit 으로 보낸다 |
| 4단계 저장 | 단말이 알림을 허용하지 않았다 | 계속 값은 저장되지만 발송 도달은 이 문서가 판정하지 않는다 |
| 전 단계 | 세션이 만료됐다 | HTTP 401. 세션 만료 처리가 로그아웃으로 이어진다 |

## 플랫폼 차이 (웹 / 웹뷰)

**앱 껍데기가 웹 앞에 얹는 것이 넷이다.** 최소버전 확인·자동 로그인 준비·당겨서 새로고침 제어·뒤로가기 제스처 제어가 모두 브리지 호출이며 브리지가 없으면 아무 일도 일어나지 않는다 (`App.tsx:152`·`:206`·`:229`·`:241`). 브리지 존재 판정은 사용자 에이전트와 빌드 환경변수 이름으로 하고, iOS 는 메시지 핸들러 유무를 Android 는 전역 객체 유무를 본다 (`common.helper.ts:1326`).

**최소버전 강제는 앱에서만 걸린다.** 웹 브라우저는 브리지가 없으므로 이 확인 자체를 하지 않는다. 앱인데 응답이 없으면 브리지가 없는 구버전으로 보고 같은 팝업을 띄운다 — 즉 *응답 없음* 과 *버전 미달* 이 같은 결과로 접힌다.

**로그인 성공 시 앱에는 값이 두 번 더 전달된다.** 계정 정보와 인증 토큰을 브리지로 보내 앱이 자동 로그인에 쓴다 (`App.tsx:189`·`:192`). 웹에는 그 단계가 없다.

**뒤로가기는 두 층에서 다뤄진다.** 앱 껍데기가 제스처를 켜고 끄는 축이 하나, [알림톡 본인인증 절차군](./02-alimtalk-certify.md)의 화면들이 히스토리를 재고정하는 축이 다른 하나다. 두 축은 서로 모른다.

PDF 저장의 갈림은 [진료·손해 분석 절차군](./01-analysis-flow.md)에 있다.

## 연혁

| 릴리스 | 날짜 | SHA | 변경 요약 |
|---|---|---|---|
| — | 2026-08-27 | 767d1e44 | 최초 저작. 동결 HEAD 의 라우트 트리·세션 가드·앱 껍데기 훅 정독에서 네 흐름을 유도했다 |
