웹뷰 기반 안드로이드 앱에서 카카오톡 앱 통한 로그인시

웹뷰 기반 안드로이드 앱 Test App에서
카카오톡 앱이 설치되어 있고 카카오톡 로그인 되어있는 상태에서

개발중인 앱 Test App에 카톡 로그인을 구현하려는데,
카톡 로그인을 했는데

카카오 SDK이 아니라 Test App 웹뷰 로그아웃 이후에
카카오톡앱을 아예 삭제후

Test App에서 카카오톡 로그인을 시도시
웹뷰에서 로그인이 되는 이슈는

웹뷰가 카카오 로그인 관련 쿠키정보등을 가지고 있어서 그런걸까요?

아래는 구현된 카카오로그인 매니저이고

public class KakaoLoginManager {

    private Context context;
    private KakaoLoginCallback callback;

    public KakaoLoginManager(Context context, KakaoLoginCallback callback) {
        this.context = context;
        this.callback = callback;
    }

    public void loginWithKakao() {
//        UserApiClient.getInstance().unlink();
        UserApiClient.getInstance().loginWithKakaoTalk((Activity) context, new Function2<OAuthToken, Throwable, Unit>() {
            @Override
            public Unit invoke(OAuthToken oAuthToken, Throwable throwable) {
                if (oAuthToken != null) {
                    Log.e("KakaoLoginManager", "카카오 로그인 성공");
                    getUserInfo();
                }
                if (throwable != null) {
                    Log.e("KakaoLoginManager", "로그인 실패: " + throwable.getMessage());
                    callback.onFailure();
                }
                return null;
            }
        });
    }
new Handler().postDelayed(() ->
                                {
                                    UserApiClient.getInstance().logout(new Function1<Throwable, Unit>() {
                                        @Override
                                        public Unit invoke(Throwable error) {
                                            // 에러 처리 로직 (error가 null이 아닐 경우)
                                            if (error != null) {
                                                // 에러 처리
                                                System.out.println("로그아웃 에러: " + error.getMessage());
                                            } else {
                                                // 로그아웃 성공
                                                System.out.println("로그아웃 성공");
                                            }
                                            return null; // Unit 타입은 void와 유사하므로 null 반환
                                        }
                                    });
                                }, 0);

이걸해도 웹뷰가 기존 카카오 로그인 성공한 정보를 갖고 있더라고요
그냥 logout()이 아니라 unlink()를 호출해야하는건가요?

의존성은 아래와
implementation “com.kakao.sdk:v2-auth:2.12.0”
implementation “com.kakao.sdk:v2-user:2.12.0”// 카카오 로그인
같이 되어있습니다

문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요.

Faq 목록 - 10. Android ( Faq 목록 입니다 ) 먼저 확인해주세요.


안녕하세요.

죄송합니다만, 어떤 상황인지 잘 이해하지 못하였습니다.
웹뷰를 사용하신다고 하였지만 문의주신 글은 android Kakao SDK입니다.

웹뷰 기반 서비스지만 카카오 로그인 시, JS SDK가 아닌 android Kakao SDK를 사용하여 로그인 하고 계신다는 말씀이신가요?
그리고, 카카오톡이 없는 상태에서 로그아웃 하고 다시 로그인해도 계정 ID/PW 입력없이 바로 로그인 되는 것이 문제라고 하시는 것인가요?

웹뷰 기반 서비스지만 카카오 로그인 시, JS SDK가 아닌 android Kakao SDK를 사용하여 로그인 하고 계신다는 말씀이신가요?
===> 네, 맞습니다

카카오톡이 없는 상태에서 로그아웃 하고 다시 로그인해도 계정 ID/PW 입력없이 바로 로그인 되는 것이 문제라고 하시는 것인가요?
===> 네, 맞습니다

웹뷰 기반에 안드로이드에서 카카오톡 로그인 관련
반드시 JS SDK를 사용해야하나요?

카카오톡 앱 설치 및 로그인 여부를 JS SDK로도 가능한건가요?

카카오톡이 설치되지 않은 경우 CustomTabs을 활용하여 브라우저를 통해 카카오 로그인이 진행 됩니다.
이 때, 브라우저에 카카오 계정 세션이 활성화 된 경우 ID/PW를 더 이상 묻지 않습니다.

카카오 계정으로 로그인 (loginWithKakaoAccount) 사용 시, 항상 ID/PW를 입력받고자 하신다면
아래 가이드를 참고 하여 prompts 파라미터 설정 부탁드립니다.

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


추가로 웹뷰 기반의 서비스의 경우
서비스측의 특별한 이유가 있지 않은 한 보통 서비스 페이지에서 JS SDK를 사용하여 로그인 합니다.
JS SDK에서도 카카오톡 실행 가능여부를 판단하여 로그인 지원 가능하오니 사용 검토 부탁드리며

웹뷰 기반의 하이브리드 앱에서 JS SDK사용 시, 아래 네이티브 앱에 내용이 구현되어 있어야 하는점 참고 부탁드립니다.

하이브리드 앱 가이드 | Kakao Developers 하이브리드 앱 가이드

알려주신 기존 로그인 여부와 상관없이 로그인하기
를 확인해보니 prompts 파라미터 설정을 통한 로그인 방식은

커스텀탭을 이용한 방법 밖에 없는거 같네요 loginWithKakaoAccount() 이요

카카오톡 앱을 이용한 로그인 방식은
loginWithKakaoTalk()인데
이것에 경우 prompts 파라미터 설정을 통하여
prompts = listOf(Prompt.LOGIN)을 주기는 어려운 부분인가요?

카카오톡은 사용자가 항상 로그인 되어 있기 때문에 Prompt.LOGIN 사용이 불필요 & 불가 합니다.

때문에, 여러 카카오 계정을 사용할수 있도록 제공하는 서비스의 경우 loginWithKakaoAccount 기능만을 사용하거나
둘 중 하나를 선택하여 사용할 수 있도록 버튼 제공하기도 합니다.

… 제공하는 서비스에 경우 웹뷰 기반에 안드로이드 앱으로

카카오톡 로그인을 이용해 사용자 프로필정보와 토큰을 받아서
이를 웹뷰를 통해 서버에 전달해주고 있습니다.

테스트 도중에 카카오톡 앱을 삭제하여보았는데,
이전에 카카오톡 로그인이 성공했던 것처럼 로그인이 되어버리는 상황이 왔습니다.

코드 상에는 getPackageManager().getLaunchIntentForPackage(“com.kakao.talk”)로 해서
사용자 휴대폰이 카카오톡이 지워져있으면 저걸 가지고 android kakao sdk가 아니라

팝업 웹뷰를 띄우게끔 하려는 의도였습니다. 그런데, 로그인이 되버리더라고요.
그래서 서비스 제공 앱내 내부 캐쉬라든지 웹뷰 쿠키라든지 어떤 저장정보에 의해
발생된 현상인가 문의드린거였습니다.

예를 들어 아래는 테스트중인 단말기 휴대폰에 shared preference 데이터였습니다.

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="com.kakao.sdk.oauth_token">HlJqy</string>
    <string name="com.kakao.sdk.version">2.12.0</string>
</map>

혹시 이러한 것들을 기반으로 웹뷰에서 카카오톡을 지워도 이전 로그인 성공한 데이터를 기반으로
로그인이 되어버리는걸까요?

사용자 디바이스에 카카오 계정세션(쿠키)가 존재하면 ID/PW 입력 없이 로그인 됩니다.
이를 회피하고자 하신다면 prompts 파라미터 사용 부탁드립니다.

…서비스 제공 앱에 경우 웹뷰 기반 안드로이드 앱인데,

말씀하신 내용이라면 세션쿠키 삭제를 통해 해결가능할까요?

세션쿠키 삭제가 가능할까요?

카카오톡 인증 관련 세션 쿠키가 보이지 않아서요

웹뷰 url이 https://test.net일 경우 이를 통해 가능할까요?

