페이지 이동경로
  • 문서>
  • 카카오 로그인>
  • Flutter

카카오 로그인

Flutter

이 문서는 Kakao SDK for Flutter(이하 Flutter SDK)를 사용한 카카오 로그인 구현 방법을 안내합니다.

카카오 로그인 구현에 필요한 로그인 버튼 이미지는 [도구] > [리소스 다운로드]에서 제공합니다. 해당 로그인 버튼은 디자인 가이드를 참고하여 서비스 UI에 적합한 크기로 수정하여 사용할 수 있습니다.

시작하기 전에

패키지 설정

카카오 로그인 API를 사용하려면 설치를 참고하여 pubspec.yaml 파일에 Flutter SDK 전체 또는 카카오 로그인 패키지에 대한 의존성을 추가해야 합니다.

프로젝트 설정

네이티브 앱 서비스에서 카카오 로그인 API를 사용하려면 커스텀 URL 스킴(Custom URL Scheme)을 설정해야 합니다. 아래의 디바이스 환경별 프로젝트 설정 방법을 참고합니다.

구현 방식 선택

구현 방식

Flutter SDK는 다양한 서비스 환경에 대응할 수 있도록 두 가지 구현 방식을 제공합니다. 구현 방식별로 카카오톡 또는 카카오계정을 사용한 로그인이 가능합니다.

API 권장 환경 구현 방식 설명
카카오톡으로 로그인
(권장)
네이티브 앱 서비스 기본 방식:
서비스 클라이언트에서 한 번의 요청으로 인가 코드 및 토큰 발급 모두 완료
카카오톡을 실행해 카카오 로그인
카카오계정으로 로그인 카카오계정 로그인 페이지를 기본 브라우저(Default Browser) 팝업으로 실행해 카카오 로그인
카카오톡으로 로그인: 웹
(권장)
웹 서비스 리다이렉트(Redirect) 방식:
서비스 클라이언트에서 인가 코드 발급 요청, 서비스 서버에서 인가 코드로 토큰 발급 요청
카카오 로그인 과정: 웹 참고
카카오톡을 실행해 카카오 로그인
카카오계정으로 로그인: 웹 서비스 페이지에서 팝업 없이 카카오계정 로그인 페이지로 이동해 카카오 로그인
주의

네이티브 앱 서비스는 리다이렉트 방식을 사용할 수 없습니다.

참고

웹 서비스에서 카카오계정으로 로그인 요청 시 웹 브라우저 또는 웹뷰에서 카카오계정 로그인 팝업이 정상 출력되지 않을 수 있으나, 카카오계정으로 로그인: 웹으로 요청하면 팝업 없이 서비스 페이지에서 카카오계정 로그인 페이지로 이동 가능합니다.

권장 방식

카카오톡 실행이 가능한 환경이라면 카카오톡으로 로그인 또는 카카오톡으로 로그인: 웹 사용을 권장합니다. 카카오톡으로 로그인 시 사용자가 ID와 비밀번호를 입력하는 과정을 거치지 않고 편리하게 로그인할 수 있습니다. isKakaoTalkInstalled()로 카카오톡 실행 가능 여부를 확인할 수 있습니다. 해당 메서드 호출 결과의 의미는 다음과 같습니다.

  • true
    • 모바일 기기의 네이티브 앱에서 요청했고, 카카오톡이 설치돼 있는 경우
    • 모바일 기기의 웹 브라우저(웹뷰)에서 요청한 경우
  • false
    • 모바일 기기의 네이티브 앱에서 요청했고, 카카오톡이 설치돼 있지 않은 경우
    • 모바일 기기가 아닌 경우

카카오계정으로 로그인, 카카오계정으로 로그인: 웹은 카카오톡 미설치 또는 미지원 디바이스, 또는 사용자가 여러 개의 계정을 사용하는 서비스에서 사용하면 편리합니다.

각 인증 방식의 특징과 서비스의 사용자 로그인 동선을 고려하여 어느 인증 방식이 적합한지 판단합니다. 두 가지 인증 방식을 함께 사용할 수도 있습니다. 인증 방식에 따라 필요한 설정이나 예외 처리에 차이가 있으므로, 각 개발 가이드를 참고합니다.

카카오 로그인 과정: 웹

웹 서비스에서 리다이렉트 방식으로 카카오 로그인 구현 시, 서비스 서버에서 REST API 요청을 통해 토큰을 발급받아야 합니다. 아래는 리다이렉트 방식의 카카오톡으로 로그인 과정을 나타낸 시퀀스 다이어그램(Sequence diagram)입니다.

리다이렉트 방식 카카오 로그인 과정 1. 인가 코드 받기
  1. isKakaoTalkInstalled() 메서드로 카카오톡 실행 가능 여부를 확인합니다.
  2. 카카오톡으로 로그인: 웹을 호출해 카카오톡을 실행합니다.
    • 카카오톡이 설치돼 있지 않은 경우, 설치 페이지로 이동합니다.
  3. 카카오톡이 카카오 인증 서버에 동의 화면을 요청합니다.
  4. 카카오 인증 서버가 사용자에게 동의 화면을 출력하여 인가를 위한 사용자 동의를 요청합니다.
    • 동의 화면은 서비스 애플리케이션(이하 앱)의 동의항목 설정에 따라 구성됩니다.
  5. 사용자가 필수 동의항목, 이 외 원하는 동의항목에 동의한 뒤 [동의하고 계속하기] 버튼을 누릅니다.
  6. 카카오 인증 서버는 간편로그인 요청 시 지정된 Redirect URI로 인가 코드를 전달합니다.
