들어가기
타사 서비스를 앱 안에 연동할 때, 상대 화면을 그대로 가져와 띄울지, 데이터만 받아 우리 화면을 새로 그릴지 하는 선택을 해야할 때가 있습니다. 어떤 방식을 택하든 결국 도메인이 다른 두 서비스 사이에서 사용자를 로그인 상태로 유지하는 방법과 다시 만납니다. 이번 글에서는 기획 단계에서 마주하는 개발 상식의 딜레마부터, 이를 해결하기 위한 설계 디테일까지 실무 관점에서 짚어보려 합니다.
상대 서비스의 기능을 우리 앱에 가져올 때 주로 두 가지 방식을 취하게 됩니다.
1. 웹뷰 방식
상대 서비스가 이미 만들어둔 웹페이지를 우리 앱 안의 창에 그대로 띄우는 방식입니다. 화면을 새로 만들지 않아 개발 속도가 빠르고, 상대가 화면을 바꾸면 우리 쪽 수정 없이 자동으로 반영됩니다. 다만 화면의 디자인·인터랙션을 우리 마음대로 바꿀 수 없고, 로딩이나 오류 상태를 우리 쪽에서 세밀하게 제어하기 어렵습니다.
2. API 연동 방식
화면 없이 데이터(JSON 등)만 받아와 우리 디자인 시스템대로 화면을 직접 그리는 방식입니다. 브랜드 일관성과 세밀한 UX 제어가 가능하지만, 상대 서비스의 기능이 바뀔 때마다 우리도 개발을 따라가야 해서 유지보수 비용이 더 듭니다.
예시
러닝 기록 앱을 만들고 있다고 가정해 봅시다. 사용자가 뛰기 전에 날씨를 볼 수 있게 기상청 날씨 정보를 연동하려고 합니다. 이 때 두 가지 선택지가 생깁니다.
선택 1. "상대 화면을 그대로 가져와 띄우자."
선택 2. "데이터만 받아 우리 화면을 새로 그리자."
실무 적용 문제
지금까지 읽으신 내용을 바탕으로 실무 퀴즈를 하나 풀어보겠습니다.

토스 앱에서 내 '카카오뱅크 계좌 잔액'을 조회하는 화면입니다. 카카오뱅크 특유의 노란 UI나 고유의 폰트는 보이지 않고, 토스만의 UI로 잔액이 표시됩니다. 그렇다면 토스는 타행 계좌를 연동할 때 '웹뷰'를 썼을까요, 아니면 'API 연동'을 썼을까요?
✔️ 정답은 'API 연동'입니다.
토스는 신한은행의 웹페이지 화면을 가져와 앱 안에 띄우는 대신, 금융망(마이데이터/오픈뱅킹 API)을 통해 {"잔액": 0원}이라는 순수한 데이터(JSON)만 받아옵니다.
그리고 그 데이터를 토스팀의 디자인 시스템(네이티브 UI)에 맞춰 화면에 직접 새로 그리는 엄청난 수고를 감수합니다. 개발 및 유지보수 비용이 천문학적으로 들지만, 사용자가 타사 서비스에 접속했다는 이질감을 1%도 느끼지 못하게 만들어 ‘역시 토스가 제일 편해’라는 압도적인 UX를 보여주고 있는 좋은 API 연동 사례입니다.
웹뷰의 '빠른 유지보수'와 API의 '안정적인 사용성'을 모두 잡기 위해 실무에서 가장 많이 쓰는 패턴이 바로 '하이브리드 앱'입니다.
실무 적용 문제
화면을 보고 네이티브 레이어 찾아내기
우리가 방금 배운 '샌드위치 UX' 개념을 실전에 적용해 볼까요?
카카오톡 앱 안에서 열린 '푸드위크 코리아 예약 상세 페이지' 입니다. 이 화면은 겉은 카카오톡 앱(네이티브)이고 속은 상세 페이지(웹뷰)인 전형적인 하이브리드 구조입니다.
그렇다면 절대 화면에서 사라지거나 덜컹거리지 않고 꽉 고정되어 있는 '네이티브 레이어'는 무엇일까요?

1 - 상단 네비게이션 바
2 - 컨텐츠 영역
3 - 하단 고정 바
4 - FAB 버튼
5 - 바텀시트
6 - 토스트 팝업
✔️ 정답은 2번을 제외한 모든 영역 입니다.
이처럼 하이브리드 앱 기획은 단순히 화면을 그리는 것을 넘어, 사용자의 핵심 경험(결제, 탈출, 팝업)은 네이티브에 두고, 자유롭게 바뀔 본문만 웹뷰에 맡기는 레이어 분리 작업이 핵심입니다.
타사 서비스를 연동할 대 가장 먼저 마주치는 벽은 ‘로그인 상태 유지’ 입니다.
💡 웹뷰(WebView) vs iframe
웹뷰 : 앱 안에 뚫어놓은 창문
: 네이티브 앱(iOS/Android) 화면 안에 웹페이지(HTML)를 띄워 보여주는 컴포넌트. (하이브리드 샌드위치 UX의 알맹이)
iframe : 웹 안에 뚫어놓은 창문
: 웹사이트 안에서 '또 다른 외부 웹페이지'를 가져와 액자처럼 삽입할 때 쓰는 HTML 태그. (예: 블로그 글 안의 유튜브 플레이어, 네이버 지도 화면)
기획자나 디자이너 입장에서 OAuth 2.0, OpenID Connect 같은 개발 용어가 한 줄에 쏟아지면 이해하기 힘든 것이 당연합니다. 복잡한 개발 용어 대신, 우리 앱 안에서 사용자가 '제휴사 포인트몰 가기' 버튼을 눌렀을 때 뒤에서 벌어지는 데이터 흐름을 Step 0부터 Step 3까지 풀어보겠습니다.
브라우저라는 창고에 데이터를 몰래 묻어두고 '알아서 꺼내 가겠지' 하는 쿠키방식은 브라우저의 강력한 보안 정책(제3자 쿠키 차단)에 막히기 십상입니다.
반면 OAuth(토큰)는 우리가 직접 안전하게 암호화된 출입증(토큰)을 쥐어주고 상대방 서버에 "이 사람 맞는지 확인해 줘!" 하고 명시적으로 쏘아 보내는 방식이기 때문에, 브라우저 정책에 구애받지 않고 도메인의 벽을 안전하게 넘을 수 있습니다.
대표 예시
우리가 매일 쓰는 OAuth 대표 예시 : 노션(Notion)
노션 앱에서 Google 로그인을 진행할 때 동작하는 실제 5단계 UX 흐름입니다.


