# TDC114PLUS Headless/PKCE 계약 차이 검토

작성일: 2026-07-09
상태: 정책 재정렬 완료, headless 직접 호출은 기본 흐름에서 제외

2026-07-09 결론:

- TDC114PLUS 앱의 기본 로그인은 `Baron SSO Hosted Login + OIDC Authorization Code + PKCE`다.
- 앱은 `/api/v1/auth/headless/...` API를 직접 호출하지 않는다.
- 이 문서는 headless 직접 호출을 검토하던 시점의 계약 차이를 보존하되, 현재 실행 기준으로는 `참고/레거시 검토 문서`로 본다.

## 1. 확인된 RP 설정

- RP 유형: PKCE 공개 클라이언트
- Client ID: `39d6190d-72f6-4a58-a84f-cdc5ece3e8af`
- Redirect URI: `https://114.hmac.kr/auth/callback`
- Client Secret: 없음
- OIDC issuer: `https://sso.hmac.kr/oidc`

## 2. 확인된 표준 OIDC 기능

Discovery 문서에서 아래 기능을 확인했다.

- authorization code grant
- token endpoint 인증 방식 `none`
- PKCE `S256`
- authorization, token, userinfo endpoint

따라서 공개 모바일 앱이 Client Secret 없이 PKCE verifier로 authorization code를 교환하는 표준 흐름은 지원된다.

## 3. Headless API 계약 차이

공식 Swagger의 아래 API는 `client_assertion`을 필수로 요구한다.

- `POST /api/v1/auth/headless/phone-login`
- `POST /api/v1/auth/headless/link/poll`

Swagger는 `client_assertion`을 `private_key_jwt`라고 정의한다. 이를 모바일 앱이 직접 생성하려면 RP 개인키가 APK에 포함되어야 하므로 공개 PKCE 앱 보안 모델과 맞지 않는다.

## 4. 적용 정책

- Client ID는 공개 식별자이므로 APK에 포함한다.
- Client Secret 또는 `private_key_jwt` 서명용 개인키는 APK에 포함하지 않는다.
- 표준 PKCE 생성, state 검증, authorization code 교환은 앱에 구현한다.
- 앱은 Baron SSO authorization endpoint를 열고, Baron SSO Hosted Login 화면이 휴대폰번호 입력과 문자/메일 링크 인증을 처리하게 한다.
- headless API 직접 호출은 현재 앱 기본 구현에서 제외한다.
- 추후 별도 신뢰 백엔드가 생기거나 Baron SSO가 모바일 공개 RP용 headless 계약을 제공하는 경우에만 별도 feature로 재검토한다.

## 5. Baron SSO 확인 요청

아래 질문은 앱이 headless API를 직접 호출해야 한다는 전제가 다시 살아날 때만 유효하다.

1. PKCE 공개 RP에서 `client_assertion` 생략이 가능한지
2. 불가능하다면 단기 assertion 발급 endpoint가 있는지
3. assertion의 issuer, subject, audience, 만료시간, 서명 알고리즘
4. `login_challenge`를 모바일 앱이 얻는 공식 절차
5. headless 승인 완료 후 `redirectTo`와 PKCE callback 연결 절차