2. 토큰 받기
  1. 서비스 서버가 Redirect URI로 전달받은 인가 코드로 토큰 받기를 요청합니다.
  2. 카카오 인증 서버가 토큰을 발급해 서비스 서버에 전달합니다.
3. 사용자 로그인 처리
주의

서비스의 사용자 로그인 처리는 서비스에서 자체 구현해야 합니다. 이 문서는 사용자 로그인 처리 구현 시 참고할 수 있는 정보를 제공합니다.

  • 서비스 서버가 발급받은 액세스 토큰으로 사용자 정보 가져오기를 요청해 사용자의 회원번호 및 정보를 조회하여 서비스 회원인지 확인합니다.
  • 서비스 회원 정보 확인 결과에 따라 서비스 로그인 또는 회원 가입 과정을 진행합니다.
  • 이 외 서비스에서 필요한 로그인 절차를 수행한 후, 카카오 로그인한 사용자의 서비스 로그인 처리를 완료합니다.

커스텀 URL 스킴 설정

배송지 선택하기 API 사용 시, AndroidManifest.xml에 커스텀 URL 스킴 설정이 필요합니다. 아래 예제 참고합니다.

<application>
    <activity
        android:name="com.kakao.sdk.flutter.AppsHandlerActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <!-- 배송지 피커를 위한 설정 -->
            <data android:scheme="kakao${YOUR_NATIVE_APP_KEY}" />
            <data android:host="address" />
        </intent-filter>
    </activity>
</application>

카카오 로그인

카카오톡으로 로그인

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
Redirect URI 등록(Web 플랫폼 사용 시 필수)
동의항목
OpenID Connect 활성화(선택)
간편가입(선택)
필요 필요:
필수 동의항목
isKakaoTalkInstalled()
loginWithKakaoTalk()
KakaoException

사용자에게 카카오톡 앱을 통한 로그인을 요청합니다. UserApiloginWithKakaoTalk()을 호출합니다. await 키워드를 사용하여 사용자의 로그인 과정이 완료되기를 기다린 다음 서비스 로직을 수행하도록 할 수 있습니다.

loginWithKakaoTalk()이 호출되면 Flutter SDK가 카카오톡을 실행하고 사용자에게 앱 이용 관련 동의를 구하는 동의 화면을 출력합니다.

동의 화면에서 사용자가 모든 필수 항목에 동의하고 [동의하고 계속하기]를 선택하면 인가 코드가 발급되고, Flutter SDK가 인가 코드로 토큰을 발급받아 로그인을 완료합니다. OpenID Connect를 사용하는 앱인 경우, ID 토큰을 함께 발급받습니다.

발급된 토큰은 Flutter SDK가 TokenManager를 통해 내부적으로 관리하며, 로그인이 필요한 카카오 API 호출 시 사용합니다.

사용자가 동의 화면에서 로그인을 취소하거나, 다른 에러가 발생한 경우에는 레퍼런스를 참고하여 각각 예외 처리합니다. 카카오 로그인 구현 예제를 참고합니다.

try {
  OAuthToken token = await UserApi.instance.loginWithKakaoTalk();
  print('카카오톡으로 로그인 성공 ${token.accessToken}');
} catch (error) {
  print('카카오톡으로 로그인 실패 $error');
}

카카오계정으로 로그인

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
Redirect URI 등록(Web 플랫폼 사용 시 필수)
동의항목
OpenID Connect 활성화(선택)
간편가입(선택)
필요 필요:
필수 동의항목
loginWithKakaoAccount()
KakaoException

사용자에게 카카오계정 정보 입력을 통한 로그인을 요청합니다. UserApiloginWithKakaoAccount()를 호출합니다.

loginWithKakaoAccount()가 호출되면 Flutter SDK가 기본 브라우저를 사용해 카카오계정 로그인 페이지를 팝업으로 엽니다. 해당 페이지에서 사용자가 ID와 비밀번호를 입력해 카카오계정으로 로그인하면 앱 이용 관련 동의를 구하는 동의 화면이 출력됩니다.

동의 화면에서 사용자가 모든 필수 항목에 동의하고 [동의하고 계속하기]를 선택하면 인가 코드가 발급되고, Flutter SDK가 인가 코드로 토큰을 발급받아 로그인을 완료합니다. OpenID Connect를 사용하는 앱인 경우, ID 토큰을 함께 발급받습니다.

발급된 토큰은 Flutter SDK가 TokenManager를 통해 내부적으로 관리하며, 로그인이 필요한 카카오 API 호출 시 사용합니다.

사용자가 동의 화면에서 로그인을 취소하거나, 다른 에러가 발생한 경우에는 레퍼런스를 참고하여 각각 예외 처리합니다. 카카오 로그인 구현 예제를 참고합니다.

try {
  OAuthToken token = await UserApi.instance.loginWithKakaoAccount();
  print('카카오계정으로 로그인 성공 ${token.accessToken}');
} catch (error) {
  print('카카오계정으로 로그인 실패 $error');
}

카카오톡으로 로그인: 웹

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
Redirect URI 등록(Web 플랫폼 사용 시 필수)
동의항목
OpenID Connect 활성화(선택)
간편가입(선택)
필요 필요:
필수 동의항목
isKakaoTalkInstalled()
authorizeWithTalk()
KakaoException

AuthCodeClientauthorizeWithTalk()을 호출합니다. Flutter SDK가 카카오톡을 실행하고 사용자에게 앱 이용 관련 동의를 구하는 동의 화면을 출력합니다.

동의 화면에서 사용자가 모든 필수 항목에 동의하고 [동의하고 계속하기]를 선택하면 Redirect URI로 인가 코드가 전달됩니다. 발급받은 인가 코드로 서비스 서버에서 토큰 받기를 요청해야 카카오 로그인을 완료할 수 있습니다. 카카오 로그인 과정: 웹을 참고합니다.

