[Headless] UserFront 연동 앱 실행 시 /callback 에서 멈추고 /home.html 로 이동하지 않음 #15

Open
opened 2026-04-15 09:41:22 +09:00 by kyy · 1 comment
Owner

Summary

baron-sso UserFront 대시보드에서 연동된 RP 카드 local-demo-rp를 클릭하면 OIDC flow는 성공적으로 진행되어 http://localhost:4000/callback?code=... 까지 도달하지만, 이후 RP 홈 화면인 /home.html로 이동하지 않고 인증이 완료되었습니다. 앱으로 돌아가주세요. 문구만 표시됩니다.

반면 headless-login-demo 자체 로그인 화면(http://localhost:4000)에서 직접 로그인하면 정상적으로 세션이 생성되고 /home.html로 이동합니다.

Reproduction

  1. baron-sso UserFront에 로그인한다.
  2. 대시보드의 linked RP 카드 local-demo-rp를 클릭한다.
  3. 브라우저가 http://localhost:4000/callback?code=...&scope=openid+profile&state=... 로 이동한다.
  4. 화면에 인증이 완료되었습니다. 앱으로 돌아가주세요. 만 표시되고 home.html로 넘어가지 않는다.

Expected

OIDC callback에서 받은 code를 RP가 token endpoint로 교환하고, 로컬 세션을 생성한 뒤 http://localhost:4000/home.html 로 리다이렉트되어야 합니다.

Actual

/callback 엔드포인트가 고정 안내 문구만 반환하고 종료됩니다.

Root Cause

현재 headless-login-demo에는 로그인 경로가 두 개 있습니다.

  1. Demo page direct login
  • public/app.js -> /api/login 또는 /api/send-link
  • server.jsrunHeadlessSsoLogin(...)redirectTo 추적, authorization code 획득, token exchange, req.session.user 저장까지 수행
  • 이후 JSON 응답의 redirectTo: '/home.html' 를 프론트가 따라가며 정상 이동
  1. UserFront linked RP launch
  • UserFront가 RP의 init_url(Hydra /oauth2/auth?...)을 직접 오픈
  • OIDC flow 완료 후 브라우저가 RP의 /callback?code=... 로 직접 돌아옴
  • 이 경로는 /api/login / runHeadlessSsoLogin(...) / public/app.js 를 거치지 않음
  • 현재 /callback 핸들러는 code exchange / session creation / redirect logic 없이 안내 문구만 반환

즉, direct login flow는 구현되어 있지만 OIDC callback direct-entry flow는 미구현 상태입니다.

Relevant Code

  • server.js
    • runHeadlessSsoLogin(...) inside login flow handles token exchange and returns redirectTo: '/home.html'
    • /callback currently only returns a plain text message
  • public/app.js
    • direct login path redirects to result.redirectTo

Suggested Fix

/callback 에서도 direct login flow와 동일하게 아래를 수행하도록 공통화가 필요합니다.

  1. query parameter의 code 검증
  2. token endpoint로 authorization_code 교환
  3. id_token에서 사용자 정보 추출
  4. req.session.user 저장
  5. 302 /home.html 리다이렉트

가능하면 token exchange / session creation 로직을 runHeadlessSsoLogin(...) 내부 전용으로 두지 말고 재사용 가능한 helper로 분리하는 편이 안전합니다.

Notes

문서 의도와도 현재 구현이 어긋납니다.

  • docs/headless-employee-login-flow.md 에서는 마지막 단계가 세션 쿠키 발급 후 /home.html 리다이렉트 로 설명되어 있습니다.
## Summary `baron-sso` UserFront 대시보드에서 연동된 RP 카드 `local-demo-rp`를 클릭하면 OIDC flow는 성공적으로 진행되어 `http://localhost:4000/callback?code=...` 까지 도달하지만, 이후 RP 홈 화면인 `/home.html`로 이동하지 않고 `인증이 완료되었습니다. 앱으로 돌아가주세요.` 문구만 표시됩니다. 반면 `headless-login-demo` 자체 로그인 화면(`http://localhost:4000`)에서 직접 로그인하면 정상적으로 세션이 생성되고 `/home.html`로 이동합니다. ## Reproduction 1. `baron-sso` UserFront에 로그인한다. 2. 대시보드의 linked RP 카드 `local-demo-rp`를 클릭한다. 3. 브라우저가 `http://localhost:4000/callback?code=...&scope=openid+profile&state=...` 로 이동한다. 4. 화면에 `인증이 완료되었습니다. 앱으로 돌아가주세요.` 만 표시되고 `home.html`로 넘어가지 않는다. ## Expected OIDC callback에서 받은 `code`를 RP가 token endpoint로 교환하고, 로컬 세션을 생성한 뒤 `http://localhost:4000/home.html` 로 리다이렉트되어야 합니다. ## Actual `/callback` 엔드포인트가 고정 안내 문구만 반환하고 종료됩니다. ## Root Cause 현재 `headless-login-demo`에는 로그인 경로가 두 개 있습니다. 1. Demo page direct login - `public/app.js` -> `/api/login` 또는 `/api/send-link` - `server.js` 의 `runHeadlessSsoLogin(...)`가 `redirectTo` 추적, authorization code 획득, token exchange, `req.session.user` 저장까지 수행 - 이후 JSON 응답의 `redirectTo: '/home.html'` 를 프론트가 따라가며 정상 이동 2. UserFront linked RP launch - UserFront가 RP의 `init_url`(Hydra `/oauth2/auth?...`)을 직접 오픈 - OIDC flow 완료 후 브라우저가 RP의 `/callback?code=...` 로 직접 돌아옴 - 이 경로는 `/api/login` / `runHeadlessSsoLogin(...)` / `public/app.js` 를 거치지 않음 - 현재 `/callback` 핸들러는 code exchange / session creation / redirect logic 없이 안내 문구만 반환 즉, direct login flow는 구현되어 있지만 OIDC callback direct-entry flow는 미구현 상태입니다. ## Relevant Code - `server.js` - `runHeadlessSsoLogin(...)` inside login flow handles token exchange and returns `redirectTo: '/home.html'` - `/callback` currently only returns a plain text message - `public/app.js` - direct login path redirects to `result.redirectTo` ## Suggested Fix `/callback` 에서도 direct login flow와 동일하게 아래를 수행하도록 공통화가 필요합니다. 1. query parameter의 `code` 검증 2. token endpoint로 `authorization_code` 교환 3. `id_token`에서 사용자 정보 추출 4. `req.session.user` 저장 5. `302 /home.html` 리다이렉트 가능하면 token exchange / session creation 로직을 `runHeadlessSsoLogin(...)` 내부 전용으로 두지 말고 재사용 가능한 helper로 분리하는 편이 안전합니다. ## Notes 문서 의도와도 현재 구현이 어긋납니다. - `docs/headless-employee-login-flow.md` 에서는 마지막 단계가 `세션 쿠키 발급 후 /home.html 리다이렉트` 로 설명되어 있습니다.
kyy changed title from [Headless] UserFront linked app launch stops at /callback instead of redirecting to /home.html to [Headless] UserFront 연동 앱 실행 시 /callback 에서 멈추고 /home.html 로 이동하지 않음 2026-04-15 09:41:59 +09:00
kyy self-assigned this 2026-04-15 09:46:23 +09:00
kyy added the
상태
개발진행
label 2026-04-15 09:46:26 +09:00
Author
Owner

작업 완료 보고

이슈 #15에서 보고된 OIDC 콜백 진입 시 인증이 멈추는 문제를 해결했습니다.

주요 수정 사항

  1. 콜백 엔드포인트 구현: /callback 경로로 직접 들어오는 인가 코드(Authorization Code)를 처리하여 토큰으로 교환하고 세션을 생성하도록 로직을 추가했습니다.
  2. 로직 공통화:
    • exchangeCodeForToken(code): 인가 코드를 보안 토큰으로 교환하는 로직을 통합 관리합니다.
    • finalizeLogin(req, tokenData, method): 토큰에서 사용자 정보를 추출하고 세션을 생성하는 과정을 표준화했습니다.
  3. 리다이렉트 보장: 인증 완료 후 안내 문구만 표시되던 문제를 해결하고, 자동으로 /home.html 대시보드로 이동하게 수정했습니다.

이제 UserFront 대시보드를 통한 진입과 직접 로그인 방식 모두 정상적으로 세션이 생성됩니다.

## 작업 완료 보고 이슈 #15에서 보고된 OIDC 콜백 진입 시 인증이 멈추는 문제를 해결했습니다. ### 주요 수정 사항 1. **콜백 엔드포인트 구현**: `/callback` 경로로 직접 들어오는 인가 코드(Authorization Code)를 처리하여 토큰으로 교환하고 세션을 생성하도록 로직을 추가했습니다. 2. **로직 공통화**: - `exchangeCodeForToken(code)`: 인가 코드를 보안 토큰으로 교환하는 로직을 통합 관리합니다. - `finalizeLogin(req, tokenData, method)`: 토큰에서 사용자 정보를 추출하고 세션을 생성하는 과정을 표준화했습니다. 3. **리다이렉트 보장**: 인증 완료 후 안내 문구만 표시되던 문제를 해결하고, 자동으로 `/home.html` 대시보드로 이동하게 수정했습니다. 이제 UserFront 대시보드를 통한 진입과 직접 로그인 방식 모두 정상적으로 세션이 생성됩니다.
kyy added
상태
개발완료
and removed
상태
개발진행
labels 2026-04-15 10:05:40 +09:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kyy/headless-login-demo#15