HBEA100_로그인
(Hereby) 직원 앱 > 로그인
| 앱 | 직원 앱 (Employee App / ESS, 포트 4002) |
| 대상 사용자 | 미인증 방문자 → 조건1 [직원(self scope)] 발급 대상 |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_권한(RBAC)]] |
| Status | review |
| Owner | 카나 (PM) |
개요
직원 앱 로그인 화면(/employee-app/signin). 타이틀 "hereby 웍스" + 서브타이틀 = 조직명("hereby Medical") + 앱 로고 (2026-08-19 라이브 실증 — 구 "직원 앱에 로그인하세요" 타이틀은 미현행). 인증 방식 탭 2종: "비밀번호"(ID/비밀번호) / "휴대폰 인증"(ID → 인증번호 발송 → SMS OTP). "로그인" 버튼은 입력 전 disabled, 하단 "비밀번호 찾기" 링크. 인증 성공 시 근무 탭 홈(self scope). 휴대폰 인증 OTP는 LoginOtpCode에 발급·검증된다. 계정 레이어 전환(7/16 코드)은 라이브 반영 확인됨(브랜딩·탭 구성 실측 일치).
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-08-19 | 카나 | PM | 라이브 실증(세션 만료 계기): 타이틀 "hereby 웍스"·조직명 서브타이틀·로그인 disabled·"비밀번호 찾기" 확인, 계정 레이어 ⚠ 해소 |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | LoginOtpCode (발급 상태 파생) | idle(초기) | "발송 중..." / 입력 대기 상태 표시 |
| $ | 인증 세션 (self scope) | 없음(로그인 폼 유지) | ⚠ 계정 레이어 전환(7/16 코드) 반영 여부 라이브 확인 필요 |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 비밀번호 로그인 | id, password | sdk.auth.signin() (추정) | (미인증 → 세션 발급) |
| 인증번호 받기 | id | sdk.auth.requestOtp() (추정) | (미인증) |
| 인증번호 검증 | id, otp | sdk.auth.verifyOtp() (추정) | (미인증 → 세션 발급) |
발급/생성: 비밀번호·OTP 검증 → ${employee_session} 발급 / 인증번호 받기 → LoginOtpCode 생성. procedure 명 확정값 = TBU. ⚠ 계정 레이어 전환(7/16 코드)으로 세션 발급 경로가 바뀌었는지 라이브 확인 필요.
외부 통합 (해당 시)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| SMS 발송 | 휴대폰 인증 OTP 문자 | 비동기 | 발송사·재발송 정책 = TBU |
화면 플로우
로그인 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | 미인증 방문자 공통 노출. - CASE01 [세션 보유]: 근무 탭 홈으로 이동(로그인 화면 skip) | $ | ⚠ 계정 레이어 전환(7/16 코드) 반영 여부 라이브 확인 필요 |
| 01 | 초기 상태 | Output | "비밀번호" 탭 활성. 타이틀 "hereby 웍스" + 서브타이틀 조직명("hereby Medical") + 앱 로고 (2026-08-19 실증) | ||
| 10 | 인증 방식 탭 | Tab | • 인증 방식을 "비밀번호" / "휴대폰 인증" 2탭으로 전환하는 컨트롤 • 클릭 시: 해당 인증 폼으로 전환("비밀번호"=초기 활성, "휴대폰 인증"=전환 표시) | ⚠ 계정 레이어 7/16 로 탭 노출·순서 변동 여부 확인 | |
| 20 | 비밀번호 탭 | - | ID·비밀번호 입력 후 로그인 | ||
| ㄴ21 | ID | Input | • 직원 ID를 입력받는 필드 • 입력 → 직원 ID 반영. 빈 입력 유지 가능 | TBU: 형식 검증 UI | |
| ㄴ22 | 비밀번호 | Input | • 비밀번호를 마스킹 입력받는 필드 • 입력 → 마스킹 반영 - "비밀번호 표시" 클릭 → 마스킹/평문 토글 | ||
| ㄴ23 | 로그인 | Button | • 입력 자격으로 세션을 발급받아 홈으로 진입하는 기능 • 클릭 → 성공 시 근무 탭 홈 전환 - CASE01 [ID/비밀번호 미입력]: disabled(무반응 정상) - CASE02 [자격 불일치]: 실패 처리 | ${employee_session} 발급 | ⚠ 세션 발급 계정 레이어 7/16 확인 TBU: 실패 메시지·잠금 정책 |
| ㄴ24 | 비밀번호 찾기 | Link | • 비밀번호 재설정 동선으로 이동하는 링크 • 클릭 → TBU(재설정 동선 미확인) | TBU: 재설정 동선 | |
| 30 | 휴대폰 인증 탭 | - | ID → 인증번호 받기 → SMS OTP 검증 | LoginOtpCode | |
| ㄴ31 | ID | Input | • 직원 ID를 입력받는 필드 • 입력 → 직원 ID 반영 | ||
| ㄴ32 | 인증번호 받기 | Button | • 입력한 ID로 SMS OTP 발송을 요청하는 기능 • 클릭 → SMS OTP 발송, 발송 중 "발송 중..." 표시 - CASE01 [ID 미입력]: disabled | LoginOtpCode 생성 | TBU: 발송 실패 UI·재발송 쿨다운 |
| ㄴ33 | 인증번호 입력 | Input | • SMS OTP를 입력·검증해 로그인하는 필드 • 입력 → 검증 통과 시 근무 탭 홈 전환 | ${employee_session} 발급 | ⚠ 계정 레이어 7/16 확인 TBU: OTP 불일치·만료 처리 |
| 40 | 푸터 | Text | "© 2026 Hereby Platform" | 원문 카피 |
서브 화면 / 모달
현재 라이브에서 로그인 화면에 딸린 별도 모달·바텀시트·팝업은 관찰되지 않음. 비밀번호 찾기 재설정 화면 존재 여부 = TBU(별도 문서 승격 대상 후보).
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 화면 | 비고 |
|---|---|---|---|
| CASE01 [비밀번호 로그인] | ID+비밀번호 입력 → 로그인 | 근무 탭 홈(self scope) | |
| CASE02 [휴대폰 인증] | ID → 인증번호 받기 → OTP 검증 | 근무 탭 홈 | LoginOtpCode |
| CASE03 [입력 미완] | ID/비밀번호 공란 | 로그인 버튼 disabled | 무반응 정상(버그 아님) |
Open Question
계정 레이어 전환(7/16 코드) 라이브 재확인→ 해소(2026-08-19 실증): 브랜딩("hereby 웍스"+조직명)·탭 2종·disabled 로그인·비밀번호 찾기 실측 확인. 세션 발급 procedure 확정값은 여전히 TBU- 비밀번호 찾기 동선(재설정 방식) = TBU
- OTP 유효시간·재발송 정책(LoginOtpCode expiry·쿨다운) = TBU
- 로그인 실패 잠금 정책(N회 실패 시 계정 잠금 여부) = TBU
- 가입(신규 계정 생성) 동선의 EA 내 존재 여부 = TBU (직원 계정은 Admin 등록 경로 추정)