try {
  await AuthCodeClient.instance.authorizeWithTalk(
    redirectUri: '${REDIRECT_URI}',
  );
} catch (error) {
  print('카카오톡으로 로그인 실패 $error');
}

카카오계정으로 로그인: 웹

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
Redirect URI 등록(Web 플랫폼 사용 시 필수)
동의항목
OpenID Connect 활성화(선택)
간편가입(선택)
필요 필요:
필수 동의항목
authorize()
KakaoException

AuthCodeClientauthorize()를 호출합니다. Flutter SDK를 통해 카카오계정 로그인 페이지로 이동합니다. 해당 페이지에서 사용자가 ID와 비밀번호를 입력해 카카오계정으로 로그인하면 앱 이용 관련 동의를 구하는 동의 화면이 출력됩니다.

동의 화면에서 사용자가 모든 필수 항목에 동의하고 [동의하고 계속하기]를 선택하면 Redirect URI로 인가 코드가 전달됩니다. 발급받은 인가 코드로 서비스 서버에서 토큰 받기를 요청해야 카카오 로그인을 완료할 수 있습니다. 카카오 로그인 과정: 웹을 참고합니다.

try {
  await AuthCodeClient.instance.authorize(
    redirectUri: '${REDIRECT_URI}',
  );
} catch (error) {
  print('카카오계정으로 로그인 실패 $error');
}

토큰 받기

카카오톡으로 로그인: 웹 또는 카카오계정으로 로그인: 웹으로 카카오 로그인 요청 시, 서비스 서버에서 인가 코드를 사용해 REST API로 토큰 받기를 요청하여 토큰을 발급받아야 합니다.

  • 토큰은 액세스 토큰(Access token), 리프레시 토큰(Refresh token), ID 토큰(ID token) 세 종류입니다.

서비스 서버에서 토큰을 발급받은 후, 서비스 서버에서 액세스 토큰으로 사용자 정보 가져오기를 호출해 회원 가입 및 로그인에 필요한 사용자 정보를 요청할 수 있습니다. 액세스 토큰을 서비스 클라이언트로 전달해 토큰 할당하면, 서비스 클라이언트에서 Flutter SDK를 통한 카카오 API 요청에 사용할 수 있습니다.

주의: 앱 키

서비스 서버에서 REST API로 토큰 받기사용자 정보 가져오기 등 API를 요청할 때는 REST API 키를 사용해야 합니다.

토큰 할당하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
필요 - setToken()
OAuthToken

클라이언트에서 Flutter SDK를 통해 카카오 API를 호출할 수 있도록 서비스 서버로부터 전달받은 토큰을 토큰매니저에 할당합니다. 토큰 할당은 웹 서비스에서 카카오톡으로 로그인: 웹 또는 카카오계정으로 로그인: 웹으로 카카오 로그인을 요청한 경우에만 필요합니다. TokenManagerProvidersetToken() 메서드를 호출합니다. 아래 예제를 참고합니다.

// 서비스 서버가 전달한 response 데이터에서 토큰 획득 후 Flutter SDK에서 사용하는 타입으로 변환
var tokenResponse = AccessTokenResponse.fromJson(response);
var token = OAuthToken.fromResponse(tokenResponse);

// 토큰 저장
TokenManagerProvider.instance.manager.setToken(token);

카카오 로그인 구현 예제

Flutter SDK로 카카오 로그인 구현 시, 다음 두 가지 조건을 확인하는 로직을 포함할 것을 권장합니다.

  1. 기존 로그인을 통해 발급받은 토큰이 있는지 확인
    • 이미 로그인하여 유효한 토큰을 갖고 있는 사용자는 다시 로그인하지 않도록 함
    • 기존 토큰이 있는 경우에도 만료되었을 수 있으므로 유효성 확인 필요
  2. isKakaoTalkInstalled() 메서드로 카카오톡 실행 가능 여부 확인
    • 카카오톡 실행 가능 환경에서는 ID, 비밀번호 입력 없이 간편하게 로그인할 수 있도록 함
    • 카카오톡에 연결(로그인)된 카카오계정이 없는 경우, 카카오계정으로 로그인 가능하도록 함

아래는 구현 방식별 카카오 로그인 구현 예제입니다.

기본 방식
리다이렉트 방식
// 카카오 로그인 구현 예제

// 카카오톡 실행 가능 여부 확인
// 카카오톡 실행이 가능하면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
if (await isKakaoTalkInstalled()) {
  try {
      await UserApi.instance.loginWithKakaoTalk();
      print('카카오톡으로 로그인 성공');
  } catch (error) {
    print('카카오톡으로 로그인 실패 $error');

    // 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
    // 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
    if (error is PlatformException && error.code == 'CANCELED') {
        return;
    }
    // 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인
    try {
        await UserApi.instance.loginWithKakaoAccount();
        print('카카오계정으로 로그인 성공');
    } catch (error) {
        print('카카오계정으로 로그인 실패 $error');
    }
  }
} else {
  try {
    await UserApi.instance.loginWithKakaoAccount();
    print('카카오계정으로 로그인 성공');
  } catch (error) {
    print('카카오계정으로 로그인 실패 $error');
  }
}
bool talkInstalled = await isKakaoTalkInstalled();

// 카카오톡 실행 가능 여부 확인
// 카카오톡 실행이 가능하면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
if (talkInstalled) {
  // 카카오톡으로 로그인
  try {
    await AuthCodeClient.instance.authorizeWithTalk(
      redirectUri: '${REDIRECT_URI}',
    );
  } catch (error) {
    print('Login with Kakao Talk fails $error');
  }
} else {
  // 카카오계정으로 로그인
  try {
    await AuthCodeClient.instance.authorize(
      redirectUri: '${REDIRECT_URI}',
    );
  } catch (error) {
    print('Login with Kakao Account fails. $error');
  }
}

