- auth/negotiation 도메인별 api/keys/queries/mutations/type 5파일 구조 - axios 인스턴스: access token 주입, 434 만료 시 refresh 자동 재발급(단일 비행) 후 원요청 재시도, 433/435/1203(TOKEN_REVOKED) 시 세션 종료 처리 - HTTP 200 + result.success=false 비즈니스 에러를 ApiError 로 변환, 에러코드별 한국어 메시지 맵(getApiErrorMessage) 제공 - 토큰 localStorage 저장소(tokenStorage) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
28 lines
918 B
TypeScript
28 lines
918 B
TypeScript
// JWT access/refresh 토큰의 영속 저장소.
|
|
// axios 인터셉터(http.ts)와 인증 mutation 이 공유한다.
|
|
|
|
const ACCESS_KEY = 'negosium.accessToken'
|
|
const REFRESH_KEY = 'negosium.refreshToken'
|
|
|
|
export const tokenStorage = {
|
|
getAccessToken: (): string | null => localStorage.getItem(ACCESS_KEY),
|
|
getRefreshToken: (): string | null => localStorage.getItem(REFRESH_KEY),
|
|
|
|
setTokens: (accessToken: string, refreshToken: string): void => {
|
|
localStorage.setItem(ACCESS_KEY, accessToken)
|
|
localStorage.setItem(REFRESH_KEY, refreshToken)
|
|
},
|
|
|
|
/** refresh_token 으로 access_token 만 갱신할 때 사용 */
|
|
setAccessToken: (accessToken: string): void => {
|
|
localStorage.setItem(ACCESS_KEY, accessToken)
|
|
},
|
|
|
|
clear: (): void => {
|
|
localStorage.removeItem(ACCESS_KEY)
|
|
localStorage.removeItem(REFRESH_KEY)
|
|
},
|
|
|
|
hasToken: (): boolean => localStorage.getItem(ACCESS_KEY) !== null,
|
|
}
|