        public void clearWebViewCookies() {
                CookieManager cookieManager = CookieManager.getInstance();
                String url = "https://test.net"; // 사용 중인 웹뷰 URL
                String cookies = cookieManager.getCookie(url);

                if (cookies != null) {
                    String[] cookieArray = cookies.split(";");
                    for (String cookie : cookieArray) {
                        Log.d("Cookies", cookie);

                        // 특정 패턴이나 조건에 맞는 쿠키 삭제
                        if (cookie.contains("kakao")) {
                            String[] cookieParts = cookie.split("=");
                            String cookieName = cookieParts[0].trim();
                            cookieManager.setCookie(url, cookieName + "=; Expires=Thu, 01 Jan 1970 00:00:00 GMT");
                        }
                    }
                    if (Build.VERSION.SDK_INT >= 21) {
                        cookieManager.flush();
                    } else {
                        CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(MainActivity.this);
                        cookieSyncManager.sync();
                    }
                } else {
                    Log.d("Cookies", "No cookies found");
                }
            }

Kakao SDK를 사용할 경우
SDK가 카카오톡 미설치시 기본 브라우저를 통해 계정 로그인 할수 있도록 동작합니다.
서비스측 앱에서 기본 브라우저의 쿠키를 제어할 수는 없습니다.
Kakao SDK도 마찬가지며 때문에 prompts 파라미터가 제공되고 있으므로 해당 파라미터 사용 부탁드립니다.

JS SDK를 사용할 경우
서비스가 구현한 웹뷰 내에서 계정 로그인이 진행되므로 웹뷰의 쿠키를 직접 제거하시면 됩니다.
단, prompts 파라미터 사용 가능하기에 이와 같은 불필요한 로직 구현하실 필요가 없습니다.

구현하신 코드에서는 loginWithKakaoAccount 사용 내용이 확인되지 않는데요.
자세한 안내를 위해 현재 완성한 코드를 보여주시겠어요?

public void loginWithKakao() {
//        UserApiClient.getInstance().unlink();
        UserApiClient.getInstance().loginWithKakaoAccount((Activity) context, listOf(Prompt.LOGIN), null, null, null, null, new Function2<OAuthToken, Throwable, Unit>() {
            @Override
            public Unit invoke(OAuthToken oAuthToken, Throwable throwable) {
                if (oAuthToken != null) {
                    Log.e("KakaoLoginManager", "카카오 로그인 성공");
                    getUserInfo();
                }
                if (throwable != null) {
                    Log.e("KakaoLoginManager", "로그인 실패: " + throwable.getMessage());
                    callback.onFailure();
                }
                return null;
            }
        });

kotlin 기반으로 loginWithKakaoAccount() 사용시 parameter name 지정가능하지만
java기반으로 사용하여 prompt는 안내해주신대로 listOf(Prompt.LOGIN) 주었고
context랑 callback은 기존 loginWithKakao() 와 같이 사용했습니다.

다만, 휴대폰에 카카오톡앱 설치자에 경우 커스텀탭이 아닌
카카오톡 로그인이 서비스 정책에 맞는 부분이어서

loginWithKakaoAccount() 는 커스텀탭을 사용하는 부분이라
해당부분은 서비스적용에 어려울거 같네요

잘 이해 되지 않는데요
카카오톡 실행 가능여부를 판단하여 가능한 경우 톡 로그인 하도록 하시고 아닌경우 계정 로그인 하게 하시면 되는데요
이러한 구현을 적용하지 않는 이유가 있으신가요?

제공된 코드에서는 톡 로그인 시키신다는 말씀과 달리 실행 가능여부 판단하지 않고 계정 로그인으로만 보내고 있습니다.

저 근데, 댓글달기 누르면 자동으로 답변자님께 알림이 가는건가요? 포럼에 댓글달기를 누르면 사이트에 표시가 안되는거 같아서요
방금

public void loginWithKakao() {
//        UserApiClient.getInstance().unlink();
        UserApiClient.getInstance().loginWithKakaoAccount((Activity) context, listOf(Prompt.LOGIN), null, null, null, null, new Function2<OAuthToken, Throwable, Unit>() {
            @Override
``` 댓글에 경우 알림이 가신건가요?

넵, 알림이 오게 됩니다.

전체적인 부분을 설명드리자면,

@JavascriptInterface
public boolean kakao_login(){ // 함수가 호출되면
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.kakao.talk");

if (launchIntent != null) {
 loginWithKakao() {
} //설명드렸던 여기가 실행되고요
else {} 이면
앱이 설치되어있지 않다고해서 이때는 카카오톡 앱 로그인으로 처리하지 않고 있습니다.

이슈사항으로는 설명해주신대로 기본 브라우저에서 세션쿠키를 갖고 있어서
카카오톡 앱을 지워도
로그인이 되어지는 부분이었고요.

아까 답변드린

public void loginWithKakao() {
//        UserApiClient.getInstance().unlink();
        UserApiClient.getInstance().loginWithKakaoAccount((Activity) context, listOf(Prompt.LOGIN), null, null, null, null, new Function2<OAuthToken, Throwable, Unit>() {
            @Override
            public Unit invoke(OAuthToken oAuthToken, Throwable throwable) {
                if (oAuthToken != null) {
                    Log.e("KakaoLoginManager", "카카오 로그인 성공");
                    getUserInfo();
                }
                if (throwable != null) {
                    Log.e("KakaoLoginManager", "로그인 실패: " + throwable.getMessage());
                    callback.onFailure();
                }
                return null;
            }
        });

에 경우는
이렇게 구현되어져 있다는게 아니라
이것도 카카오톡 앱 로그인 기능인지 테스트해봤다는 내용이었습니다.
(커스텀 탭 이용한 로그인 기능이니까 적용이 어려울거 같다는 거였구요)

실제로는 카카오톡 앱로그인인 loginWithKakaoTalk()이거로 되어있고요

그리고
getPackageManager().getLaunchIntentForPackage(“com.kakao.talk”)이거 대신에 카카오sdk제공
isKakaoTalkLoginAvailable()에 경우는 사용자가 카카오톡 설치/미설치 여부뿐만 아니라
카카오톡 앱이 설치되어있고 로그인되어있는지 로그아웃되어있는지 여부도 판별해주나요?

fun isKakaoTalkLoginAvailable(context: Context): Boolean =
        AuthCodeClient.instance.isKakaoTalkLoginAvailable(context)

현재 isKakaoTalkLoginAvailable 기능이 톡 로그인 여부까지 확인하지 않습니다.
톡 설치 후 로그인하지 않은 케이스는 희소한 known issue로 굳이 고려하지 않으셔도 될것 같습니다.
(사용자가 카카오톡으로 이동하기에 로그인 및 다시 시도를 기대할 수 있음)

현재 톡이 삭제된 상태에서 계정로그인(커스텀 탭)이 바로 되는 케이스에 집중하고 계신데요
때문에 원하시는 시나리오 파악이 어렵습니다.

엣지 케이스에 대한 검증 보다 원하시는 시나리오를 설명해 주시면 비슷한 구성의 타 서비스들이 주로 구현하는 방법을 안내 드릴 수 있을것 같습니다.