추가 기능

카카오 로그인 요청 시 사용할 수 있는 추가 기능은 다음과 같습니다.

추가 항목 동의 받기
자동 추가 동의 요청

Flutter SDK는 API 요청 시 사용자 동의가 필요한 경우, 자동으로 필요한 동의항목의 동의 화면을 호출해 사용자에게 동의 요청합니다. 단, 자동으로 동의 화면을 호출하거나 토큰을 갱신할 수 없는 웹 환경이거나, API 호출 전 추가 동의를 받으려면 직접 추가 항목 동의 받기를 요청해야 합니다.

추가 항목 동의 받기는 사용자가 동의하지 않은 동의항목에 대한 추가 동의를 요청할 때 사용하는 추가 기능입니다. 카카오 로그인 구현 방식에 따라 다음 메서드 중 하나를 사용합니다.

  • 네이티브 앱 서비스: UserApiloginWithNewScopes() 호출
  • 웹 서비스: AuthCodeClientauthorizeWithNewScopes() 호출

필수 파라미터로 사용자에게 동의를 요청할 동의항목의 키를 문자열 리스트(List<String>)에 담아 전달해야 합니다. authorizeWithNewScopes() 사용 시, 토큰 받기를 요청해 카카오 로그인을 재완료해야 합니다. 아래 예제를 참고합니다.

loginWithNewScopes()
authorizeWithNewScopes()
User user;
  try {
    user = await UserApi.instance.me();
  } catch (error) {
    print('사용자 정보 요청 실패 $error');
    return;
  }

  // 사용자의 추가 동의가 필요한 사용자 정보 동의항목 확인
  List<String> scopes = [];

  if (user.kakaoAccount?.emailNeedsAgreement == true) {
    scopes.add('account_email');
  }
  if (user.kakaoAccount?.birthdayNeedsAgreement == true) {
    scopes.add("birthday");
  }
  if (user.kakaoAccount?.birthyearNeedsAgreement == true) {
    scopes.add("birthyear");
  }
  if (user.kakaoAccount?.ciNeedsAgreement == true) {
    scopes.add("account_ci");
  }
  if (user.kakaoAccount?.phoneNumberNeedsAgreement == true) {
    scopes.add("phone_number");
  }
  if (user.kakaoAccount?.profileNeedsAgreement == true) {
    scopes.add("profile");
  }
  if (user.kakaoAccount?.ageRangeNeedsAgreement == true) {
    scopes.add("age_range");
  }

  if (scopes.length > 0) {
    print('사용자에게 추가 동의 받아야 하는 항목이 있습니다');

    // OpenID Connect 사용 시
    // scope 목록에 "openid" 문자열을 추가하고 요청해야 함
    // 해당 문자열을 포함하지 않은 경우, ID 토큰이 재발급되지 않음
    // scopes.add("openid")

    // scope 목록을 전달하여 추가 항목 동의 받기 요청
    // 지정된 동의항목에 대한 동의 화면을 거쳐 다시 카카오 로그인 수행
    OAuthToken token;
    try {
      token = await UserApi.instance.loginWithNewScopes(scopes);
      print('현재 사용자가 동의한 동의항목: ${token.scopes}');
    } catch (error) {
      print('추가 동의 요청 실패 $error');
      return;
    }

    // 사용자 정보 재요청
    try {
      User user = await UserApi.instance.me();
      print('사용자 정보 요청 성공'
          '\n회원번호: ${user.id}'
          '\n닉네임: ${user.kakaoAccount?.profile?.nickname}'
          '\n이메일: ${user.kakaoAccount?.email}');
    } catch (error) {
      print('사용자 정보 요청 실패 $error');
    }
  }
// 이메일, 성별 추가 항목 동의 받기
try {
  await AuthCodeClient.instance.authorizeWithNewScopes(
    scopes: [account_email, gender],
    redirectUri: '${REDIRECT_URI}',
  );
} catch (error) {
  print('추가 항목 동의 받기 실패 $error');
}
주의: OpenID Connect

OpenID Connect를 사용하는 앱의 경우, 추가 항목 동의 받기 요청 시 동의항목 키를 전달하는 scope 파라미터 값에 openid를 반드시 포함해야 합니다. 해당 파라미터 값을 포함하지 않을 경우, ID 토큰이 재발급되지 않습니다. (참고: scope 파라미터)


서비스 약관 선택해 동의 받기
카카오싱크 전용

카카오싱크를 도입한 서비스만 사용할 수 있는 기능입니다.

서비스 약관 선택해 동의 받기는 카카오 로그인 동의 화면에 포함할 서비스 약관을 지정하는 추가 기능입니다. 사용자의 서비스 가입 시나리오에 따라 앱에 등록된 서비스 약관 중 특정 서비스 약관을 지정해 동의받고자 할 때 사용합니다. 인가 코드 받기 요청 시 serviceTerms 파라미터로 동의 화면에 포함할 서비스 약관 태그 목록을 지정합니다. 요청 시 [필수 동의]로 설정된 서비스 약관을 하나 이상 포함해야 동의 화면을 출력하고 사용자에게 동의받을 수 있습니다.

// 동의받을 서비스 약관 태그 목록
List<String> serviceTerms = ['${SERVICE_TERM_TAG_1}','${SERVICE_TERM_TAG_2}'];

try {
  OAuthToken token = await UserApi.instance
      .loginWithKakaoTalk(serviceTerms: serviceTerms);
  print('로그인 성공 ${token.accessToken}');
} catch (error) {
  print('로그인 실패 $error');
}

