본문으로 건너뛰기

토큰 관리하기

인가 코드로 토큰 발급​

issueAccessTokenWithCode()는 iOS와 웹에서 이미 받은 인가 코드를 KakaoLoginToken으로 교환해요. 별도 인가 흐름에서 받은 코드를 처리할 때 사용해요. iOS의 login()은 코드 교환까지 처리해요. 웹의 login()은 인가 화면으로 이동하므로, 리다이렉트로 받은 코드를 별도로 교환해야 해요.

import { issueAccessTokenWithCode } from '@react-native-kakao/user';

const token = await issueAccessTokenWithCode({
code: authorizationCode,
codeVerifier,
redirectUri,
});

codeVerifier는 PKCE(Proof Key for Code Exchange) 인가 요청에서 만든 검증값이에요. 해당 인가 요청에서 PKCE를 사용했다면 같은 값을 전달해요. redirectUri도 인가 요청에 사용한 값과 일치해야 해요. iOS에서 생략하면 초기화한 SDK의 기본 리다이렉트 URI를 사용하고, 웹에서는 반드시 전달해야 해요.

iOS SDK는 발급받은 토큰을 저장해요. 웹은 코어 초기화에 지정한 REST API 키로 토큰을 발급하고, 액세스 토큰을 JavaScript SDK와 라이브러리의 웹 저장소에 저장해요. 리프레시 토큰은 반환값으로만 제공해요. 웹 앱에 클라이언트 시크릿을 설정했다면 web: { clientSecret }도 전달해요. 만료 시각은 Unix 초, 남은 유효 시간은 초, scopes는 권한 ID 배열이에요.

Android의 공개 SDK는 별도 코드 교환 API를 제공하지 않으므로 Package-UnsupportedPlatform 오류를 반환해요. Android에서는 login() 또는 loginWithKakao()로 토큰을 발급받아요. 기존 issueAccessTokenWithCodeWeb()은 웹 전용이며, 토큰을 저장하지 않고 기존 REST 응답 형태를 반환해요.

저장된 토큰 확인​

hasToken()은 Android, iOS, 웹에서 Promise<boolean>을 반환합니다. 현재 플랫폼 SDK에 저장된 토큰이 있는지 확인하며, 카카오의 토큰 정보 API를 호출하거나 토큰을 갱신하지 않습니다. 앱 시작 시나 오프라인 상태에서도 저장된 토큰의 존재 여부를 확인할 수 있습니다.

import { hasToken, isLogined } from '@react-native-kakao/user';

const hasStoredToken = await hasToken();
if (hasStoredToken) {
const isTokenValid = await isLogined();
}

true는 SDK에 토큰이 저장돼 있다는 뜻입니다. 저장된 토큰도 만료됐거나 폐기됐을 수 있으므로, 사용자가 인증됐다고 판단하기 전에 isLogined()로 카카오에 토큰의 유효성을 확인해야 합니다.

반환값은 토큰 존재 여부를 나타내는 불리언이며, 저장된 토큰 자체는 반환하지 않습니다.

토큰 정보 조회​

getAccessToken()은 카카오에 액세스 토큰의 유효성을 확인하고 사용자 ID, 앱 ID, 남은 유효 시간(초)을 반환합니다. 액세스 토큰 문자열은 반환하지 않습니다.

다음과 같이 정의됩니다.

export function getAccessToken(): Promise<KakaoAccessTokenInfo>;

타입은 다음과 같습니다.

export interface KakaoAccessTokenInfo {
id?: number;
appId: number;
expiresIn: number;
}

예시​

getAccessToken();

토큰 갱신​

refreshToken()은 Android와 iOS SDK에 저장된 토큰을 갱신해요. refreshToken({ token })으로 갱신할 토큰을 직접 지정할 수도 있어요. SDK 저장소가 비어 있거나 다른 토큰이 저장돼 있어도, 지정한 토큰의 리프레시 토큰을 사용해요.

import { refreshToken } from '@react-native-kakao/user';

const refreshedStoredToken = await refreshToken();

const refreshedExternalToken = await refreshToken({ token: previousToken });

const refreshedWithoutRequestLogs = await refreshToken({
ios: { loggingEnabled: false },
});

previousToken에는 login()이나 issueAccessTokenWithCode()에서 받은 KakaoLoginToken 객체를 전달해요. 리프레시 토큰이 재발급되지 않을 때 기존 만료 정보를 유지해야 하므로, 토큰 문자열만 전달할 수는 없어요. 액세스 토큰이 만료됐어도 리프레시 토큰이 유효하면 갱신할 수 있어요.

SDK는 갱신에 성공한 토큰을 저장하고 같은 KakaoLoginToken 형태로 반환해요. 만료 시각은 Unix 초, 남은 유효 시간은 각 만료 시각을 기준으로 계산한 초 단위예요.

ios.loggingEnabled의 기본값은 true로, iOS SDK의 기본 로깅 동작을 유지해요. false로 지정하면 해당 갱신 요청의 로그와 응답 본문을 숨기고, SDK 전체 로깅 설정은 바꾸지 않아요. iOS SDK 2.29.0은 응답 본문 대신 response: - 한 줄을 남겨요. 저장된 토큰과 직접 지정한 토큰 모두에 적용할 수 있어요. Android에서는 이 iOS 옵션을 사용하지 않아요.

사용할 리프레시 토큰이 없거나 만료됐다면 카카오 SDK 오류로 거부돼요. 이 경우 login()으로 다시 로그인해요. 웹의 JavaScript SDK는 토큰 갱신 API를 제공하지 않으므로, 토큰 지정 여부와 관계없이 Package-UnsupportedPlatform 오류를 반환해요.