---
template: flow-doc@1
doc_id: 02-alimtalk-certify
title: site 알림톡 본인인증 절차군
config: ../_meta/template-config.yaml
last_verified: 767d1e44
flows:
  - id: alimtalk-link-entry
    actor: 일반회원
    status: active-prod
    status_source: ./00-ia.md#site-alimtalk-redirect-param
    evidence: [S-route, S-component]
    limitations:
      - 이 흐름을 걷는 사람은 로그인 주체가 아니다. 링크의 코드만 갖고 지난다. `actor` 에는 그 절차의 목적을 소유하는 주체를 적었고 보행자와 다르다 — `config.actors` 축에 비로그인 주체가 없는 것이 그 원인이며 `docs/_meta/term-requests/50-domain.md` 로 회부했다
      - 카카오 인앱 브라우저 탈출은 사용자 에이전트 문자열 판정과 타이머 폴백이라 실단말에서 어느 경로가 도는지 이 창이 확인하지 않았다
    refs:
      - ./00-ia.md#site-alimtalk-redirect-param
      - ./00-ia.md#site-alimtalk-step-one-param
      - ./00-ia.md#site-alimtalk-used-analysis-permission-param
      - ./00-ia.md#site-alimtalk-expired-access-link-param
    anchors:
      - insuniverse-site/front/src/App.tsx:283
      - insuniverse-site/front/src/pages/alimTalk/RedirectPage.tsx:29
      - insuniverse-site/front/src/features/alimtalk/check/hooks/useAlimtalk.ts:59
      - insuniverse-site/front/src/features/alimtalk/check/hooks/useAlimtalk.ts:126
  - id: alimtalk-certify-steps
    actor: 일반회원
    status: conditional-unknown
    status_source: ../05-schedules/03-monitoring.md#monitoring:alimtalk-status
    unknown_reason: 인증을 끝내지 않고 화면을 닫았을 때 서버 쪽에 남는 상태를 정리하는 것은 스케줄 작업이고, 그 작업의 활성 여부가 배포 환경 게이트에 달려 있어 이 저장소의 동결 트리만으로 판정할 수 없다. site 쪽 절차는 관측됐으나 그 뒤가 미상이다
    evidence: [S-route, S-component, S-test, S-constant]
    limitations:
      - 인증 완주 뒤 서버가 무엇을 어디에 남기는지는 이 문서가 판정하지 않았다. site 코드가 보는 것은 응답 형태뿐이다
      - 이탈 비콘의 발사 상한과 임계는 파일 상수이며 배포 설정이 아니다. 운영에서 그 값을 바꾸려면 배포가 필요하다
      - 뒤로가기 차단은 히스토리 재고정이라 브라우저 제스처만 막는다. 화면 안의 정상 이동에는 영향이 없다
    refs:
      - ./00-ia.md#site-alimtalk-step-one-param
      - ./00-ia.md#site-alimtalk-step-two-param
      - ./00-ia.md#site-alimtalk-step-three-param
      - ./00-ia.md#site-alimtalk-step-four-param
      - ./00-ia.md#site-alimtalk-step-fail-param
      - ../05-schedules/03-monitoring.md#monitoring:alimtalk-status
    anchors:
      - insuniverse-site/front/src/App.tsx:284
      - insuniverse-site/front/src/App.tsx:287
      - insuniverse-site/front/src/pages/alimTalk/Step2Page.tsx:525
      - insuniverse-site/front/src/pages/alimTalk/Step3Page.tsx:27
      - insuniverse-site/front/src/pages/alimTalk/StepFailPage.tsx:11
      - insuniverse-site/front/src/shared/hooks/useDropoutBeacon.ts:18
      - insuniverse-site/front/src/shared/hooks/usePreventBrowserBack.ts:27
  - id: alimtalk-queue-wait
    actor: 일반회원
    status: active-prod
    status_source: ./00-ia.md#site-alimtalk-queue-param
    evidence: [S-route, S-component, S-test, S-constant]
    limitations:
      - 대기 순번의 의미와 서버 쪽 정리 주기는 서버 소유다. site 는 폴링 간격과 재시도 상한만 갖는다
      - 새로고침과 앱 복귀를 구별할 수 없어 화면을 떠날 때 대기열에서 빠지지 않는다. 실제 정리는 서버 만료가 진다
    refs:
      - ./00-ia.md#site-alimtalk-queue-param
      - ./00-ia.md#site-alimtalk-step-two-param
      - ./00-ia.md#site-alimtalk-step-three-param
      - ./00-ia.md#site-alimtalk-step-fail-param
    anchors:
      - insuniverse-site/front/src/App.tsx:288
      - insuniverse-site/front/src/pages/alimTalk/QueuePage.tsx:55
      - insuniverse-site/front/src/pages/alimTalk/QueuePage.tsx:203
      - insuniverse-site/front/src/pages/alimTalk/QueuePage.tsx:64
  - id: alimtalk-b2c-certify
    actor: 일반회원
    status: active-prod
    status_source: ./00-ia.md#site-step-one-b2c-param
    evidence: [S-route, S-component]
    limitations:
      - B2C 판의 실패 화면 이동 대상에 등록된 라우트가 없다. 그 사실을 실패·이탈 표에 이름으로 적었고 코드는 고치지 않았다
      - 이 흐름을 걷는 사람도 로그인 주체가 아니다. `alimtalk-link-entry` 와 같은 축의 한계다
    refs:
      - ./00-ia.md#site-step-one-b2c-param
      - ./00-ia.md#site-step-two-b2c-param
      - ./00-ia.md#site-step-three-b2c-param
      - ./00-ia.md#site-step-four-b2c-param
      - ./00-ia.md#site-queue-b2c-param
      - ./00-ia.md#site-terms-b2c-personal-info
      - ./00-ia.md#site-terms-b2c-sensitive-info
    anchors:
      - insuniverse-site/front/src/App.tsx:301
      - insuniverse-site/front/src/App.tsx:313
      - insuniverse-site/front/src/pages/alimTalk/B2cStep3Page.tsx:36
      - insuniverse-site/front/src/pages/alimTalk/B2cStep3Page.tsx:131
      - insuniverse-site/front/src/pages/alimTalk/B2cQueuePage.tsx:52
