# 2026-07-16 업무 인계 메모

작성 시각: 2026-07-16 KST

## 오늘 최종 상태

- 실기기 로그인은 다시 정상 진행됐다.
- 문자 링크 승인 후 앱 복귀 시 직원검색 목록이 다시 표시되는 것까지 확인했다.
- 오늘 최종 복구 기준은 `로그인 성공 -> 직원검색 목록 표시 성공`이다.
- 다만 프로필 사진 1순위/2순위/3순위 화면 검증은 아직 오늘 완료 범위에 포함하지 않는다.

## 오늘 발생한 주요 이슈와 원인

### 1. 로그인 후 직원검색이 다시 무너지는 문제

현상:

- 로그인 링크 발송은 되지만 앱 진입 후 직원검색 화면이 비거나 로딩만 지속됐다.
- 잠시 후 `로그인이 만료되었거나 권한을 확인할 수 없습니다.` 화면으로 떨어졌다.

중간에 확인한 사실:

- 앱 SharedPreferences 안에는 세션 토큰이 실제로 저장되고 있었다.
- 저장된 토큰은 Baron access token이 아니라 `tdc114plus-auth`가 발급한 app session token 형식이었다.
- 저장된 user 정보는 아래처럼 fallback 값이었다.
  - `id = baron-user`
  - `name = Baron User`
  - `tenantSlug = ""`

의미:

- 세션 토큰이 전혀 저장되지 않는 문제는 아니었다.
- 다만 user 메타데이터는 충분하지 않았고, 동시에 org-context 중계 경로도 깨져 있었다.

### 2. 핵심 장애 원인: 5001 auth broker의 org-context self-recursion

현상:

- `tdc114plus-auth` 로그에 `/api/v1/integrations/org-context` 요청이 들어온 뒤,
  같은 5001 서버가 다시 자기 자신의 `/api/v1/integrations/org-context`를 호출하는 패턴이 반복됐다.
- 내부 재호출 요청에는 `Authorization`, `X-App-Session` 헤더가 없어서 결국 unauthorized 흐름으로 무너졌다.

실제 확인값:

- 실행 중인 5001 프로세스 환경변수에서 아래를 직접 확인했다.

```text
BARON_ORG_CONTEXT_BASE_URL=http://127.0.0.1:5001
```

즉:

- 원래 의도는 `https://sadmin.hmac.kr`를 upstream으로 호출해야 하는데,
- 실제 실행 중 프로세스는 자기 자신 `http://127.0.0.1:5001`을 upstream으로 잡고 있었다.

근본 원인:

- `scripts/start-auth-server.sh`가
  `TDC114_AUTH_UPSTREAM_ORG_CONTEXT_API_BASE` 값을 env 파일 `source` 전에 먼저 읽고 있었다.
- 그래서 `scripts/.env.android-device.local` 안에
  `TDC114_AUTH_UPSTREAM_ORG_CONTEXT_API_BASE=https://sadmin.hmac.kr`
  가 있어도 반영되지 않았다.
- 그 결과 fallback으로 `TDC114_ORG_CONTEXT_API_BASE=http://127.0.0.1:5001`를 사용하면서 self-recursion이 발생했다.

### 3. 오늘 복구 조치

수정 파일:

- `scripts/start-auth-server.sh`

수정 내용:

- `UPSTREAM_ORG_CONTEXT_BASE` 읽는 위치를 env 파일 `source` 뒤로 옮겼다.
- 이후 5001 auth broker를 재기동했다.

재기동 후 직접 확인한 실행 환경:

```text
PORT=5001
APP_SESSION_SECRET=tdc114plus-dev-session
BARON_ORG_CONTEXT_BASE_URL=https://sadmin.hmac.kr
BARON_ORG_CONTEXT_TENANT_SLUG=hanmac-family
```

결과:

- self-recursion 원인이 제거됐다.
- 다시 로그인 후 실기기 직원검색 목록이 정상 표시됐다.

## 오늘 추가로 확인한 기술 메모

### 1. `baron-user / Baron User` 생성 위치

파일:

- `/home/ubuntu/workspace/tdc114plus-auth/cmd/server/main.go`

확인 내용:

- `link/poll` 완료 후 `poll.User`에 값이 없을 때 fallback으로 아래 값이 채워진다.
  - `baron-user`
  - `Baron User`

현재 판단:

