방법: 맞춤 탭 열기 및 닫기

업데이트 날짜 18. 5월 2023 작성자 Jan Bunk


일부 웹사이트나 웹사이트 기능은 신뢰할 수 있는 브라우저 환경에서만 작동해요. 앱에서 웹사이트를 표시하는 데 사용하는 WebView는 신뢰할 수 있는 환경으로 간주되지 않아요. 시각적으로 매력적이고 맞춤 설정 가능한 앱을 제공하기 위해 사용하는 기능이 악의적인 목적으로 악용될 수 있기 때문이에요. 물론 저희 앱은 그러한 악의적인 작업을 수행하거나 허용하지 않지만, 일부 웹사이트는 이러한 이론적 위험 때문에 모든 WebView의 사용을 제한해요.

이 문제를 피하려면 WebView에서 작동하지 않는 웹사이트의 일부를 이른바 커스텀 탭에서 열 수 있어요.

사용 사례 예시

웹사이트에서 'Google로 로그인'(또는 Apple, Facebook, Twitter 등) 기능을 제공하는 경우 커스텀 탭에서만 작동할 수 있어요. Facebook은 WebView에서의 로그인을 명확히 금지하고 있으며, 다른 서비스 중 일부는 단순히 작동하지 않아요.

표시되는 모습

앱에서 페이지를 여는 경우와 커스텀 탭에서 여는 경우의 차이를 확인할 수 있도록 Android 앱의 스크린샷 2개를 준비했어요.

홈페이지를 표시하는 앱의 스크린샷.
홈페이지를 표시하는 앱의 스크린샷.
커스텀 탭에서 홈페이지를 표시하는 앱의 스크린샷.
커스텀 탭에서 홈페이지를 표시하는 앱의 스크린샷.

사용법

아래 단계에서 사용하는 여러 함수는 앱 도우미 스크립트에서 가져온 것이에요.
  1. 커스텀 탭을 열어요. 첫 번째 매개변수는 커스텀 탭에서 열 URL이에요. http 또는 https로 시작하는 전체 URL을 전달해야 하며, 상대 URL은 작동하지 않아요. 두 번째 매개변수는 커스텀 탭에 전달하려는 데이터를 포함하는 JavaScript 객체예요. 이 데이터는 URL 쿼리 매개변수로 전달되며, 데이터를 가져오는 방법은 다음 단계를 참조하세요.
    다음의 executeWhenAppReady() 함수를 확인해 보세요. 앱 도우미 스크립트예요.. 이 함수는 앱이 준비되기 전이나 웹사이트가 일반 브라우저에서 로드되었을 때 웹사이트에서 앱과 상호작용을 시도하지 않도록 해줘요(ReferenceError, 함수가 정의되지 않음).
    
    <script>
        openCustomTab("https://webtoapp.design/user/login", {
            "myFirstValue": "abc",
            "myNumbers": "123"
        });
    </script>
                
  2. 커스텀 탭에서 연 페이지가 일반 사용자의 브라우저가 아니라 커스텀 탭에서 로드되었는지 확인하세요.
    
    <script>
        if (isInCustomTab()) {
            // continue with the next steps...
        }
    </script>
                
  3. 그런 다음 커스텀 탭에 전달한 데이터를 가져올 수 있어요.
    
    <script>
        // this is the data you passed as a second parameter to openCustomTab, so in our example from above:
        // {
        //     "myFirstValue": "abc",
        //     "myNumbers": "123"
        // }
        let myData = getCustomTabData();
    </script>
                
  4. 커스텀 탭에서 하려던 작업(예: 사용자의 로그인)이 끝나면 커스텀 탭을 닫으세요. 커스텀 탭을 열었던 페이지로 객체를 다시 전달할 수 있어요.
    
    <script>
        closeCustomTab({
            "somedata": "mydata",
            "moredata": {
                "test": "myvalue"
            }
        })
    </script>
                
  5. 이제 사용자는 처음 커스텀 탭을 열었던 앱 페이지로 돌아와요. 커스텀 탭에서 반환한 데이터를 포함하는 이벤트가 발생해요. 사용자가 커스텀 탭을 직접 닫을 수도 있어요. 아래에서 볼 수 있듯이 이벤트 세부 정보에 이 사실이 표시돼요.
    
    <script>
        document.addEventListener("customTabClosed", function (e) {
            if ("reason" in e.detail) {
                // currently only supports the reason "closed manually"
                console.log("The custom tab was " + e.detail.reason);
            }
            else {
                // the custom tab was closed by the website javascript
                // this is the data you passed to closeCustomTab, so in our example from above:
                // {
                //     "somedata": "mydata",
                //     "moredata": {
                //         "test": "myvalue"
                //     }
                let returnedData = e.detail;
            }
        });
    </script>
                

예시

커스텀 탭을 사용해 로그인 흐름을 구현하는 방법의 몇 가지 예시를 소개해요.

핵심 문제는 항상 사용자가 이용하려는 앱에서 로그인되어야 하지만, 별도의 쿠키를 사용하는 커스텀 탭에서 로그인 정보를 입력해야 한다는 점이에요. 일반적으로 쿠키에는 사용자의 로그인 여부가 저장돼요.

쿠키로 로그인하기

커스텀 탭으로 로그인하는 가장 간단한 방법일 가능성이 높아요. 앱으로 전송해야 하는 쿠키에는 HttpOnly를 설정하지 마세요. HttpOnly 쿠키는 JavaScript로 접근할 수 없기 때문이에요.

쿠키를 전송하는 커스텀 탭 로그인 흐름의 다이어그램.새 창에서 다이어그램 열기

토큰으로 로그인하기

이 로그인 방법은 더 복잡하지만 유연성이 높으므로 사용 사례에 따라 더 적합할 수 있어요.

토큰을 전송하는 커스텀 탭 로그인 흐름의 다이어그램.새 창에서 다이어그램 열기

유의 사항

커스텀 탭에 로드된 페이지는 사용자의 브라우저에서 로드된 것처럼 작동하므로 다음과 같은 앱 전용 기능은 작동하지 않아요.