Main APIAI 토큰 API
POST /ai/auth/refreshToken/v2
신규 web/app 공용 Refresh Token 재발급 (device 키 분리 엄격)
Refresh Token v2
신규 web FE + 신규 RN 모바일 앱이 공용으로 사용하는 refresh token 재발급 엔드포인트.
기존 POST /ai/auth/refreshToken 과 달리 device 키 분리가 엄격합니다 —
device 값에 따라 {userId}:web 또는 {userId}:app 키 1종만 조회/저장하므로,
한쪽 device 의 refresh 가 다른 device 세션을 건드리지 않습니다.
기존 v1 (/auth/refreshToken, /ai/auth/refreshToken) 은 web/app/legacy 3종 키를 모두 조회하고
새 refresh 는 강제로 app 또는 web 키로 저장하는 모호한 동작이 있어 v2 를 분리 신설했습니다.
기존 엔드포인트는 그대로 유지되며 legacy 호환만 담당합니다.
| 항목 | 값 |
|---|---|
| 메서드 | POST |
| 경로 | /ai/auth/refreshToken/v2 |
| 인증 | Refresh Token (Authorization header) |
요청
POST /ai/auth/refreshToken/v2
Authorization: Bearer {refresh_token}
Content-Type: application/json
{
"device": "APP"
}요청 헤더
| 헤더 | 필수 | 설명 |
|---|---|---|
Authorization | 예 | Bearer {refresh_token} 형식 |
요청 바디
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
device | string | 예 | "WEB" 또는 "APP". 발급 시 사용한 device 와 일치해야 함 |
검증 동작
- 서명 검증: refresh token JWT 의 서명만 검증 (만료는 무관 — Redis 가 실제 유효성 관리)
- userId 추출: 토큰 payload 에서 userId 추출
- Redis 조회:
{userId}:{device.lowercase}키에서 저장된 refresh token 조회 - 일치 확인: 저장된 token 과 요청 token 이 정확히 일치하는지 확인
- 재발급: 새 access + refresh token 발급, 같은 device 키에 저장
device 분리 엄격: APP 으로 발급된 refresh 는 device=WEB 으로 갱신할 수 없습니다.
반드시 발급받은 device 와 동일한 값을 전달해야 합니다.
응답
성공 (200 OK)
{
"memberId": "1234567890",
"accessToken": "eyJhbGciOiJIUzI1NiJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiJ9...",
"isFirstLogin": false
}Response 스키마 (TokenDto)
| 필드 | 타입 | 설명 |
|---|---|---|
memberId | string | 사용자 ID |
accessToken | string | 새로 발급된 Access Token |
refreshToken | string | 새로 발급된 Refresh Token (같은 device 키에 저장) |
isFirstLogin | boolean | 항상 false (refresh 흐름) |
에러 응답
{
"status": 401,
"code": "OAUTH_003",
"message": "ID token 검증에 실패했습니다.",
"data": null
}| HTTP | code | 발생 조건 | 프론트엔드 처리 |
|---|---|---|---|
| 400 | OAUTH_001 | refresh token 누락 또는 빈 문자열 | — |
| 400 | OAUTH_002 | device 누락 또는 잘못된 값 | — |
| 401 | OAUTH_003 | 서명 검증 실패 또는 userId 추출 불가 | 로그인 페이지로 이동 |
| 401 | OAUTH_007 | {userId}:{device} 키에 저장된 token 과 불일치 (세션 만료) | "세션이 만료되었습니다" 후 로그인 페이지로 이동 |
중요: 401 에러 발생 시 반드시 로그아웃 처리. 무한 retry 방지.
v1 과의 차이
| 항목 | v1 (/ai/auth/refreshToken) | v2 (/ai/auth/refreshToken/v2) |
|---|---|---|
| 조회 키 | web, app, legacy 3종 | 요청한 device 키 1종만 |
| 저장 키 | 무조건 web | 요청한 device 키 그대로 |
| 관리자 Redis 우회 | 있음 (Nest.js 호환) | 없음 |
| device 분리 | 약함 | 엄격 |
| body | 없음 (header 만) | { "device": "WEB" 또는 "APP" } |