- 이 값은 오늘 새로 생긴 회귀가 아니라 기존 구조였다.
- 오늘의 실장애 원인은 이것 자체보다 `org-context upstream 오배선`이었다.

### 2. `tenantSlug` 누락 구조는 후속 개선 대상

현재 확인 결과:

- `tdc114plus-auth`의 `link/poll` 응답 user 모델에는 `tenantSlug`, `tenantId`, `tenantName`이 없다.
- 앱은 세션 user의 `tenantSlug`가 비어 있으면 후속 조직도/초기 선택 계산에서 fallback을 더 많이 타게 된다.

중요 판단:

- 오늘 직원검색이 완전히 무너진 직접 원인은 self-recursion이었다.
- 하지만 `tenantSlug` 누락 구조는 다음 작업에서 별도로 정리해야 한다.

## 오늘 수정/추가한 파일

- `scripts/start-auth-server.sh`
  - org-context upstream env 읽는 순서를 수정했다.

- `app/lib/src/core/config/app_environment.dart`
  - 빌드 시각 define 표시용 항목을 유지했다.

- `app/lib/src/features/auth/presentation/login_screen.dart`
  - 실기기에서 최신 APK 식별을 위해 빌드 시각 표시를 유지했다.

## 확인 완료한 테스트

1. 5001 health 확인

```bash
curl -i --max-time 5 http://127.0.0.1:5001/health
```

결과:

```json
{"jwks":"ok","provider":"baron","status":"ok"}
```

2. 실행 중 5001 프로세스 환경변수 확인

- `BARON_ORG_CONTEXT_BASE_URL=https://sadmin.hmac.kr` 반영 확인

3. 실기기 세션 저장 확인

- SharedPreferences 안에 app session token 저장 확인
- user fallback 값 저장 확인

4. 실기기 재로그인 후 직원검색 확인

- 문자 링크 승인 성공
- 앱 복귀 성공
- 직원검색 목록 표시 성공

## 내일 업무 시작 순서

1. 전일 인계 문서 먼저 확인

- `docs/daily-issues/2026-07-16_work_handoff.md`

2. 5001 auth broker health 확인

```bash
curl -fsSL --max-time 5 http://127.0.0.1:5001/health
```

3. 실행 중 5001 프로세스 upstream 값 확인

```bash
ss -ltnp '( sport = :5001 )'
tr '\0' '\n' < /proc/<PID>/environ | rg 'BARON_ORG_CONTEXT_BASE_URL|BARON_ORG_CONTEXT_TENANT_SLUG'
```

정상 기준:

```text
BARON_ORG_CONTEXT_BASE_URL=https://sadmin.hmac.kr
BARON_ORG_CONTEXT_TENANT_SLUG=hanmac-family
```

4. 실기기 ADB 연결 및 reverse 확인

```bash
ADB_SERVER_SOCKET=tcp:172.21.128.1:5037 ./scripts/flutter-docker.sh adb -s R5CT42QTCNX reverse --list
```

5. 앱 재로그인 후 첫 확인

- 직원검색 목록이 바로 뜨는지
- 30초 뒤에도 만료 화면으로 떨어지지 않는지

## 내일 우선 점검할 항목

1. `org-context` self-recursion이 정말 재발하지 않는지 먼저 확인한다.
2. `tenantSlug` 누락 구조를 `tdc114plus-auth` 응답 모델 기준으로 정리한다.
3. 프로필 사진 우선순위 검증을 아래 순서로 이어간다.
   - NAVER_WORKS
   - BARON_UUID_R2
   - DEFAULT
4. 직원검색 외에 조직도/상세/즐겨찾기 화면도 같은 세션 상태에서 유지되는지 확인한다.

## 보안상 주의사항

- 아래 값들은 문서에 실제 값을 남기지 않는다.
  - NAVER WORKS 서비스 계정 자격값
  - Baron org-context key id / secret
  - private key 경로 및 원문

- `scripts/.env.android-device.local`
- `secrets/naver_works_service_account.local.env`

위 두 파일은 계속 비공개 로컬 파일로만 유지한다.

## 내일 첫 판단 기준

- 내일 첫 목표는 “또 고치는 것”이 아니라 “오늘 복구한 5001 upstream 상태가 유지되는지 먼저 검증”이다.
- 그 상태가 유지되면 사진 정책 검증으로 넘어가고,
- 유지되지 않으면 가장 먼저 `start-auth-server.sh`와 실행 중 프로세스 환경변수부터 다시 본다.
