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

카카오 로그인

Legacy iOS

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

애플리케이션 설정 확인

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

시작하기 전에

인증 과정을 진행하기 위해 미리 정의된 Redirect URI를 사용하도록 AppDelegate에 아래와 같은 코드를 추가합니다. 이 설정이 없다면 카카오 로그인 중 에러가 발생합니다.

Redirect URI

카카오 로그인은 인가 코드 받기, 토큰 발급의 두 단계로 나뉘어 진행되며, 인가 코드를 받아 토큰 발급을 요청하는 역할을 하는 Redirect URI를 앱 정보에 등록해야 합니다. 하지만 iOS, Android, JavaScript 카카오 SDK 사용 시에는 미리 정의된 Redirect URI를 사용해 인가 코드 및 토큰 발급을 수행하므로, 별도의 Redirect URI 등록이 필요하지 않습니다.

AppDelegate 설정

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
                                       sourceApplication:(NSString *)sourceApplication
                                              annotation:(id)annotation {
    ...
    if ([KOSession isKakaoAccountLoginCallback:url]) {
        return [KOSession handleOpenURL:url];
    }
    ...
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
                                                 options:(NSDictionary<NSString *,id> *)options {
    ...
    if ([KOSession isKakaoAccountLoginCallback:url]) {
        return [KOSession handleOpenURL:url];
    }
    ...    
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [KOSession handleDidBecomeActive];
}

로그인

사용자가 카카오 로그인 버튼을 터치했을 때, 동의 화면을 불러오고 액세스 토큰을 발급받는 로그인 과정이 시작되도록 합니다. 카카오 로그인은 openWithCompletionHandler를 구현해 요청합니다. 다음 예제와 같이 기존의 오래된 세션을 닫은 후 로그인을 진행할 것을 권장합니다.

Sample
// 오래된 세션 닫기
[[KOSession sharedSession] close];

[[KOSession sharedSession] openWithCompletionHandler:^(NSError *error) {
    if (error) {
        NSLog(@"login failed. - error: %@", error);
    }
    else {
        NSLog(@"login succeeded.");
    }
}];

로그인 요청의 응답 결과는 리프레시 토큰, 액세스 토큰 두 종류의 토큰입니다. 카카오 로그인이 필요한 API 호출 시 사용되는 토큰은 Kakao SDK가 기기에 저장하고 관리합니다. 토큰에 대한 정보는 이해하기를, 토큰 정보를 보는 방법은 토큰 관리를 각각 참고합니다.

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

로그아웃

로그아웃은 사용자 액세스 토큰 및 리프레시 토큰을 만료시켜 현재 기기에서의 로그인 상태를 해제합니다. 로그아웃 요청에는 결과에 따라 이어질 동작들을 정의해야 합니다. 실패 시에는 응답 유형으로 원인을 파악하고 해결 또는 예외 처리합니다.

로그아웃 성공 또는 실패 시 로그를 출력하는 예제입니다.

Sample
[[KOSession sharedSession] logoutAndCloseWithCompletionHandler:^(BOOL success, NSError *error) {
    if (error) {
        NSLog(@"failed to logout. - error: %@", error);
    }
    else {
        NSLog(@"logout succeeded.");
    }
}];

연결 끊기

사용자와 앱의 연결을 해제하는 기능입니다. 연결 끊기 시 로그인 상태도 해제됩니다. unlinkTaskWithCompletionHandler에 성공 또는 실패 시 이어질 동작을 정의하여 요청합니다.

연결 끊기에 성공하면 앱과 사용자의 연결이 끊어지고 로그아웃되므로, 사용자를 로그인 화면으로 이동시키거나 화면을 로그인되지 않은 상태로 새로고침하는 등 후속 조치가 필요합니다. 요청 실패 시 에러는 응답 코드를 참고합니다.

Sample
[KOSessionTask unlinkTaskWithCompletionHandler:^(BOOL success, NSError *error) {
    if (error) {
        NSLog(@"unlink logout. - error: %@", error);
    }
    else {
        NSLog(@"unlink succeeded.");
    }
}];

토큰 관리

iOS SDK v1은 토큰 관리 기능을 내장하고 있으며, 카카오 API 요청 시 토큰을 갱신하는 기능도 갖추고 있습니다. 따라서 별도 토큰 관리 기능을 제공하지 않습니다.

액세스 토큰 정보를 보려면 accessTokenInfoTaskWithCompletionHandler:를 사용해 다음과 같이 호출합니다.

Sample
[KOSessionTask accessTokenInfoTaskWithCompletionHandler:^(KOAccessTokenInfo *accessTokenInfo, NSError *error) {
    if (error) {
        switch (error.code) {
            case KOErrorDeactivatedSession:
                NSLog(@"세션이 만료된(access_token, refresh_token이 모두 만료된 경우) 상태");
                break;
            default:
                NSLog(@"예기치 못한 에러. 서버 에러");
                break;
        }
    } else {
        // 성공 (토큰이 유효함)
        NSLog(@"success request - access token info:  %@", accessTokenInfo);
    }
}];

고급 가이드

인증 수단 설정

로그인 시 상황에 따라 카카오톡, 카카오스토리, 다른 카카오계정으로 로그인의 다중 인증 선택창이 나타납니다. 인증 방법을 직접 제어하고 싶을 경우, 원하는 인증 방식을 KOAuthType으로 지정하여 파라미터로 전달할 수 있습니다. 아래는 카카오톡으로 간편로그인만 제공하고자 할 때의 예제입니다.

[[KOSession sharedSession] openWithCompletionHandler:^(NSError *error) {
    ...
} authType:(KOAuthType)KOAuthTypeTalk, nil]];

토큰 암호화 저장

Kakao SDK가 관리하는 토큰의 저장 보안 방식은 프로젝트의 Info.plist 옵션으로 선택할 수 있습니다. 기본 값은 비활성(false)이며, 토큰 암호화 저장 기능을 활성화하려면 아래와 같이 설정합니다.

<key>KAKAO_SECURE_MODE</key>
<true/>

로그인 상태 변경 처리

카카오계정의 세션 연결 상태는 로그인, 로그아웃 등 과정을 통해 동적으로 변할 수 있습니다. 상태 변경 시 발생하는 이벤트(Notification)는 다음 예제 코드와 같이 다룰 수 있습니다. 먼저 이벤트를 처리할 메소드를 정의합니다.

- (void)kakaoSessionDidChangeWithNotification:(NSNotification *)notification
{
    if ( ! [[KOSession sharedSession] isOpen] ) {
        // do something for unauthenticated user
    }
}

정의한 메소드를 NSNotificationCenterObserver로 등록합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    // 카카오계정의 세션 연결 상태가 변했을 시,
    // Notification을 kakaoSessionDidChangeWithNotification 메소드에 전달하도록 설정
    [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(kakaoSessionDidChangeWithNotification:)
                                                name:KOSessionDidChangeNotification
                                            object:nil];
    ...
}

더보기