페이지 이동경로
  • 문서>
  • 카카오싱크>
  • 톡에서 자동 로그인

카카오싱크

카카오톡에서 자동 로그인

이 문서는 카카오톡에서 자동 로그인 기능 사용 방법을 안내합니다.

카카오톡에서 자동 로그인(이하 자동 로그인)은 카카오톡 인앱브라우저를 통한 서비스 페이지 진입 시, 서비스 가입 여부에 따른 분기 처리를 지원하는 카카오 로그인의 추가 기능입니다. 이 기능을 사용하면 가입한 사용자에게는 별도 로그인 과정 없이 자동으로 로그인된 화면을, 아직 가입하지 않은 사용자에게는 로그인하지 않은 상태의 화면을 각각 출력하여 보다 매끄럽고 편리한 사용자 동선을 제공할 수 있습니다.

자동 로그인은 다음 3단계에 걸쳐 이뤄집니다. 서비스에서는 단계별로 필요한 사항을 구현하여 자동 로그인을 이용할 수 있습니다.

Step 1. 서비스 페이지 진입 시 브라우저 확인

자동 로그인은 카카오톡 안에서 열리는 인앱브라우저에서만 동작합니다. UserAgentKAKAOTALK이 포함돼 있는지 확인하여 카카오톡 인앱브라우저를 통한 서비스 페이지 진입인지 판단하는 로직을 서비스 페이지에 추가합니다.

UserAgent
Browser Rule Description
카카오톡 인앱브라우저 KAKAOTALK Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0 KAKAOTALK
Step 2. 자동 로그인을 위한 인가 코드 받기 요청

사용자 브라우저가 카카오톡 인앱브라우저로 확인되었다면, 인가 코드 받기prompt 파라미터 값을 "none"으로 지정하여 요청합니다.

자세한 요청 방법은 아래 개발 가이드를 참고합니다.

Step 3. 인가 코드 받기 응답에 따른 분기 처리

요청 성공 시, 사용자의 서비스 가입 여부에 따라 구분된 응답을 통해 서비스 가입 여부에 따른 분기처리를 할 수 있습니다.

서비스에 가입한 사용자일 경우

자동 로그인 요청 성공 시, ID와 비밀번호 입력을 통한 로그인 과정을 건너 뛰고 인가 코드를 반환합니다. 서비스는 인가 코드로 토큰 받기를 호출하고 서비스 로그인 처리를 완료한 뒤, 사용자에게 로그인된 상태의 서비스 페이지를 출력할 수 있습니다.

서비스에 가입하지 않은 사용자일 경우

서비스에 가입하지 않은 사용자일 경우, 자동 로그인 요청 시 서비스 이용을 위해 사용자 동의가 필요하다는 에러 응답(consent_required)을 반환하므로 로그인을 완료할 수 없습니다. 따라서 서비스는 사용자에게 로그인되지 않은 상태의 서비스 페이지를 출력해야 합니다.

아래는 자동 로그인 과정을 간략히 표현한 시퀀스 다이어그램(Sequence diagram)입니다.

다음은 카카오톡에서 자동 로그인할 때의 예시 시나리오입니다:

  • 자동 로그인 기능 적용 대상은 공유하기 등 카카오톡을 통해 전파될 가능성이 높은 상품 판매 페이지라고 가정합니다.
  • 사용자가 카카오톡 인앱브라우저에서 대상 페이지에 들어왔는지 브라우저 정보를 확인합니다.
  • 카카오톡 인앱브라우저를 통해 들어온 사용자로 판단되면 자동 로그인을 요청합니다.
  • 사용자의 카카오싱크를 통한 가입 여부에 따라 인가 코드 또는 에러 응답을 받아 분기 처리합니다.
    • 가입한 사용자라면 로그인된 상태로 상품 판매 페이지를 출력해 곧바로 상품 구입을 할 수 있도록 처리합니다.
    • 미가입 사용자라면 로그인되지 않은 상태로 상품 판매 페이지를 출력하고, 필요 시 직접 로그인할 수 있도록 처리합니다.

