이메일/PW 로그인을 '독립 IdP'로 격리하는 미학
대부분의 서비스는 이메일 로그인을 시스템 중심부에 직접 박아넣습니다. 하지만 진정한 결합도 해제(Decoupling)와 확장성을 원한다면, 자체 이메일 로그인조차 구글이나 카카오처럼 독립된 프로토콜 공급자(Identity Provider)로 취급해야 합니다.
1. 아키텍처의 대원칙: "인증은 신원 확인이고, 가입은 정책 동의다"
이 설계의 핵심은 신원(Identity)을 확보하는 과정과 서비스에 등록(Registration)하는 과정을 완전히 분리하는 것입니다.
- Phase 1: Identity Extraction (각 IdP 모듈): 이메일/PW 검증 혹은 소셜 로그인을 통해 유저의 신원 정보(Email, Profile 등)를 확보합니다.
- Phase 2: Onboarding Check (중앙 엔진): 확보된 신원이 DB에 없다면 곧바로 토큰을 주는 대신, 사용자를 '가입 대기' 상태로 전환합니다.
- Phase 3: Service Enrollment (온보딩 모듈): 약관 동의 및 추가 정보를 입력받아 최종적으로 가입을 완료합니다.
2. 3단계 파이프라인: "Limbo" 상태의 우아한 관리
사용자가 신원을 증명했지만 아직 약관에 동의하지 않은 상태를 우리는 **'임보(Limbo) 상태'**라고 부릅니다. 이를 위해 Redis가 아닌 DB 기반의 영속적 Staging이 필요합니다.
🚩 Staging Table (PendingRegistrations)
소셜 로그인이나 이메일 인증 직후 받은 프로필 데이터를 DB에 임시 저장합니다. Redis는 만료되지만, DB는 사용자가 다음 날 돌아와도 가입 절차를 이어가게 해줍니다.
🚩 세션 상태의 이분화
인증 직후 세션은
status: PENDING_REGISTRATION입니다. 이 상태에서는 오직 /onboarding API만 호출할 수 있습니다. 미들웨어(Global Guard)가 /mypage나 /dashboard로의 접근을 철저히 차단하고 온보딩 페이지로 튕겨내기 때문입니다. 모든 절차가 끝나야 세션은 비로소 ACTIVE로 업그레이드됩니다.3. 발생 가능한 난제와 기술적 해결책
💡 이메일 인증과 흐름의 연속성
자체 가입 시 인증 메일을 클릭하면 브라우저 컨텍스트가 바뀝니다. 이때 메일 링크에 심어진
transaction_id가 해결사가 됩니다. 어떤 환경에서 접속하든 DB에서 기존 가입 컨텍스트를 복원하여 중단된 지점부터 가입을 재개합니다.💡 Account Linking (계정 통합) 전략
이메일 주소가 같다고 무조건 합치는 것은 보안 자살 행위입니다.
- Verified-Only Matching: 양쪽 IdP(소셜 및 자체)에서 이메일 소유권이 완벽히 검증된 상태에서만 통합을 고려합니다.
- User Consent: 시스템이 독단적으로 합치지 않고, 사용자에게 "기존 계정과 연결하시겠습니까?"라고 명확히 묻는 단계를 둡니다.
💡 비정상 진입 및 Deep Linking 차단
가이드라인을 무시하고
/signup-complete로 직행하는 시도는 transaction_id의 상태값과 현재 요청을 대조하여 차단합니다. 상태가 일치하지 않으면 즉시 모든 세션을 파기하고 **"최초 로그인/가입 선택 화면"**으로 되돌립니다.4. 보안의 완성: 놓치지 말아야 할 디테일
설계가 아무리 우아해도 표준의 빈틈을 막지 못하면 무너집니다.
- PKCE 도입: 모든 클라이언트(SPA 포함)에 PKCE를 적용하여 인가 코드 탈취 공격을 원천 차단합니다.
- Open Redirector 방지: 화이트리스트 기반의
redirect_uri검증을 엄격히 시행합니다.
- Refresh Token Rotation: 리프레시 토큰을 일회용으로 만들어 탈취 시의 위험을 최소화합니다.
5. 왜 이 설계가 '가장 아름다운가'?
이 설계는 **"인증은 비즈니스 로직(Internal IdP)의 영역이고, 인가는 규격 프로토콜(Auth Engine)의 영역이다"**라는 사실을 가장 명확하게 실현합니다.
- 확장성: 새로운 인증 수단(Passkey, Apple ID 등)을 추가할 때 메인 엔진을 건드릴 필요가 없습니다.
- 유연성: 온보딩 도중 가입 항목이 바뀌어도 로그인 모듈들은 평온합니다.
- 데이터 무결성: Staging 전략을 통해 소셜 프로필 유실 없이 완벽한 가입 프로세스를 보장합니다.
결론: 기능을 넘어 플랫폼으로
이메일 로그인을 시스템의 내장 기능이 아닌, 독립된 프로토콜 공급자로 대우하는 순간부터 여러분의 서비스는 단순한 웹사이트를 넘어 하나의 Identity Platform이 됩니다. Auth0가 전 세계적인 성공을 거둔 비결도 바로 이 '격리와 영속성의 조화'에 있습니다.