---

# site 알림톡 본인인증 절차군

이 문서는 **알림톡으로 받은 링크를 눌러 시작하는 본인인증** 절차군을 담는다. 화면 구조의 정본은 [화면 인벤토리](./00-ia.md)이고, 인증·권한 규칙의 정본은 [총론](../02-access/01-authn.md)이다.

네 흐름이 서로 다른 것을 보여준다. `alimtalk-link-entry` 는 링크가 아직 쓸 수 있는지 판정하는 진입 구간, `alimtalk-certify-steps` 는 4단계 인증 본체와 중간 이탈·뒤로가기가 무엇을 일으키는가, `alimtalk-queue-wait` 는 전 공급자가 만석일 때 들어가는 대기 구간, `alimtalk-b2c-certify` 는 같은 목적을 다른 라우트 묶음으로 도는 B2C 판이다.

**이 절차군의 보행자는 로그인 주체가 아니다.** 링크에 실린 코드만 갖고 네 단계를 지나며 세션 쿠키를 요구받지 않는다. `config.actors` 는 로그인 주체 축이라 이 보행자를 담을 값이 없고, 각 흐름의 `actor` 에는 절차의 목적을 소유하는 주체를 적었다. 그 결손은 [용어 요청](../_meta/term-requests/50-domain.md)으로 내보냈다.

**진료분석 요청과 결과 열람은 이 문서에 없다.** 그쪽은 [진료·손해 분석 절차군](./01-analysis-flow.md)이다.