앱과 웹뷰가 섞여 있다 보니, '뒤로 가기'를 눌렀을 때 앱이 닫혀야 할지, 웹페이지가 이전으로 가야 할지 충돌이 발생합니다. 뎁스가 깊은 웹뷰 화면에서 사용자가 무심코 스와이프를 하거나 기기의 '뒤로 가기' 물리 버튼을 눌렀을 때, 이전 페이지로 가지 않고 앱 자체가 튕기듯 종료되는 대참사가 종종 발생합니다.
예를 들어, 하이브리드 앱으로 만든 쇼핑몰에서 상품 상세 페이지의 링크를 타고 리뷰 화면까지 깊게 들어갔는데, 폰의 물리적 뒤로 가기 버튼을 누르는 순간 앱 메인 홈으로 튕겨버리는 현상입니다.
✔️ 어떻게 풀어야 할까?
앱과 웹뷰 사이의 네비게이션 위계를 어떻게 맞출지, 이를 위해 개발자와 '브릿지 통신'을 어떻게 설계해야 안전한 사용자 경험을 줄 수 있는지 명시해야 합니다.
네트워크가 느려지거나 오류가 났을 때 사용자가 느끼는 경험의 차이가 극명하게 드러납니다. 네이티브는 사용자를 달래며 기다리게 할 수 있지만, 웹뷰는 순식간에 서비스의 '쌩얼'이 드러나 사용자에게 이질감을 주기 쉽습니다.
예를 들어, 제휴사 이벤트를 보려고 웹뷰 화면으로 진입했는데 상대방 서버가 느려 3초 동안 텅 빈 하얀 백지만 떠 있거나, 네트워크 오류가 났을 때 웹 브라우저 특유의 날것 그대로인 '404 Not Found' 에러 화면이 노출되는 현상입니다.
✔️ 어떻게 풀어야 할까?
웹뷰 영역의 로딩 상태와 에러 상황을 앱이 어디까지 가려주고 통제할지 기획서에 예외 처리 정책을 명시해야 합니다.
| 구분 | 일반 웹뷰 | 시스템 브라우저 뷰 | 외부 브라우저 뷰 |
| 개발 용어 |
WKWebView(iOS),
WebView(AOS)
|
SFSafariViewController(iOS),
Chrome Custom Tabs(AOS)
|
Safari, Chrome 앱 직접 호출
|
| 로그인 | 불가 (매번 새로 로그인 필요) |
가능 (사파리/크롬 로그인 정보 공유) |
가능 (원래 로그인 되어있음) |
| UX 체감 | 네이티브처럼 자연스럽게 녹아듦. | 메인 브라우저의 분신. 앱 위에 팝업으로 스르륵 열림. |
앱 닫히고 완전히 다른 앱이 켜짐. |
타사 앱을 벤치마킹할 때, 개발자에게 묻지 않고 스스로 화면의 정체를 판별해 내는 실무 팁 4가지 입니다.

웹뷰는 빠르게 붙일 수 있지만 화면과 로그인 흐름을 세밀하게 제어하기 어렵고, API 연동은 자유도가 높은 대신 개발 비용이 더 듭니다. 인증도 마찬가지로, 같은 도메인이면 쿠키 공유로 해결되지만 다른 도메인이라면 OAuth가 필요합니다. 결국 두 선택 모두 ‘우리가 얼마나 통제권을 가질 것인가’라는 같은 질문으로 돌아갑니다.
기획자는 무조건 ‘API로 예쁘고 완벽하게 해주세요!’라고 요구하는 사람이 아닙니다. 상황에 따라 쿨하게 웹뷰를 수용하되, 결제 완료나 이탈 같은 '치명적인 순간'만큼은 API나 브릿지로 꼼꼼하게 통제하자는 타협안을 제시해야 합니다.
다음 글에서는 OAuth 연동 후 발생하는 로그아웃 동기화, 토큰 만료 처리 같은 후속 이슈를 다뤄보겠습니다.
| 상세페이지는 왜 귀찮게 잘라서 올려야할까? (0) | 2026.08.14 |
|---|---|
| UX 기획자를 위한 HTML 최소 지식: BO 구축 및 운영 Tips (0) | 2026.07.31 |
| 사용자의 답답함을 줄여주는 치트키, ‘Optimistic UI’ (0) | 2026.05.26 |
| Default와 Fallback, 기획자라면 당연히 고려해야 할 두 가지 (0) | 2026.05.07 |
| 건강한 웹사이트란 무엇일까? (0) | 2026.01.29 |
댓글 영역