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

카카오 로그인

Legacy Android

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

애플리케이션 설정 확인

이 기능을 사용하려면 카카오디벨로퍼스(Kakao Developers, 이하 개발자 웹사이트) 애플리케이션 설정에 Android 플랫폼 및 키 해시 등 정보가 등록되어 있어야 합니다. 자세한 내용은 애플리케이션 등록을 참고합니다.

시작하기 전에

카카오 로그인 버튼인 LoginButton을 로그인 화면 레이아웃(layout) 파일에 추가합니다. 다음은 ConstraintLayout을 활용하여 화면 중앙 아래에 버튼을 배치하는 예제입니다.

Sample: activity_login.xml
<com.kakao.usermgmt.LoginButton
    android:id="@+id/login_button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginBottom="30dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />

로그인

로그인은 토큰을 발급받아 카카오 로그인이 필요한 카카오 API를 호출할 수 있도록 하는 기능입니다. 다음은 LoginActivity 클래스 예제로, 각각의 로그인 과정을 수행한 결과에 따라 필요한 동작들을 정의하고 있습니다.

Sample: LoginActivity
public class LoginActivity extends Activity {

    // 세션 콜백 구현
    private ISessionCallback sessionCallback = new ISessionCallback() {
        @Override
        public void onSessionOpened() {
            Log.i("KAKAO_SESSION", "로그인 성공");
        }

        @Override
        public void onSessionOpenFailed(KakaoException exception) {
            Log.e("KAKAO_SESSION", "로그인 실패", exception);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        // 세션 콜백 등록
        Session.getCurrentSession().addCallback(sessionCallback);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 세션 콜백 삭제
        Session.getCurrentSession().removeCallback(sessionCallback);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        // 카카오톡|스토리 간편로그인 실행 결과를 받아서 SDK로 전달
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
            return;
        }

        super.onActivityResult(requestCode, resultCode, data);
    }
}

로그인 액티비티에서 가장 중요한 부분은 콜백(callback) 활용입니다. 상황에 따라 필요한 동작을 수행할 콜백을 추가하거나 삭제해야 합니다.

로그인 성공 시 액세스 토큰, 리프레시 토큰 두 종류의 토큰을 받습니다. 카카오 SDK는 토큰을 관리하는 기능을 갖고 있으며, Android Kakao SDK는 토큰 관리를 위한 별도 설정이 필요하지 않습니다. 하지만 액세스 토큰 정보가 필요할 때는 토큰 관리의 예제와 같이 토큰 정보를 조회할 수 있습니다.

요청 실패 시 에러는 문제 해결을 참고합니다.

로그인 세션 유지하기

Session.getCurrentSession().checkAndImplicitOpen() API를 사용해 발급받았던 토큰으로 로그인 세션을 열린 채로 유지할 수 있습니다. 이 API는 현재 Kakao SDK가 가지고 있는 토큰이 사용 가능한 상태인지 확인하여 세션을 열거나 토큰을 갱신하고, 토큰이 유효하지 않다면 로그인 상태를 유지하는 게 불가능함을 알립니다. 실제 세션 처리는 ISessionCallback을 통해 수행하는 점 구현 시 참고합니다.

로그아웃

로그아웃은 사용자 액세스 토큰 및 리프레시 토큰을 만료시켜 현재 기기에서의 로그인 상태를 해제합니다. 로그아웃 요청 결과를 받아 처리할 LogoutResponseCallback을 구현하고 requestLogout을 호출합니다. 로그아웃 성공 시 Kakao SDK는 토큰을 삭제하고 세션 연결을 종료합니다.

Sample
UserManagement.getInstance()
        .requestLogout(new LogoutResponseCallback() {
            @Override
            public void onCompleteLogout() {
                Log.i("KAKAO_API", "로그아웃 완료");
            }
        });

연결 끊기

사용자와 앱의 연결을 해제하는 기능입니다. 연결 끊기 요청 결과를 받아 처리할 UnlinkResponseCallback을 구현하고 requestUnlink API를 호출합니다. 연결 끊기에 성공하면 사용자는 로그아웃되고, 사용자와 앱의 연결이 끊어집니다. 해당 사용자가 앱에 로그인하면 다시 동의 및 연결 절차를 거칩니다. 요청 실패 시 에러는 응답 코드를 참고합니다.