## 흐름 목록

| flow id | 목적 | actor | status |
|---|---|---|---|
| alimtalk-link-entry | 받은 링크가 아직 쓸 수 있는지 판정하고 첫 단계로 보낸다 | 일반회원 | active-prod |
| alimtalk-certify-steps | 동의부터 완료까지 4단계 본인인증을 마친다 | 일반회원 | conditional-unknown |
| alimtalk-queue-wait | 전 공급자 만석일 때 순번을 기다렸다 자리를 잡는다 | 일반회원 | active-prod |
| alimtalk-b2c-certify | B2C 라우트 묶음에서 같은 인증을 마친다 | 일반회원 | active-prod |

## 흐름

### alimtalk-link-entry

**전제**

- 알림톡으로 받은 링크가 있다. 링크에는 이 절차의 코드가 실려 있다
- 로그인 세션은 필요하지 않다. 이 경로들은 세션 가드의 비회원 허용 목록에 있다
- 링크를 카카오 인앱 브라우저에서 열 수도 있고 일반 브라우저에서 열 수도 있다

**절차**

1. 링크가 `site-alimtalk-redirect-param` 을 연다. 카카오 인앱 브라우저면 외부 브라우저 열기를 시도하고, 실패에 대비해 폴백 타이머를 건다 (`RedirectPage.tsx:29`).
2. 목적지로 이동하면 진입 훅이 이 코드로 분석이 가능한지 서버에 묻는다 (`useAlimtalk.ts:59`).
3. 쓸 수 있으면 `site-alimtalk-step-one-param` 에서 동의 화면을 연다.
4. 이전에 저장된 진행 위치가 있고 그것이 종단 화면이 아니면 그 위치로 되돌린다.

**되돌리기에 종단 화면 제외가 있는 이유는 순환 때문이다.** 완료·실패·사용됨·만료 네 화면은 저장된 위치로 채택하지 않는다. 채택하면 그 화면에서 다시 그 화면으로 보내는 고리가 생긴다. 이 흐름이 만드는 종단은 둘이다 — 이미 쓴 분석권이면 `site-alimtalk-used-analysis-permission-param`, 초대 링크의 접근 기간이 끝났으면 `site-alimtalk-expired-access-link-param` 이다 (`useAlimtalk.ts:126`).

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 해당 없음 — 이 경로들은 세션 가드의 비회원 허용 목록에 있다 (`useAuthGuard.tsx:8`) | 해당 없음 |
| 계정 종류 | 차단 | 해당 없음 — 로그인 주체가 아니라 계정 종류 축이 성립하지 않는다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — 조직관리자 축은 admin 콘솔 요청에만 발화한다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 해당 없음 — 이 절차군은 전용 레이아웃이라 사이드바가 없다 | 해당 없음 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 2단계 조회 | 코드가 없다 | ./00-ia.md#site-alimtalk-step-fail-param 으로 보낸다. 사유 구분값은 0이다 |
| 2단계 조회 | 초대 링크의 접근 기간이 끝났다 | ./00-ia.md#site-alimtalk-expired-access-link-param 으로 보낸다 |
| 2단계 조회 | 이 코드의 분석권이 이미 쓰였다 | ./00-ia.md#site-alimtalk-used-analysis-permission-param 으로 보낸다 |
| 2단계 조회 | 서버가 일시 오류를 낸다 | fail-closed 이동하지 않고 판정을 실패로 남긴다. 저장 경로 채택도 하지 않는다 |
| 1단계 진입 | 카카오 인앱 브라우저이고 외부 열기가 동작하지 않는다 | 계속 폴백 타이머가 같은 주소를 인앱에서 연다 |

### alimtalk-certify-steps

**전제**

- `alimtalk-link-entry` 가 이 코드를 쓸 수 있다고 판정했다
- 본인 명의 휴대전화로 문자를 받을 수 있다
- 인증 도중 화면을 벗어나면 그 사실이 서버로 전송된다. 전송은 세션당 상한이 있다

