마지막 업데이트 2026-07-22
치료사(member)·아동(child) PIN 로그인과 세션(쿠키) 관리, 토큰 갱신, 그리고 WebRTC용 TURN/ICE 자격증명 발급. Next.js가 BFF로서 외부 ppi-api 인증을 중계하고 토큰을 암호화 쿠키(iron-session)에 보관한다.
POST /api/members/auth { name, pin } // 치료사
POST /api/users/auth { name, pin } // 아동
→ ppiApiClient.login(name, pin) // 외부 ppi-api
→ session.{accessToken, refreshToken, accessTokenExpiresAt, *Id, *Name, role}
→ session.save() (암호화 쿠키)
AUTHENTICATION_FAILED + 원 status 전달.| member | child | |
|---|---|---|
| 쿠키 | ppi-member-session | ppi-child-session |
| 보관 | accessToken/refreshToken/accessTokenExpiresAt + 식별 정보 | |
| 옵션 | httpOnly, secure(prod), sameSite lax, maxAge 14일, SESSION_SECRET 암호화 | |
isAccessTokenExpired는 만료 30분 전부터 만료로 본다. 수업(20분) 동안 BFF 호출이 없어 토큰이 만료되는 일을 막기 위한 선제 갱신 버퍼.refresh 결과를 3가지로 분류해 "세션 폐기 vs 유지"를 정확히 판단한다(잘못 폐기하면 수업 중 로그아웃).
| RefreshOutcome | 의미 / 처리 |
|---|---|
refreshed | 새 accessToken + expiresAt |
invalid (401만) | refresh token 무효 → 세션 폐기 OK |
transient (400/5xx/네트워크) | 일시 장애 → 세션 유지(폐기 근거 아님), warn 로깅 |
GET /api/ice-servers
→ getMeteredApiKey() (SSM/시크릿)
→ GET ppi.metered.live/api/v1/turn/credentials?apiKey=...
→ { iceServers: [{ urls, username, credential }] }
RTCConfiguration.iceServers로 사용.TURN_CRED_NO_API_KEY, 401 TURN_CRED_INVALID_API_KEY, 그 외 TURN_CRED_UNKNOWN_ERROR.getMeteredApiKey) — 클라이언트 비노출.| 파일 | 역할 |
|---|---|
| api/members/auth/route.ts, api/users/auth/route.ts | PIN 로그인 BFF |
| lib/session.ts | iron-session member/child 쿠키·만료 버퍼 |
| lib/auth-refresh.ts | refresh 결과 분류(refreshed/invalid/transient) |
| api/ice-servers/route.ts | Metered TURN 자격증명 |
| lib/ppi-api-client.ts | 외부 ppi-api 클라이언트 |