Parameter: UnlinkResponseCallback
Name Type Description
onSuccess Long 연결 끊기에 성공한 사용자 ID 전달
onSessionClosed ErrorResult 세션이 닫혀 실패한 경우, 에러 메시지 반환
onFailure ErrorResult 연결 해제에 실패한 경우, 에러 메시지 반환
Sample
UserManagement.getInstance()
        .requestUnlink(new UnLinkResponseCallback() {
            @Override
            public void onSessionClosed(ErrorResult errorResult) {
                Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
            }

            @Override
            public void onFailure(ErrorResult errorResult) {
                Log.e("KAKAO_API", "연결 끊기 실패: " + errorResult);

            }
            @Override
            public void onSuccess(Long result) {
                Log.i("KAKAO_API", "연결 끊기 성공. id: " + result);
            }
        });

토큰 관리

Legacy Android SDK는 토큰 관리 기능을 내장하고 있으며, 카카오 API 요청 시 토큰을 갱신하는 기능도 갖추고 있습니다. 따라서 별도 토큰 관리 기능을 제공하지 않습니다. 토큰 정보가 필요한 경우에는 다음과 같이 조회할 수 있습니다.

Sample
AuthService.getInstance()
        .requestAccessTokenInfo(new ApiResponseCallback<AccessTokenInfoResponse>() {
            @Override
            public void onSessionClosed(ErrorResult errorResult) {
                Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
            }

            @Override
            public void onFailure(ErrorResult errorResult) {
                Log.e("KAKAO_API", "토큰 정보 요청 실패: " + errorResult);
            }

            @Override
            public void onSuccess(AccessTokenInfoResponse result) {
                Log.i("KAKAO_API", "사용자 아이디: " + result.getUserId());
                Log.i("KAKAO_API", "남은 시간(s): " + result.getExpiresIn());;
            }
        });
getExpiresInMillis()

REST API와 Kakao SDK에서 동일한 파라미터 이름 및 단위를 사용하여 사용성을 개선하고자, 토큰 관리 API 중 getExpiresInMillis()를 getExpiresIn()로 변경하였습니다.

고급 가이드

인증 수단 설정

Android 카카오 로그인의 기본 동작은 사용자가 로그인 버튼을 눌렀을 때 인증 수단을 선택하는 다이얼로그(dialog)가 나타나고, 로그인 결과는 콜백으로 전달됩니다. 만약 사용자가 다이얼로그에서 원하는 인증 수단을 선택하도록 하지 않고 정해진 인증 수단만 사용하도록 하려면 ISessionConfig 설정을 이용합니다.

ISessionConfig
Name Return Description
getAuthTypes AuthType 사용자 인증 수단
미지정 시 가능한 모든 옵션 지정
isUsingWebviewTimer Boolean 로그인 웹뷰(WebView)에서 pause, resume 시 타이머(Timer) 설정
CPU 소모 절약
true일 경우 모든 카카오 로그인 웹뷰에 타이머를 설정해야 함
default false
isSecureMode Boolean 로그인 시 Acceess Token과 Refresh Token 암호화 여부
isSaveFormData Boolean 로그인 웹뷰 이메일(email) 입력 폼(Form)에 데이터 저장 여부 결정
default true
AuthType (Enum class)
Name Value Description
KAKAO_TALK 0 카카오톡으로 로그인
KAKAO_STORY 1 카카오스토리로 로그인
KAKAO_ACCOUNT 2 웹뷰를 통해 카카오계정 로그인
KAKAO_LOGIN_ALL 4 모든 로그인 방식 사용
우선순위는 카카오톡, 카카오스토리, 웹뷰
KAKAO_TALK_ONLY 5 카카오톡으로 로그인, 실패 시 웹뷰 로그인을 진행하지 않음.

카카오 SDK 초기화 시, 아래 예제와 같이 ISessionConfigAuthType을 직접 지정하여 인증 수단을 설정할 수 있습니다. 예를 들어, 사용자가 카카오톡으로만 로그인하도록 하고 싶다면 AuthType.KAKAO_TALK_ONLY로 지정합니다. 이밖에도 토큰 암호화 여부 등을 예제와 같이 설정할 수 있습니다.

Sample
    public ISessionConfig getSessionConfig() {
            return new ISessionConfig() {
                @Override
                public AuthType[] getAuthTypes() {
                    return new AuthType[] {AuthType.KAKAO_LOGIN_ALL};
                }

                @Override
                public boolean isUsingWebviewTimer() {
                    return false;
                }

                @Override
                public boolean isSecureMode() {
                    return false;
                }

                @Override
                public ApprovalType getApprovalType() {
                    return ApprovalType.INDIVIDUAL;
                }

                @Override
                public boolean isSaveFormData() {
                    return true;
                }
            };
        }

더보기