**절차**

1. `site-alimtalk-step-one-param` 에서 약관에 동의한다.
2. `site-alimtalk-step-two-param` 에서 본인 정보를 넣고 인증을 요청한다 (`pages/alimTalk/Step2Page.tsx:525`).
3. 요청이 접수되면 `site-alimtalk-step-three-param` 에서 받은 문자의 값을 넣는다. 이 화면부터 브라우저 뒤로가기가 무효화된다 (`usePreventBrowserBack.ts:27`).
4. 확인되면 `site-alimtalk-step-four-param` 이 완료를 알린다.

**중간 이탈은 두 겹으로 관측된다.** 화면이 숨겨지면 즉시 나감을, 다시 보이면 자리를 비운 시간을 서버에 보낸다. 짧은 순간 토글은 무시하고, 인증을 완주했으면 보내지 않는다 (`useDropoutBeacon.ts:18`). 모바일에서 화면이 숨겨지면 타이머가 얼기 때문에 지연 판단을 하지 않고 즉시 보내는 설계다.

**뒤로가기는 3·4단계와 대기 화면에서 막힌다.** 막는 이유는 되돌아간 앞 단계가 이미 만료된 세션으로 인증을 다시 요청해 오류로 튕기기 때문이다. 이 차단은 브라우저·제스처 뒤로가기만 무효화하고 화면 안의 정상 이동에는 영향이 없다.

**실패는 한 화면이 사유 구분값으로 갈라 받는다.** `site-alimtalk-step-fail-param` 이 질의 문자열의 구분값 0·1·2 로 세 문안을 나눠 보여주고, 값이 1일 때만 상태 종결을 서버에 알린다 (`StepFailPage.tsx:11`). 값 2는 서버가 이미 종결한 경우라 다시 알리지 않는다.

**서버 쪽에 무엇이 남는지는 이 문서가 판정하지 않는다.** 문자만 받고 화면을 닫은 경우의 정리는 스케줄 작업 소관이며 그 활성 여부가 배포 게이트에 달려 있다. 정본은 [스케줄 총론](../05-schedules/03-monitoring.md)이다.

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 해당 없음 — 이 경로들은 세션 가드의 비회원 허용 목록에 있다 | 해당 없음 |
| 계정 종류 | 차단 | 해당 없음 — 로그인 주체가 아니라 계정 종류 축이 성립하지 않는다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 해당 없음 — 전용 레이아웃이라 사이드바가 없다 | 해당 없음 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 2단계 요청 | 전 공급자가 만석이다 | ./00-ia.md#site-alimtalk-queue-param 으로 보낸다. 재요청용 입력값을 저장한다 |
| 2단계 요청 | 초대 링크의 접근 기간이 끝났다 | ./00-ia.md#site-alimtalk-expired-access-link-param 으로 보낸다 |
| 2단계 요청 | 네트워크 또는 서버가 일시 오류를 낸다 | fail-open 실패로 단정하지 않고 재시도 안내를 띄운다 |
| 2단계 요청 | 공급자가 문구 있는 실패를 낸다 | 계속 그 문구를 모달로 띄우고 같은 화면에 머문다 |
| 3단계 입력 | 클라이언트 타이머가 끝났다 | 막다름. 실패 화면의 사유 구분값 1이며 상태 종결을 서버에 알린다 |
| 3단계 입력 | 서버가 이미 실패로 종결했다 | 막다름. 실패 화면의 사유 구분값 2이며 종결 알림을 다시 보내지 않는다 |
| 3·4단계 | 사용자가 브라우저 뒤로가기를 누른다 | 계속 히스토리를 현재 위치로 재고정한다 |
| 전 단계 | 사용자가 화면을 숨기거나 탭을 닫는다 | 계속 나감을 서버에 보낸다. 세션당 상한에 걸리면 보내지 않는다 |

