Auth / 세션 / TURN·ICE 발급 — 코드레벨 동작 흐름 P2코드레벨

마지막 업데이트 2026-07-22

작성일: 2026-06-14 대상: 개발자 — 인증·세션·WebRTC 자격증명 파악 핵심 파일: lib/session.ts, lib/auth-refresh.ts, api/{members,users}/auth, api/ice-servers

개요 · 범위

치료사(member)·아동(child) PIN 로그인과 세션(쿠키) 관리, 토큰 갱신, 그리고 WebRTC용 TURN/ICE 자격증명 발급. Next.js가 BFF로서 외부 ppi-api 인증을 중계하고 토큰을 암호화 쿠키(iron-session)에 보관한다.

PIN 로그인 api/members/auth, api/users/auth

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()  (암호화 쿠키)

세션 (iron-session) lib/session.ts

memberchild
쿠키ppi-member-sessionppi-child-session
보관accessToken/refreshToken/accessTokenExpiresAt + 식별 정보
옵션httpOnly, secure(prod), sameSite lax, maxAge 14일, SESSION_SECRET 암호화
만료 버퍼 30분: isAccessTokenExpired는 만료 30분 전부터 만료로 본다. 수업(20분) 동안 BFF 호출이 없어 토큰이 만료되는 일을 막기 위한 선제 갱신 버퍼.

토큰 갱신 lib/auth-refresh.ts

refresh 결과를 3가지로 분류해 "세션 폐기 vs 유지"를 정확히 판단한다(잘못 폐기하면 수업 중 로그아웃).

RefreshOutcome의미 / 처리
refreshed새 accessToken + expiresAt
invalid (401만)refresh token 무효 → 세션 폐기 OK
transient (400/5xx/네트워크)일시 장애 → 세션 유지(폐기 근거 아님), warn 로깅
핵심 컨벤션: ppi-api는 401만 refresh token 무효 신호. 400(BFF 요청 버그)/5xx(ppi-api 장애)로 세션을 폐기하면 안 된다 — 일시 장애에 사용자가 로그아웃되는 회귀 방지.

TURN/ICE 발급 api/ice-servers/route.ts

GET /api/ice-servers
  → getMeteredApiKey()  (SSM/시크릿)
  → GET ppi.metered.live/api/v1/turn/credentials?apiKey=...
  → { iceServers: [{ urls, username, credential }] }

함정 · 주의

파일 · 라인 레퍼런스

파일역할
api/members/auth/route.ts, api/users/auth/route.tsPIN 로그인 BFF
lib/session.tsiron-session member/child 쿠키·만료 버퍼
lib/auth-refresh.tsrefresh 결과 분류(refreshed/invalid/transient)
api/ice-servers/route.tsMetered TURN 자격증명
lib/ppi-api-client.ts외부 ppi-api 클라이언트

관련 문서