OpenID Connect ID 토큰 발급하기

OpenID Connect 사용 서비스인 경우, OpenID Connect 활성화 설정이 되어 있다면 별도 파라미터 없이도 ID 토큰을 함께 발급받을 수 있습니다. OpenID Connect 사용 시 ID 토큰 재생 공격을 방지하기 위해 nonce 파라미터 사용을 권장합니다. 단, 추가 항목 동의 받기 요청 시에는 scope 파라미터에 openid를 포함해야 ID 토큰 재발급이 가능합니다. (참고: scope 파라미터)

기존 로그인 여부와 상관없이 로그인하기

보안을 위해 기존의 로그인 여부와 상관없이 사용자에게 재인증을 요청할 수 있습니다. prompts 파라미터의 값에 Prompt.login를 추가하여 카카오 로그인을 요청합니다. 이 요청은 사용자가 해당 디바이스의 동일한 웹 브라우저에서 이미 카카오계정으로 로그인한 상태라도 로그인 페이지를 출력합니다.

try {
  OAuthToken token = await UserApi.instance
      .loginWithKakaoAccount(prompts: [Prompt.login]);
  print('로그인 성공 ${token.accessToken}');
} catch (error) {
  print('로그인 실패 $error');
}

카카오계정 가입 후 로그인하기

사용자에게 카카오계정 신규 가입 후 로그인하도록 하기 위해 사용하는 추가 기능입니다. 이 기능을 사용하면 카카오계정 가입 페이지로 이동 후, 카카오계정 가입 완료 후에 동의 화면을 출력합니다. prompts 파라미터의 값에 Prompt.create를 추가하여 카카오 로그인을 요청합니다.

try {
  OAuthToken token = await UserApi.instance
      .loginWithKakaoAccount(prompts: [Prompt.create]);
  print('로그인 성공 ${token.accessToken}');
} catch (error) {
  print('로그인 실패 $error');
}

로그인 힌트 주기

로그인 힌트 주기를 요청하려면 loginHint 파라미터로 ID란에 자동 입력할 문자열 값을 전달합니다. 자동 입력할 값으로는 카카오계정 로그인 시 이메일, 전화번호, 카카오메일 ID 중 하나를 사용할 수 있습니다.

전달된 문자열은 카카오계정 로그인 페이지의 ID 자동 입력용으로만 사용되며, 전달된 값에 해당되는 카카오계정이 존재하는지는 확인하지 않습니다. 단, 기본 브라우저에 이미 로그인된 카카오계정이 있을 경우에는 동작이 달라질 수 있으므로 로그인 힌트 주기 상세 동작 과정을 참고합니다.

// 카카오계정으로 로그인
List<String> loginHint = '${LOGIN_HINT}';

try {
  OAuthToken token = await UserApi.instance
      .loginWithKakaoAccount(loginHint: loginHint);
  print('로그인 성공 ${token.accessToken}');
} catch (error) {
  print('로그인 실패 $error');
}

카카오계정 간편로그인

카카오계정 간편로그인을 사용하려면 prompts 파라미터의 값을 Prompt.select_account로 지정해 카카오 로그인을 요청합니다.

try {
  OAuthToken token = await UserApi.instance
      .loginWithKakaoAccount(prompts: [Prompt.select_account]);
  print('로그인 성공 ${token.accessToken}');
} catch (error) {
  print('로그인 실패 $error');
}

토큰 존재 여부 확인하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
필요 - hasToken()

Flutter SDK에 기존에 발급받아 저장된 토큰이 있는지 확인합니다. AuthApihasToken()을 호출합니다.

hasToken()을 통해 앱 실행, 또는 카카오 로그인이 필요한 API를 호출하기 전 기존 토큰 존재 여부를 확인할 수 있습니다. 호출 결과가 true라면 기존에 발급받은 액세스 토큰 또는 리프레시 토큰이 존재하는 상태이고, false라면 토큰이 없는 상태입니다.

if (await AuthApi.instance.hasToken()) {
  try {
    AccessTokenInfo tokenInfo =
        await UserApi.instance.accessTokenInfo();
    print('토큰 유효성 체크 성공 ${tokenInfo.id} ${tokenInfo.expiresIn}');
  } catch (error) {
    if (error is KakaoException && error.isInvalidTokenError()) {
      print('토큰 만료 $error');
    } else {
      print('토큰 정보 조회 실패 $error');
    }

    try {
      // 카카오계정으로 로그인
      OAuthToken token = await UserApi.instance.loginWithKakaoAccount();
      print('로그인 성공 ${token.accessToken}');
    } catch (error) {
      print('로그인 실패 $error');
    }
  }
} else {
  print('발급된 토큰 없음');
  try {
    OAuthToken token = await UserApi.instance.loginWithKakaoAccount();
    print('로그인 성공 ${token.accessToken}');
  } catch (error) {
    print('로그인 실패 $error');
  }
}

결과가 true인 경우에도 토큰 정보 보기를 호출해 토큰이 유효한지 확인해야 합니다. 토큰이 유효하지 않다면 다시 카카오 로그인을 통해 새로운 토큰을 발급받아야 합니다.

  • 요청 성공, 액세스 토큰 정보 반환
    • 액세스 토큰이 유효한 상태이므로 사용자 로그인 불필요
    • 해당 액세스 토큰으로 카카오 API 호출 가능
  • 에러 발생
    • 액세스 토큰 및 리프레시 토큰이 유효하지 않아 사용자 로그인 필요
    • 각 에러에 맞는 처리 필요, 문제 해결 및 레퍼런스 참고

토큰 정보 보기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
필요 - accessTokenInfo()
AccessTokenInfo