### alimtalk-queue-wait

**전제**

- `alimtalk-certify-steps` 2단계가 만석 응답을 받아 대기열 식별자를 받았다
- 재요청에 쓸 입력값이 저장돼 있다
- 화면을 열어 둔 채로 기다린다. 창을 닫으면 순번이 취소된다고 화면이 알린다

**절차**

1. `site-alimtalk-queue-param` 이 저장된 대기열 식별자로 순번을 폴링한다 (`QueuePage.tsx:203`).
2. 순번이 준비 상태가 되면 인증을 자동으로 다시 요청한다.
3. 자리를 잡으면 `site-alimtalk-step-three-param` 으로 넘어간다.
4. 사용자가 대기를 취소하면 `site-alimtalk-step-two-param` 으로 되돌려 재시도를 유도한다 (`QueuePage.tsx:55`).

**앞 순번이 맨 뒤로 떨어지지 않게 하는 장치가 있다.** 재요청이 또 만석을 만나면 새로 발급된 식별자를 반납하고 기존 자리를 유지한다. 최초 진입에서만 새 식별자를 채택한다.

**화면을 떠날 때 대기열에서 빼지 않는다.** 새로고침과 앱 복귀를 구별할 수 없기 때문이며, 실제 정리는 서버 만료가 진다. 백그라운드에서 돌아오면 즉시 한 번 더 폴링해 이탈 처리로 오인되는 것을 줄인다.

**되돌릴 수 없는 실패는 `site-alimtalk-step-fail-param` 으로 나간다.** 대기열 식별자가 없거나, 재개 조회가 연속으로 실패해 상한에 닿았거나, 재개 응답에 인증 세션값이 없는 세 경우다 (`QueuePage.tsx:64`).

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 해당 없음 — 세션 가드의 비회원 허용 목록에 있다 | 해당 없음 |
| 계정 종류 | 차단 | 해당 없음 — 로그인 주체가 아니다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 해당 없음 — 전용 레이아웃이라 사이드바가 없다 | 해당 없음 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 1단계 진입 | 대기열 식별자가 없다 | ./00-ia.md#site-alimtalk-step-fail-param 으로 보낸다 |
| 1단계 폴링 | 서버가 일시 오류를 낸다 | fail-open 대기를 유지하고 다음 폴링에서 재시도한다 |
| 1단계 폴링 | 대기열에서 빠졌는데 입력값이 남아 있다 | 계속 새 식별자를 받아 자동으로 다시 줄을 선다 |
| 1단계 폴링 | 대기열에서 빠졌고 입력값도 없다 | ./00-ia.md#site-alimtalk-step-two-param 으로 되돌린다 |
| 2단계 재요청 | 재개 조회가 연속으로 실패해 상한에 닿았다 | ./00-ia.md#site-alimtalk-step-fail-param 으로 보낸다 |
| 2단계 재요청 | 재개 응답이 만료를 가리킨다 | ./00-ia.md#site-alimtalk-step-two-param 으로 되돌린다 |
| 2단계 재요청 | 응답에 인증 세션값이 없다 | ./00-ia.md#site-alimtalk-step-fail-param 으로 보낸다. 빈 화면을 막기 위한 분기다 |
| 4단계 취소 | 사용자가 대기 취소를 누른다 | ./00-ia.md#site-alimtalk-step-two-param 으로 되돌리고 대기열에서 뺀다 |

### alimtalk-b2c-certify

**전제**

- B2C 링크에 실린 코드가 있다. 경로 묶음이 알림톡 판과 다르다
- 로그인 세션은 필요하지 않다. 이 경로들도 세션 가드의 비회원 허용 목록에 있다
- 약관 전문은 별도 화면으로 열린다

**절차**