Web

사용자 브라우저가 카카오톡 인앱브라우저라면 인가 코드 받기prompt 파라미터를 포함하여 요청합니다. prompt의 값을 "none"으로 지정하면 카카오톡 인앱브라우저에서는 카카오톡에 연결된 카카오계정으로 ID 및 비밀번호 입력 과정 없이 인가 코드를 발급받을 수 있습니다. 자동 로그인 사용 시 prompt는 필수 파라미터로, 이 파라미터가 없으면 일반적인 카카오 로그인과 마찬가지로 동작하는 점에 주의합니다.

요청 성공 시 응답은 카카오싱크를 통한 서비스 가입 여부에 따라 구분됩니다.

사용자가 카카오싱크를 통해 서비스에 가입한 상태일 경우, 인가 코드 받기와 동일하게 카카오 인증 서버가 인가 코드가 담긴 쿼리 스트링을 redirect_uri로 리다이렉트합니다. redirect_uri의 요청을 처리해 인가 코드를 얻고 토큰 발급 및 서비스 로그인 처리를 완료합니다. 서비스 로그인 처리까지 완료된 후, 사용자에게 로그인된 상태의 서비스 페이지를 출력해야 합니다.

사용자가 아직 가입하지 않았다면, 카카오 인증 서버는 사용자 동의가 필요하다는 에러 응답을 반환합니다. 인가 코드를 발급 받지 못해 카카오 로그인을 완료할 수 없으므로, 서비스 로그인 또한 진행하지 않고 사용자에게 로그인되지 않은 상태의 서비스 페이지를 출력해야 합니다.

또한 카카오톡 인앱브라우저를 통해 서비스 페이지에 진입했더라도 아직 가입하지 않은 사용자일 경우에는 사용자의 로그인 요청 시 prompt 파라미터 없이 인가 코드 받기를 호출해야 합니다. prompt 파라미터 없이 인가 코드 받기를 요청해야만 사용자가 정상적으로 카카오싱크 간편 회원가입 과정을 거칠 수 있습니다.

Request
URL
GET /oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code&prompt=none HTTP/1.1
Host: kauth.kakao.com
Parameter
Name Type Description Required
client_id String 앱 생성 시 발급받은 REST API O
redirect_uri String 인가 코드를 받을 URI O
response_type String code로 고정 O
prompt String 동의 화면 요청 시 추가 상호작용을 요청하고자 할 때 전달하는 파라미터, 추가 정보와 발생 가능한 에러 유형은 인가 코드 받기 참고
자동 로그인 요청 시에는 none 값으로 지정하여 필수 전달
O
state String 로그인 요청과 콜백 간에 상태를 유지하기 위해 사용되는 임의의 문자열(정해진 형식 없음)
Cross-Site Request Forgery(CSRF) 공격으로부터 보호하기 위해 해당 파라미터 사용을 권장함
X
Response
Name Type Description Required
code String 인증 성공 시 반환되는 코드 O
state String Cross-Site Request Forgery(CSRF) 공격을 차단하기 위해 사용되는 파라미터로, 요청으로 보낸 state 값과 동일한 state 값이 전달됨 X
error String 인증 실패 시 반환되는 에러 코드 X
error_description String 인증 실패 시 반환되는 에러 메시지 X
Sample
Response: 성공
HTTP/1.1 302 Found
Content-Length: 0
Location: {REDIRECT_URI}?code={AUTHORIZE_CODE}
Response: 카카오싱크를 통해 가입하지 않은 사용자
HTTP/1.1 302 Found
Content-Length: 0
Location: {REDIRECT_URI}?error=consent_required&error_description=user%20consent%20required.

Legacy Android

자동 로그인 파라미터 이름 차이

Legacy Android SDK를 사용해 자동 로그인을 구현할 경우, REST API와 자동 로그인 요청에 사용하는 파라미터 이름이 다릅니다. Legacy Android SDK에서는 자동 로그인을 auto_login 파라미터로 요청하고, REST API는 prompt 파라미터로 요청합니다. 파라미터 이름이 달라도 기능은 정상 동작합니다.