현재 Flutter SDK에 저장 중인 액세스 토큰의 정보를 조회합니다. UserApiaccessTokenInfo()를 호출합니다.

요청 성공 시, 앱 ID, 회원번호, 남은 유효시간(단위: 초) 정보를 담은 AccessTokenInfo 객체가 반환됩니다. 액세스 토큰이 만료되었거나 존재하지 않는 경우에는 에러를 반환하므로, 기존 액세스 토큰의 만료 여부를 확인하는 용도로도 사용할 수 있습니다.

try {
  AccessTokenInfo tokenInfo = await UserApi.instance.accessTokenInfo();
  print('토큰 정보 보기 성공'
        '\n회원정보: ${tokenInfo.id}'
        '\n만료시간: ${tokenInfo.expiresIn} 초');
} catch (error) {
  print('토큰 정보 보기 실패 $error');
}

로그아웃

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
필요 - logout()

Flutter SDK에 저장된 토큰을 삭제하여 사용자를 로그아웃 처리합니다. UserApilogout()을 호출합니다.

요청 성공 시, 로그아웃 처리된 사용자의 회원번호를 받습니다. 로그아웃은 성공 여부와 관계없이 Flutter SDK에 저장된 토큰을 삭제하는 점에 유의합니다. 토큰 삭제 시, 더 이상 해당 토큰 값을 사용해 카카오 API를 호출할 수 없습니다.

try {
  await UserApi.instance.logout();
  print('로그아웃 성공, SDK에서 토큰 삭제');
} catch (error) {
  print('로그아웃 실패, SDK에서 토큰 삭제 $error');
}

연결 끊기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
필요 - unlink()
UserIdResponse

앱과 사용자의 연결 상태를 해제합니다. UserApiunlink()를 호출합니다.

요청 성공 시, 앱과 연결이 해제된 사용자의 회원번호를 포함한 UserIdResponse 객체가 반환됩니다. 또한 로그아웃 처리가 함께 이뤄져 Flutter SDK에 저장된 토큰이 삭제됩니다.

try {
  await UserApi.instance.unlink();
  print('연결 끊기 성공, SDK에서 토큰 삭제');
} catch (error) {
  print('연결 끊기 실패 $error');
}

연결 끊기를 직접 호출한 경우가 아닌, 사용자가 서비스와의 연결을 직접 끊었을 때 알림을 받으려면 연결 끊기 알림을 사용합니다.

사용자 정보 가져오기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
동의항목
필요 필요:
사용자 정보를 요청할 모든 동의항목
me()
User

현재 로그인한 사용자의 정보를 불러옵니다. UserApime()를 호출합니다.

요청 성공 시, 사용자 정보가 담긴 User 객체가 반환됩니다. 사용자 정보에서 제공 가능한 사용자 정보의 종류를 확인할 수 있습니다. 다음과 같은 경우에는 사용자 정보의 값이 존재하지 않을 수 있으므로 유의합니다.

  • 동의항목 미설정
  • 사용자 미동의
  • 사용자가 카카오에 제공하지 않은 정보
try {
  User user = await UserApi.instance.me();
  print('사용자 정보 요청 성공'
        '\n회원번호: ${user.id}'
        '\n닉네임: ${user.kakaoAccount?.profile?.nickname}'
        '\n이메일: ${user.kakaoAccount?.email}');
} catch (error) {
  print('사용자 정보 요청 실패 $error');
}

사용자 정보 저장하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
사용자 프로퍼티
필요 - updateProfile()
User.properties

사용자 프로퍼티 값을 저장합니다. UserApiupdateProfile()을 호출합니다.

요청 시 저장할 사용자 프로퍼티의 키와 값을 Map 형식으로 전달해야 합니다. 요청 성공 시 반환 값은 없으며, 사용자 정보 가져오기를 통해 properties에 저장된 사용자 프로퍼티를 확인할 수 있습니다.

try {
  // 저장할 사용자 프로퍼티
  Map<String, String> properties = {'${CUSTOM_PROPERTY_KEY}': '${CUSTOM_PROPERTY_VALUE}'};
  await UserApi.instance.updateProfile(properties);
  print('사용자 정보 저장 성공');
} catch (error) {
  print('사용자 정보 저장 실패 $error');
}

배송지

배송지 선택하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
필요: 동의항목 플랫폼 등록
카카오 로그인 활성화
동의항목
필요 필요:
배송지 정보(shipping_address)
selectShippingAddresses()
UserShippingAddresses
주의

이 기능을 사용하려면 커스텀 URL 스킴 설정을 완료해야 합니다.


사용자가 서비스에 제공할 배송지를 직접 선택할 수 있는 배송지 피커를 불러오고, 선택된 배송지의 ID를 제공합니다.

UserApiselectShippingAddresses()를 호출합니다. 이 API는 서비스에 사용자 카카오계정의 전체 배송지 정보를 제공하지 않으며, 사용자가 선택한 특정 배송지의 ID인 addressId를 반환합니다. addressId를 사용해 배송지 가져오기 API를 요청하면 해당 배송지의 정보를 제공받을 수 있습니다.

try {
  final addressId = await UserApi.instance.selectShippingAddresses();
  final userShippingAddresses = await UserApi.instance.shippingAddresses(addressId: addressId);

  Log.i(context, tag,
      '배송지 조회 성공\n회원번호: ${userShippingAddresses.userId}\n배송지: ${userShippingAddresses.shippingAddresses?.join('\n')}');
} catch(e) {
  Log.e(context, tag, '배송지 조회 실패 $e');
}

에러 발생 시 문제 해결에서 원인을 확인합니다.

