전화번호 인증링크 발송 기반 로그인 플로우 구현 #9

Open
opened 2026-04-10 09:37:26 +09:00 by kyy · 1 comment
Owner

배경

현재 사번 로그인은 baron-sso와 연동된 백채널 인증 흐름을 사용하지만, 전화번호 로그인은 /api/send-link에서 데모용으로 세션을 즉시 생성하고 있어 실제 인증링크 기반 로그인으로 동작하지 않습니다.

목표

전화번호 입력 시 인증링크를 발송하고, 사용자가 링크를 통해 인증을 완료해야만 로그인되도록 흐름을 구현합니다.

현재 상태

  • 프론트엔드에서 숫자 입력은 phone 모드로 분기됨
  • 서버의 /api/send-link는 가상의 링크 발송 후 즉시 req.session.user를 생성함
  • 외부 SSO 또는 인증 확인 절차가 없음

요구사항

  1. 전화번호로 인증 요청 시 실제 인증링크 발송 로직을 연결한다.
  2. 링크 클릭 후 토큰/챌린지 검증 또는 인증 완료 콜백을 통해 로그인 세션을 생성한다.
  3. 데모용 즉시 로그인 처리는 제거하거나 별도 개발 플래그로 분리한다.
  4. 인증 성공/실패, 만료, 재전송 등의 기본 예외를 처리한다.
  5. 프론트엔드 상태 메시지와 리다이렉트 흐름을 실제 플로우에 맞게 수정한다.

확인할 사항

  • 인증링크를 어떤 백엔드/SSO 엔드포인트로 발송할지
  • 링크 클릭 시 프론트 콜백인지 서버 콜백인지
  • 세션 생성 시점과 토큰 검증 방식

완료 기준

  • 전화번호 입력만으로는 로그인 세션이 생성되지 않는다.
  • 발송된 인증링크를 통해서만 로그인 완료가 가능하다.
  • 기존 사번 로그인 흐름과 충돌 없이 공존한다.
## 배경 현재 사번 로그인은 `baron-sso`와 연동된 백채널 인증 흐름을 사용하지만, 전화번호 로그인은 `/api/send-link`에서 데모용으로 세션을 즉시 생성하고 있어 실제 인증링크 기반 로그인으로 동작하지 않습니다. ## 목표 전화번호 입력 시 인증링크를 발송하고, 사용자가 링크를 통해 인증을 완료해야만 로그인되도록 흐름을 구현합니다. ## 현재 상태 - 프론트엔드에서 숫자 입력은 `phone` 모드로 분기됨 - 서버의 `/api/send-link`는 가상의 링크 발송 후 즉시 `req.session.user`를 생성함 - 외부 SSO 또는 인증 확인 절차가 없음 ## 요구사항 1. 전화번호로 인증 요청 시 실제 인증링크 발송 로직을 연결한다. 2. 링크 클릭 후 토큰/챌린지 검증 또는 인증 완료 콜백을 통해 로그인 세션을 생성한다. 3. 데모용 즉시 로그인 처리는 제거하거나 별도 개발 플래그로 분리한다. 4. 인증 성공/실패, 만료, 재전송 등의 기본 예외를 처리한다. 5. 프론트엔드 상태 메시지와 리다이렉트 흐름을 실제 플로우에 맞게 수정한다. ## 확인할 사항 - 인증링크를 어떤 백엔드/SSO 엔드포인트로 발송할지 - 링크 클릭 시 프론트 콜백인지 서버 콜백인지 - 세션 생성 시점과 토큰 검증 방식 ## 완료 기준 - 전화번호 입력만으로는 로그인 세션이 생성되지 않는다. - 발송된 인증링크를 통해서만 로그인 완료가 가능하다. - 기존 사번 로그인 흐름과 충돌 없이 공존한다.
kyy added the
상태
개발진행
label 2026-04-10 09:37:34 +09:00
kyy self-assigned this 2026-04-10 09:37:36 +09:00
Author
Owner

작업 반영 내용 정리입니다.

  • 전화번호 로그인은 baron-sso의 실제 headless link 흐름(POST /api/v1/auth/headless/link/init -> POST /api/v1/auth/headless/link/poll)을 타도록 연결했습니다.
  • 우리 앱 쪽에서는 전화번호를 mock/demo로 즉시 완료하지 않도록 했고, 사번 로그인 흐름은 유지했습니다.
  • PHONE_HEADLESS_LINK_INIT_ENDPOINT, PHONE_HEADLESS_LINK_POLL_ENDPOINT 환경변수를 추가해 필요 시 오버라이드할 수 있게 했습니다.
  • 전화번호는 baron-sso 내부에서 +82로 정규화하므로, 현재는 원문 입력값(01027774695)을 그대로 보내는 쪽으로 정리했습니다.
  • 실제 장애 원인은 전화번호 자체가 아니라 return_tohttp://sso-test.hmac.kr로 잡혀 Kratos가 거부하는 것이었습니다. baron-ssoresolveUserfrontURL()를 조정해서 HTTPS 우선으로 반환하도록 수정했습니다.

검증:

  • node --check server.js
  • node --check public/app.js
  • go test ./internal/handler -run TestHeadlessLinkInit_HeadlessLoginClientSuccess -count=1 (baron-sso backend)

현재 남은 작업은 baron_backend 재배포 후 전화번호 로그인 재시도입니다.

작업 반영 내용 정리입니다. - 전화번호 로그인은 `baron-sso`의 실제 headless link 흐름(`POST /api/v1/auth/headless/link/init` -> `POST /api/v1/auth/headless/link/poll`)을 타도록 연결했습니다. - 우리 앱 쪽에서는 전화번호를 mock/demo로 즉시 완료하지 않도록 했고, 사번 로그인 흐름은 유지했습니다. - `PHONE_HEADLESS_LINK_INIT_ENDPOINT`, `PHONE_HEADLESS_LINK_POLL_ENDPOINT` 환경변수를 추가해 필요 시 오버라이드할 수 있게 했습니다. - 전화번호는 `baron-sso` 내부에서 `+82`로 정규화하므로, 현재는 원문 입력값(`01027774695`)을 그대로 보내는 쪽으로 정리했습니다. - 실제 장애 원인은 전화번호 자체가 아니라 `return_to`가 `http://sso-test.hmac.kr`로 잡혀 Kratos가 거부하는 것이었습니다. `baron-sso`의 `resolveUserfrontURL()`를 조정해서 HTTPS 우선으로 반환하도록 수정했습니다. 검증: - `node --check server.js` - `node --check public/app.js` - `go test ./internal/handler -run TestHeadlessLinkInit_HeadlessLoginClientSuccess -count=1` (baron-sso backend) 현재 남은 작업은 `baron_backend` 재배포 후 전화번호 로그인 재시도입니다.
kyy added
상태
개발완료
and removed
상태
개발진행
labels 2026-04-10 11:09:11 +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#9