12 KiB
12 KiB
tdc114plus API 계약
작성일: 2026-07-02 상태: v1.0 1차 구현 기준 확정
목적: tdc114plus Flutter 앱이 Baron SSO backend 및 orgFront 데이터와 연동하기 위해 필요한 API 계약을 정의한다. 본 문서는 구현 전 계약 기준이며, 실제 Baron SSO backend 구현은 /home/ubuntu/workspace/baron-sso-tdc114plus-api의 feature/tdc114plus-api 브랜치에서 진행한다.
1. 설계 기준
확인한 기준 문서:
docs/tdc114plus-development-decision-brief-2026-07-01.mddocs/tdc114plus-development-policy-2026-07-02.mddocs/baron-sso-reference-source-policy-2026-07-02.mddocs/references/baron-safe-policies/api-contract.md- Baron SSO
docs/API_DESIGN_POLICY.md - Baron SSO
docs/identity-redis-mirror-policy-2026-06-09.md - Baron SSO
docs/references/baron-safe-policies/nonstandard-phone-only-login-technical-review-2026-06-23.md
확인한 기존 Baron SSO 코드:
backend/cmd/server/main.gobackend/internal/handler/auth_handler.gobackend/internal/handler/tenant_handler.gobackend/internal/handler/user_handler.gobackend/internal/domain/user.gobackend/internal/domain/tenant.goorgfront/src/lib/adminApi.ts
2. 핵심 원칙
- 기존 Baron SSO API 응답을
tdc114plus요구사항에 맞게 직접 변경하지 않는다. tdc114plus전용 endpoint와 response DTO를 둔다.- JSON field는 camelCase를 사용한다.
- 목록 응답은
items,limit,offset,total,nextCursor형식을 따른다. - 직원/조직 데이터는 Baron SSO
orgFront및 backend read model을 기준으로 제공한다. - 앱 자체 회원가입은 제공하지 않는다.
- 미등록 사용자는 앱 사용을 허용하지 않는다.
- 공지사항, 전자결재, 수신전화식별, 수신팝업은 1차 API 범위에서 제외한다.
3. 1차 구현 확정사항
| 항목 | 1차 구현 기준 | 후속 검토 |
|---|---|---|
| 전화번호 로그인 보안 수준 | Baron SSO 등록 사용자 확인, rate limit, 감사 로그, generic error message 적용 | SMS OTP, 기기 등록, 내부망 제한, 추가 인증 |
| token 종류 | 기존 Baron SSO session token 재사용 | 앱 전용 access token 또는 refresh token 분리 |
| 개인정보 마스킹 범위 | Baron SSO 등록 사용자에게 직원 검색/조직도 기본 필드 노출 | 권한별 전화번호/이메일/직급 마스킹 정책 |
| 즐겨찾기 동기화 | 1차는 앱 로컬 저장 | 서버 동기화 API 추가 |
본 확정사항은 1차 개발 범위를 빠르게 구현하기 위한 기준이다. 운영 배포 전 보안 리뷰에서 전화번호 로그인, token 저장, 개인정보 노출 범위는 재검토한다.
4. API namespace
권장 namespace:
/api/v1/tdc114plus
이유:
- 기존
/api/v1/admin/users,/api/v1/admin/orgchart/snapshot은 관리자/orgFront 성격이 강하다. - 앱은 일반 등록 사용자용 직원검색/조직도 기능이므로 별도 namespace가 필요하다.
- 향후 감사 로그, 마스킹, 앱별 권한 정책을 독립적으로 적용하기 쉽다.
5. 인증 API
5.1 전화번호 로그인
POST /api/v1/tdc114plus/auth/phone-login
설명:
- 사용자가 앱 로그인창에 전화번호를 입력하면 Baron SSO 등록 사용자 여부를 확인한다.
- 등록 사용자이면 앱 사용에 필요한 Baron SSO session token을 반환한다.
- 기존 Baron SSO의
/api/v1/auth/phone-login흐름을 참고하되,tdc114plus전용 DTO와 오류 정책을 둔다.
요청:
{
"phoneNumber": "01012345678",
"device": {
"platform": "android",
"appVersion": "0.1.0",
"deviceName": "Pixel 8"
}
}
응답:
{
"status": "ok",
"token": "baron-sso-session-token",
"expiresAt": "2026-07-02T12:00:00Z",
"user": {
"id": "user-uuid",
"name": "홍길동",
"phoneNumber": "+821012345678",
"tenantId": "tenant-uuid",
"tenantName": "한맥",
"tenantSlug": "hanmac",
"department": "기술연구소",
"grade": "책임",
"position": "팀장",
"jobTitle": "개발"
}
}
오류:
| HTTP | code | 설명 |
|---|---|---|
| 400 | invalid_phone_number |
전화번호 형식 오류 |
| 401 | login_failed |
등록 사용자 확인 실패. 사용자 존재 여부를 과도하게 드러내지 않는다. |
| 429 | rate_limited |
반복 시도 제한 |
| 503 | identity_provider_unavailable |
Kratos/SSO 조회 실패 |
보안 메모:
- 전화번호 단독 로그인은 표준 인증으로 보기 어렵다.
- 1차 정책상 Baron SSO 등록 인원 확인용으로 사용하되, rate limit, 감사 로그, generic error message를 적용한다.
- 운영 전에는 SMS OTP, 기기 등록, 내부망 제한, 추가 인증 중 하나 이상을 후속 검토한다.
5.2 내 프로필
GET /api/v1/tdc114plus/me
Authorization: Bearer {token}
응답:
{
"id": "user-uuid",
"name": "홍길동",
"phoneNumber": "+821012345678",
"email": "user@example.com",
"tenantId": "tenant-uuid",
"tenantName": "한맥",
"tenantSlug": "hanmac",
"department": "기술연구소",
"grade": "책임",
"position": "팀장",
"jobTitle": "개발",
"permissions": {
"directory": true,
"organization": true,
"favoritesSync": false
}
}
6. 직원검색/전화번호검색 API
6.1 직원 목록 및 검색
GET /api/v1/tdc114plus/directory/employees
Authorization: Bearer {token}
Query:
| 이름 | 필수 | 설명 |
|---|---|---|
q |
N | 이름, 전화번호, 부서, 직위, 직무 검색어 |
tenantId |
N | 가족사/회사/조직 필터 |
tenantSlug |
N | 가족사 slug 필터 |
department |
N | 부서명 필터 |
limit |
N | 기본 50 |
offset |
N | 기본 0 |
cursor |
N | cursor pagination 사용 시 |
응답:
{
"items": [
{
"id": "user-uuid",
"name": "홍길동",
"phoneNumber": "+821012345678",
"phoneDisplay": "010-1234-5678",
"email": "user@example.com",
"tenantId": "tenant-uuid",
"tenantName": "한맥",
"tenantSlug": "hanmac",
"department": "기술연구소",
"grade": "책임",
"position": "팀장",
"jobTitle": "개발",
"status": "active",
"profileImageUrl": null,
"sortOrder": 100
}
],
"limit": 50,
"offset": 0,
"total": 1,
"nextCursor": ""
}
검색 규칙:
q는 이름, 전화번호, 부서, 직위, 직책, 직무, 이메일 일부를 대상으로 한다.- 전화번호 검색은 숫자만 입력해도 매칭되도록 서버에서 정규화한다.
- 기본 노출 대상은 조직도 표시 가능한 사용자 상태로 제한한다.
- Baron SSO 기준
active,temporary_leave,suspended는 조직도 노출 후보로 볼 수 있다. baron_guest,extended_leave,archived는 기본 제외한다.
6.2 직원 상세
GET /api/v1/tdc114plus/directory/employees/{employeeId}
Authorization: Bearer {token}
응답:
{
"id": "user-uuid",
"name": "홍길동",
"phoneNumber": "+821012345678",
"phoneDisplay": "010-1234-5678",
"email": "user@example.com",
"tenantId": "tenant-uuid",
"tenantName": "한맥",
"tenantSlug": "hanmac",
"joinedTenants": [
{
"id": "tenant-uuid",
"name": "한맥",
"slug": "hanmac",
"type": "COMPANY",
"parentId": "parent-tenant-uuid"
}
],
"department": "기술연구소",
"grade": "책임",
"position": "팀장",
"jobTitle": "개발",
"status": "active",
"profileImageUrl": null,
"actions": {
"call": true,
"sms": true,
"email": true
}
}
7. 가족사 필터/조직도 API
7.1 가족사/조직 필터 목록
GET /api/v1/tdc114plus/organization/tenants
Authorization: Bearer {token}
응답:
{
"items": [
{
"id": "tenant-uuid",
"name": "한맥",
"slug": "hanmac",
"type": "COMPANY",
"parentId": "hanmac-family-root",
"memberCount": 120,
"totalMemberCount": 350
}
],
"generatedAt": "2026-07-02T12:00:00Z"
}
7.2 조직도 snapshot
GET /api/v1/tdc114plus/organization/orgchart
Authorization: Bearer {token}
Query:
| 이름 | 필수 | 설명 |
|---|---|---|
tenantId |
N | 특정 가족사/조직 하위만 조회 |
refresh |
N | 서버 캐시 refresh 요청. 기본 false |
응답:
{
"tenants": [
{
"id": "tenant-uuid",
"name": "기술연구소",
"slug": "rnd",
"type": "ORGANIZATION",
"parentId": "company-tenant-uuid",
"memberCount": 12,
"totalMemberCount": 38
}
],
"employees": [
{
"id": "user-uuid",
"name": "홍길동",
"phoneNumber": "+821012345678",
"phoneDisplay": "010-1234-5678",
"tenantId": "tenant-uuid",
"tenantName": "기술연구소",
"tenantSlug": "rnd",
"department": "기술연구소",
"grade": "책임",
"position": "팀장",
"jobTitle": "개발",
"status": "active"
}
],
"generatedAt": "2026-07-02T12:00:00Z",
"cache": {
"source": "redis",
"hit": true,
"ttlSeconds": 300
}
}
구현 참고:
- 기존
GET /api/v1/admin/orgchart/snapshot은tenants,users,generatedAt,cache구조를 가진다. tdc114plus응답은 앱 의미에 맞춰users대신employees를 사용한다.- 기존 admin/orgFront API를 직접 변경하지 않고 별도 DTO에서 변환한다.
8. 즐겨찾기 API
1차 구현은 앱 로컬 저장을 기본으로 한다.
서버 동기화는 후속 단계에서 검토한다.
후속 후보:
GET /api/v1/tdc114plus/favorites
PUT /api/v1/tdc114plus/favorites
9. 오류 응답 공통 형식
Baron SSO API 설계 정책에 맞춰 신규 API는 code를 기본 포함한다.
{
"error": "사람이 읽을 수 있는 메시지",
"code": "machine_readable_code",
"details": {}
}
공통 오류:
| HTTP | code | 설명 |
|---|---|---|
| 400 | invalid_request |
요청 형식 오류 |
| 401 | unauthorized |
토큰 없음/만료 |
| 403 | forbidden |
tdc114plus 사용 권한 없음 |
| 404 | not_found |
직원/조직 없음 |
| 429 | rate_limited |
과도한 요청 |
| 503 | dependency_unavailable |
Kratos, Redis, DB 등 의존성 장애 |
10. 개인정보/보안 정책
- 전화번호 원문은 로그에 남기지 않고 마스킹 또는 정규화 값 일부만 기록한다.
- 직원 검색/상세 조회는 감사 로그 대상으로 둔다.
- 대량 조회, 짧은 시간 내 반복 조회는 이상 조회 탐지 후보로 기록한다.
- 1차 구현에서는 Baron SSO 등록 사용자에게 직원 검색/조직도 기본 필드를 노출한다.
- 권한별 민감정보 마스킹은 후속 정책에서 확정한다.
- 1차 앱에서는
call,sms액션을 제공하되, 앱 내부에서 수신전화식별/수신팝업 기능은 구현하지 않는다.
11. Baron SSO 구현 후보
신규 패키지/파일 후보:
backend/internal/domain/tdc114plus_models.go
backend/internal/handler/tdc114plus_handler.go
backend/internal/service/tdc114plus_service.go
backend/internal/service/tdc114plus_service_test.go
backend/internal/handler/tdc114plus_handler_test.go
라우트 후보:
tdc114plus := api.Group("/tdc114plus")
tdc114plus.Post("/auth/phone-login", tdc114plusHandler.PhoneLogin)
tdc114plus.Get("/me", requireAnyUser, tdc114plusHandler.GetMe)
tdc114plus.Get("/directory/employees", requireAnyUser, tdc114plusHandler.ListEmployees)
tdc114plus.Get("/directory/employees/:id", requireAnyUser, tdc114plusHandler.GetEmployee)
tdc114plus.Get("/organization/tenants", requireAnyUser, tdc114plusHandler.ListTenants)
tdc114plus.Get("/organization/orgchart", requireAnyUser, tdc114plusHandler.GetOrgChart)
12. 구현 전 확인사항
확정되어 바로 진행 가능한 항목:
- 전용 namespace
/api/v1/tdc114plus - 전용 DTO
- 기존 admin/user/orgchart API는 변경하지 않음
- 직원/조직 데이터는 기존 orgchart snapshot 및 identity mirror/read model 기반으로 변환
- 전화번호 로그인은 1차에서 등록자 확인 + rate limit + audit + generic error message 기준으로 구현
- token은 1차에서 기존 Baron SSO session token 재사용
- 개인정보는 1차에서 Baron SSO 등록 사용자에게 기본 필드 노출
- 즐겨찾기는 1차에서 앱 로컬 저장
운영 배포 전 재검토 항목:
- SMS OTP, 기기 등록, 내부망 제한, 추가 인증 중 하나 이상 도입 여부
- 앱 전용 access token 또는 refresh token 분리 여부
- 권한별 개인정보 마스킹 범위
- 즐겨찾기 서버 동기화 API 추가 여부