배송지 가져오기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
필요: 동의항목 플랫폼 등록
카카오 로그인 활성화
동의항목
필요 필요:
배송지 정보(shipping_address)
shippingAddresses()
UserShippingAddresses

배송지 ID에 해당하는 특정 배송지 또는 전체 배송지 목록을 제공합니다.

UserApishippingAddresses()를 호출합니다. 필요에 따라 다음 파라미터를 사용할 수 있습니다.

이름 타입 설명 필수
addressId int 배송지 ID
특정 배송지 정보만 요청할 때 사용
fromUpdatedAt, pageSize와 함께 사용할 수 없음
X
fromUpdatedAt DateTime 여러 페이지에 걸쳐 응답이 제공될 때, 기준이 되는 배송지 updatedAt 시각
해당 시각(미포함) 이전에 수정된 배송지부터 조회
이전 페이지의 마지막 배송지 updatedAt을 다음 페이지 요청 시 사용
X
pageSize int 2 이상, 한 페이지에 포함할 배송지 개수
(기본값: 10)
X

배송지 선택하기 API를 사용하지 않는 경우, 사용자가 [배송지 정보] 동의항목에 동의하지 않아 배송지를 제공받을 수 없는 경우가 발생할 수 있습니다. 아래는 사용자가 배송지 정보 제공에 동의했는지 확인한 후, 사용자가 동의한 경우 배송지 정보를 요청하는 예제입니다. 배송지 가져오기 응답에 배송지가 포함되지 않은 경우를 참고합니다.

// 배송지 가져오기
UserShippingAddresses userShippingAddress;
try {
  userShippingAddress = await UserApi.instance.shippingAddresses();
} catch (error) {
  print('배송지 조회 실패 $error');
  return;
}

// 사용자의 배송지 정보 동의항목 동의 여부에 따라 응답 처리
if (userShippingAddress.shippingAddresses != null) {
  print('배송지 조회 성공'
        '\n회원번호: ${userShippingAddress.userId}'
        '\n배송지: \n${userShippingAddress.shippingAddresses?.join('\n')}');
} else if (userShippingAddress.needsAgreement == false) {
  print('사용자 카카오계정에 배송지 정보 없음'
        '배송지 정보가 꼭 필요하다면 동의항목 설정에서 수집 후 제공 기능을 활성화 해 보세요.');
} else if (userShippingAddress.needsAgreement == true) {
  print('사용자에게 배송지 제공 동의를 받아야 합니다');

  // 배송지 동의항목의 ID
  List<String> scopes = ['shipping_address'];

  // 사용자에게 배송지 정보 제공을 위한 동의 요청
  OAuthToken token;
  try {
    token = await UserApi.instance.loginWithNewScopes(scopes);
    print('사용자가 동의한 동의항목: ${token.scopes}');
  } catch (error) {
    print('배송지 정보 동의 요청 실패 $error');
  }

  // 사용자 동의 후 다시 배송지 정보 가져오기
  try {
    UserShippingAddresses userShippingAddresses =
        await UserApi.instance.shippingAddresses();
    print('배송지 조회 성공'
          '\n회원번호: ${userShippingAddresses.userId}'
          '\n${userShippingAddresses.shippingAddresses?.join('\n')}');
  } catch (error) {
    print('배송지 조회 실패 $error');
  }
}

요청 성공 시 사용자 회원번호와 배송지 정보를 담은 UserShippingAddresses 객체를 받습니다. UserShippingAddresses는 각각의 배송지 정보를 담은 ShippingAddress 객체의 리스트(List)를 포함합니다.

에러 발생 시 문제 해결에서 원인을 확인합니다.

동의 내역 확인하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
동의항목
필요 - scopes()
ScopeInfo

사용자가 동의한 동의항목의 상세 정보 목록을 조회합니다. UserApiscopes()를 호출합니다.

요청 성공 시 [내 애플리케이션] > [카카오 로그인] > [동의항목]에 설정된 동의항목의 목록, 사용자가 동의한 동의항목의 상세 정보가 담긴 ScopeInfo 객체가 반환됩니다. 사용자가 기존에 동의했던 동의항목이라면 현재 앱에 사용하도록 설정돼 있지 않아도 응답에 포함됩니다.

try {
  ScopeInfo scopeInfo = await UserApi.instance.scopes();
  print('동의 정보 확인 성공'
        '\n현재 사용자가 동의한 항목: ${scopeInfo.scopes}');
} catch (error) {
  print('동의 내역 확인 실패 $error');
}

특정 동의항목의 사용자 동의 여부를 확인하려면 scopes() 호출 시 scope 파라미터에 해당 동의항목의 키를 포함한 문자열 리스트(List<String>)를 전달합니다. 아래 예제를 참고합니다.

List<String> scopes = ['account_email', 'friends'];
try {
  ScopeInfo scopeInfo = await UserApi.instance.scopes(scopes: scopes);
  print('동의 정보 확인 성공'
        '\n현재 사용자가 동의한 항목: ${scopeInfo.scopes}');
} catch (error) {
  print('동의 내역 확인 실패 $error');
}

동의 철회하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
- 플랫폼 등록
카카오 로그인 활성화
동의항목
필요 - revokeScopes()
ScopeInfo

사용자가 동의한 항목에 대해 동의를 철회합니다. 동의 내역 확인하기를 통해 조회한 동의항목 정보 중 동의 철회 가능 여부(revocable) 값이 true인 동의항목만 철회 가능합니다. 동의 철회가 불가능한 동의항목을 대상으로 요청한 경우 에러 응답을 받습니다.

UserApirevokeScopes()를 호출합니다. 요청 시 scopes 파라미터로 동의를 철회할 동의항목의 키를 문자열 리스트(List<String>)를 전달해야 합니다.