1. `site-step-one-b2c-param` 에서 동의한다. 전문은 `site-terms-b2c-personal-info` 와 `site-terms-b2c-sensitive-info` 가 연다.
2. `site-step-two-b2c-param` 에서 본인 정보를 넣고 인증을 요청한다.
3. 만석이면 `site-queue-b2c-param` 에서 기다린다 (`B2cQueuePage.tsx:52`).
4. 자리를 잡으면 `site-step-three-b2c-param` 에서 문자 값을 넣고, 확인되면 `site-step-four-b2c-param` 이 완료를 알린다.

**이 흐름의 실패 이동 대상에 등록된 라우트가 없다.** 실패 시 이동 대상을 접두와 코드로 조립하는데 (`B2cStep3Page.tsx:36`·`:131`) 그 접두 `/step-fail/b2c` 로 시작하는 라우트가 라우트 트리에 없다. 알림톡 판에는 대응 화면이 있고 B2C 판에는 없다. **이 창은 코드를 고치지 않는다** — 사실을 여기 적고 이월했다.

**권한**

| 층 | 차단성 | 이 흐름에서의 강제 지점 | 실패 시 |
|---|---|---|---|
| 인증 | 차단 | 해당 없음 — 세션 가드의 비회원 허용 목록에 있다 (`useAuthGuard.tsx:17`) | 해당 없음 |
| 계정 종류 | 차단 | 해당 없음 — 로그인 주체가 아니다 | 해당 없음 |
| 쓰기 스코프 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 기업 노출 등급 | 차단 | 해당 없음 — admin 콘솔 축이다 | 해당 없음 |
| 메뉴 노출 | 비차단 | 해당 없음 — 전용 레이아웃이라 사이드바가 없다 | 해당 없음 |

**실패·이탈**

| 지점 | 조건 | 결과 |
|---|---|---|
| 2단계 요청 | 전 공급자가 만석이다 | ./00-ia.md#site-queue-b2c-param 으로 보낸다 |
| 2단계 요청 | 초대 링크의 접근 기간이 끝났다 | ./00-ia.md#site-alimtalk-expired-access-link-param 으로 보낸다. 이 대상은 알림톡 판과 공유한다 |
| 4단계 입력 | 인증이 실패한다 | 막다름. 이동 대상을 `/step-fail/b2c/` 접두로 조립하는데 그 접두의 라우트가 등록돼 있지 않다 |
| 3단계 대기 | 대기가 만료되거나 취소된다 | ./00-ia.md#site-step-two-b2c-param 으로 되돌린다 |
| 3단계 대기 | 재개 응답이 인증 세션값을 갖지 않는다 | 막다름. 같은 미등록 접두로 조립한다 |

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

이 절차군은 대개 알림톡에서 열리므로 **카카오 인앱 브라우저**가 첫 갈림이다. 진입 화면이 사용자 에이전트로 그것을 판정해 외부 브라우저 열기를 시도하고, 열리지 않으면 타이머 폴백이 인앱에서 같은 주소를 연다 (`RedirectPage.tsx:29`).

뒤로가기 차단은 브라우저와 앱 웹뷰 모두에서 같은 방식으로 돈다 — 히스토리를 현재 위치로 재고정하는 것이라 앱의 제스처 뒤로가기에도 걸린다. 앱이 그 제스처를 웹뷰로 넘기지 않도록 따로 끄는 브리지 호출이 있지만 이 절차군의 화면들이 그것을 부르지는 않는다.

앱 최소버전 강제는 이 절차군이 아니라 앱 껍데기 진입에서 걸린다. 그 서술은 [계정 절차군](./04-mypage-account.md)에 있다.

## 연혁

| 릴리스 | 날짜 | SHA | 변경 요약 |
|---|---|---|---|
| — | 2026-08-27 | 767d1e44 | 최초 저작. 동결 HEAD 의 라우트 트리·진입 훅·대기열 화면 정독에서 네 흐름을 유도했다 |