자동 로그인은 로그인에 추가 파라미터를 담는 extraParamsauto_login을 "true"로 설정하고 담아 요청합니다. com.kakao.auth.StringSet에 정의되어 있는 auto_login 키를 사용합니다.

또한 자동 로그인은 카카오톡 인앱브라우저 기반으로만 동작하므로, 로그인 요청 시 사용자 인증 방법을 AuthType.KAKAO_TALK_ONLY로 설정하여 카카오톡의 세션을 받아 로그인해야 한다는 점에 유의합니다.

import com.kakao.auth.StringSet;

public class SampleLoginActivity extends BaseActivity {
    private SessionCallback callback;

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

        callback = new SessionCallback();
        Session.getCurrentSession().addCallback(callback); // 콜백 추가

        Map<String, String> extraParams = new HashMap<>();
        extraParams.put(StringSet.auto_login, "true");

        Session.getCurrentSession().open(AuthType.KAKAO_TALK_ONLY, this, extraParams); // KAKAO_TALK_ONLY로 실행해야 톡 미설치 시 웹뷰 로그인을 시도하지 않음.
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
            return;
        }

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Session.getCurrentSession().removeCallback(callback); // 콜백 제거해줘야 함.
    }

    private class SessionCallback implements ISessionCallback {

        @Override
        public void onSessionOpened() {
            // 로그인 성공
        }

        @Override
        public void onSessionOpenFailed(KakaoException exception) {
            // 로그인 에러.
        }
    }
}

로그인에 성공한다면 로그인된 서비스 페이지를, 에러 응답을 받았다면 로그인되지 않은 서비스 페이지를 사용자에게 보여줍니다. 발생 가능한 에러 유형은 카카오 로그인 > REST API > 인가 코드 받기를 참고합니다.

Legacy iOS

자동 로그인 파라미터 이름 차이

Legacy iOS SDK를 사용해 자동 로그인을 구현할 경우, REST API와 자동 로그인 요청에 사용하는 파라미터 이름이 다릅니다. Legacy iOS SDK에서는 자동 로그인을 KOSessionAutoLoginParameterKey 파라미터로 요청하고, REST API는 prompt 파라미터로 요청합니다. 파라미터 이름이 달라도 기능은 정상 동작합니다.

자동 로그인은 카카오톡 인앱브라우저 기반으로만 동작하므로, 먼저 카카오톡 설치 여부를 확인합니다. 카카오톡이 설치되어 있다면 사용자 인증 방법을 KOAuthType.talk으로 지정하고, 파라미터로 KOSessionAutoLoginParameterKey를 "true"로 추가해 로그인을 요청합니다.

// 카카오톡 설치여부 확인
if UIApplication.shared.canOpenURL(URL(string: "kakaokompassauth://")!) {

    // 자동로그인 파라미터 (auto_login) 추가
    let parameters = [KOSessionAutoLoginParameterKey: "true"]

    // 로그인 선택 다이얼로그 없이 카카오톡 간편로그인 실행
    let authTypes = [NSNumber(value: KOAuthType.talk.rawValue)]

    // 로그인 실행
    KOSession.shared()?.open(completionHandler: { (error) in

        if error != nil {
            // 로그인 상태로 변경

        } else {
            // 미연결 사용자 (또는 기타 에러)
            // 자동로그인이 불가능하므로 비로그인 상태로 이용
        }

    }, parameters: parameters, authTypes: authTypes)

} else {
    // 카카오톡이 설치되지 않았을 경우,
    // 자동로그인이 불가능하므로 비로그인 상태로 이용

}

로그인에 성공한다면 로그인된 서비스 페이지를, 에러 응답을 받았다면 로그인되지 않은 서비스 페이지를 사용자에게 보여줍니다. 발생 가능한 에러 유형은 카카오 로그인 > REST API > 인가 코드 받기를 참고합니다.

더보기

Web

Android

iOS