요청 성공 시 [내 애플리케이션] > [카카오 로그인] > [동의항목]에 설정된 동의항목의 목록, 동의 철회 반영 후 사용자가 동의한 동의항목의 상세 정보가 담긴 ScopeInfo 객체가 반환됩니다.

List<String> scopes = ['account_email', 'friends'];
try {
  ScopeInfo scopeInfo =
      await UserApi.instance.revokeScopes(scopes: scopes);
  print('동의 철회 성공'
        '\n현재 사용자가 동의한 항목 ${scopeInfo.scopes}');
} catch (error) {
  print('동의 철회 실패 $error');
}

서비스 약관 동의 내역 확인하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
필요: 카카오싱크 플랫폼 등록
카카오 로그인 활성화
동의항목
간편가입
필요 - serviceTerms()
ServiceTerms
UserServiceTerms

카카오싱크 전용

카카오싱크를 도입한 서비스만 사용할 수 있는 기능입니다.

사용자가 어떤 서비스 약관에 동의하고 로그인했는지 확인합니다.

UserApiserviceTerms()를 호출합니다. 필요에 따라 다음 파라미터를 사용할 수 있습니다.

이름 타입 설명 필수
result String 조회할 서비스 약관 목록, 다음 중 하나
agreed_service_terms: 사용자가 동의한 서비스 약관 목록(기본값)
app_service_terms: 앱에 사용 설정된 서비스 약관 목록
X
tags List<String> 조회할 서비스 약관 태그 목록, result로 지정한 목록 내 서비스 약관으로 한정 X
try {
  UserServiceTerms userServiceTerms =
      await UserApi.instance.serviceTerms();
  Log.i(context, tag,
      '서비스 약관 동의 내역 확인하기 성공\n회원정보: ${userServiceTerms.id}\n동의한 서비스 약관: \n${userServiceTerms.serviceTerms?.join('\n')}');
} catch (e) {
  Log.e(context, tag, '서비스 약관 동의 내역 확인하기 실패', e);
}

요청 성공 시 응답은 UserServiceTerms 객체로 받습니다. UserServiceTerms는 사용자 회원번호와 서비스 약관 목록인 serviceTerms를 포함합니다. serviceTerms는 각 서비스 약관의 태그(Tag), 필수 동의 여부, 사용자 동의 여부, 사용자 동의 시간을 제공하는 ServiceTerms 객체의 리스트(List)입니다.

서비스 약관 동의 철회하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
필요: 카카오싱크 플랫폼 등록
카카오 로그인 활성화
동의항목
간편가입
필요 - revokeServiceTerms()
RevokedServiceTerms
UserRevokedServiceTerms

카카오싱크 전용

카카오싱크를 도입한 서비스만 사용할 수 있는 기능입니다.

사용자가 동의한 서비스 약관의 동의를 철회합니다. 사용자 약관 동의 내역 확인하기 응답의 동의 철회 가능 여부(revocable) 값이 true인 서비스 약관만 철회 가능합니다.

UserApirevokeServiceTerms()를 호출합니다. tags 파라미터에 동의 철회할 서비스 약관의 태그(Tag)를 문자열 리스트(List<Strings>)로 전달해야 합니다.

try {
  UserRevokedServiceTerms userRevokedServiceTerms =
      await UserApi.instance.revokeServiceTerms(tags: ['test_tag1', 'test_tag2']);
  Log.i(context, tag,
      '서비스 약관 철회하기 성공\n회원정보: ${userRevokedServiceTerms.id}\n동의 철회한 서비스 약관: \n${userRevokedServiceTerms.revokedServiceTerms?.join('\n')}');
} catch (e) {
  Log.e(context, tag, '서비스 약관 동의 철회하기 실패', e);
}

요청 성공 시 응답은 UserRevokedServiceTerms 객체로 받습니다. UserRevokedServiceTerms는 사용자 회원번호와 동의 철회에 성공한 서비스 약관 목록인 revokedServiceTerms를 포함합니다. revokedServiceTerms는 각 서비스 약관의 태그(Tag)와 동의 철회 후 서비스 약관의 동의 상태를 제공하는 RevokedServiceTerms 객체의 리스트(List)입니다.

고급: 연결하기

기본 정보
권한 사전 설정 카카오 로그인 사용자 동의 레퍼런스
필요:
수동 연결 설정 권한
플랫폼 등록
카카오 로그인 활성화
필요 - signup()

주의: 자동 연결 사용 여부 확인

연결하기는 자동 연결을 사용하지 않는 앱에서만 사용하는 API입니다. 사용 전 REST API 개발 가이드를 통해 사용 여부와 주의사항을 확인해야 합니다.

자동 연결을 [사용 안함]으로 설정한 앱에서 앱과 사용자를 수동으로 연결할 때 사용합니다. UserApisignup()을 호출합니다.

현재 로그인한 사용자가 연결하기 API를 통해 앱과 연결되어야 하는지 확인하려면 사용자 정보 가져오기 응답의 hasSignedUp 값을 확인하여 다음과 같이 처리합니다.

  • true: 이미 사용자와 앱이 연결되어 있으므로 다시 연결하기를 호출하지 않습니다.
  • false: 사용자와 앱이 연결되지 않은 상태이므로 signup()을 호출해 사용자와 앱을 연결해야 합니다.
  • null: 자동 연결을 사용 중인 앱이므로 연결하기가 불필요합니다.

요청 성공 시, 앱과 사용자 카카오계정의 연결 상태가 연결 대기에서 연결로 변경됩니다. 반환되는 값은 없습니다.

try {
  await UserApi.instance.signup();
  print('연결 성공');
} catch (error) {
  print('연결 실패 $error');
}

더 보기