최근에 프로젝트를 진행하며 처음으로 PWA를 적용해보았다.
관련해서 간단하게 공부하면서
웹앱, PWA, 웹뷰, 하이브리드 앱, 크로스플랫폼 앱 같은 용어들을 자주 접했었다.
또한, 처음에는
웹을 기반으로 앱처럼 사용할 수 있는 모든 것 = 웹앱이라고 막연하게 이해하고 있었다.
하지만 정리해보니,
웹앱은 서비스의 ‘형태’이고
PWA나 하이브리드 앱은 그 웹앱을 ‘어떻게 배포하고 실행할 것인가’에 대한 전략에 가깝다는 걸 알게 되었다.
그 개념을 간단하게 좀 정리해보려고 한다.
웹 앱(Web Application)은 웹 브라우저에서 실행되는 소프트웨어를 의미한다.
별도의 설치 과정 없이, 인터넷 연결과 브라우저만 있다면 언제든 실행할 수 있다.
웹앱은 우리가 일반적으로 사용하는 웹 기술과 동일하게 개발된다.
즉, 웹에서 동작하는 프로그램이다.
우리가 만드는 대부분의 웹 서비스는 이미 웹앱의 성격을 띠고 있다.
웹사이트와 웹앱은 종종 구분되지만, 요즘에는 사실 구분하기가 애매하다.
여기서, 뉴스 사이트에 댓글·좋아요·실시간 갱신 기능이 있다면 이미 웹앱의 성격을 띤다고 볼 수 있다.
그래서 요즘은 “URL로 접근해 브라우저에서 사용하는 서비스” 정도로 묶어서 이해해도 될 거 같다!
여기서 내가 가장 헷갈렸던 것은 아래처럼 생각했기 때문이었다.
웹앱 = 앱처럼 설치해서 쓰는 것
사실은 이렇게 생각하면 된다!
그럼 이제 이러한 관점에서 웹앱을 어떻게 배포하고 실행하는지를 보면 된다!
(PWA나 일부 최신 브라우저 기능을 활용하면 제한적으로 가능)
→ 이것들을 통해 카메라, 알림, 파일 접근 등의 기능을 연동
위 종류를 살펴보며 프로젝트에 적용한 PWA는 어디에 속하지?라는 의문이 들었다.
결론적으로는, PWA는 웹앱과 웹뷰 사이의 위치정도 같다!
이 중 기업 채용 공고에서 많이 보이던 웹뷰를 조금 더 알아보려고 한다!
웹뷰는 위에서 봤듯이 네이티브 앱 안에 포함된 웹을 보여주는 뷰이다.
즉, 네이티브 앱 내부에서 HTML / CSS / JavaScript로 만든 웹 페이지를 렌더링하는 컴포넌트
일반 브라우저랑 다르게
WebView는 브라우저가 아니라 앱 UI의 일부로 들어가는 웹 렌더러다.
| 구분 | 브라우저 | WebView |
| 실행 위치 | 독립 실행 앱 | 네이티브 앱 내부 |
| UI | 주소창, 탭, 메뉴 제공 | 없음 (앱 UI에 종속) |
| 제어 주체 | 사용자 | 개발자 |
| 배포 | URL 접속 | 앱 설치 필요 |
| 네이티브 연동 | 거의 불가 | 가능 (브릿지 통해) |
핵심적인 차이는
1) 한 번 개발로 여러 플랫폼 대응
2) 앱 업데이트 없이 즉시 반영
→ 자주 바뀌는 화면 (약관, 이벤트, 공지, 마이페이지 등)에 매우 적합
3) 네트워크 기반 데이터 표현에 유리
→ 네이티브에서 UI + API + 상태관리 하는 것보다 웹으로 보여주는 게 단순
1) 성능 한계
2) UI / UX 제약
3) 보안
따라서 앱 화면 중 하나로 인식하여 가짜 페이지가 들어와도 눈치 채기 어려울 수 있음
JS에서 Native 함수를 호출할 수 있기 때문에, 보안상 문제가 생겼을 때 Native 의 권한까지 탈취될 수도 있음
→ 웹뷰자체의 문제보다는 브라우저가 기본으로 제공하던 보안 UX와 정책을 개발자가 직접 책임져야 하기 때문에 보안 사고가 발생하기 쉽다고 생각하면 될 것 같다.
웹뷰(WebView)를 다루다 보면 이런 경험을 하게 된다.
이 문제의 대부분은 웹뷰가 어떤 웹 엔진 위에서 동작하는지를 알면 설명할 수 있다.
WebView는 브라우저가 아니라, 웹 엔진을 UI 안에 포함시킨 컴포넌트다.
그렇다면 왜 브라우저가 아니라 컴포넌트인가?
Chrome, Safari 같은 브라우저는
이 모든 것을 포함한 완성된 앱이다.
반면 WebView는
즉, 웹 엔진만 가져다 앱 화면 안에 심어둔 형태다.
따라서, 개발자가 코드를 짤 때 웹뷰는 Button, TextView, Image와 같은 레벨의 UI 요소일 뿐이다.

따라서, 웹뷰는 브라우저에서 '머리(주소창, 탭, 뒤로 가기 버튼)'를 떼어내고 '몸통(엔진)'만 가져온 상태라고 생각하면 된다.
안드로이드는 Chromium, iOS는 WebKit 엔진을 사용한다. 그래서 최신 JS 문법은 잘 알아들음!
브라우저에 당연히 있는 '뒤로 가기'나 '새로고침' 기능을 웹뷰에서 쓰려면, 개발자가 직접 코드로 구현해야 한다.
예) 사용자가 폰의 뒤로 가기를 누르면 웹뷰를 이전 페이지로 돌려라..


그래서, 작업을 하다보면 IOS만 안된다.하는 문제들이 꽤나 발생한다고 한다.
이건 내부적으로 엔진자체가 다르기 때문이었다!!
WebKit 내부는 여러 프로세스로 나뉘어 있다.
즉, 웹뷰는 싱글 프로세스처럼 보이지만, 실제로는 멀티 프로세스로 동작한다
이로 인해
브라우저의 구조와 내부적으로 차이가 있어, 쿠키를 누가 관리하느냐가 다르다!
브라우저의 구조
[Browser(UI) Process] ← 최상위 관리자|├── Network Process ← 쿠키 저장/전송├── Renderer Process (탭들)└── GPU Process
웹 뷰의 구조
웹뷰는 브라우저 전체 관리자가 아니고, 앱마다 웹뷰의 인스턴스가 분리된다.
[App Process]|└── WebView (WebKit)├── WebProcess├── NetworkProcess└── GPUProcess
그래서, 실제로 WebView에서 쿠키가 어긋나는 실제 이유들은 아래와 같다.
→ 즉, 같은 앱이어도 웹뷰끼리 서로 다른 프로세스를 가져, 다른 쿠키 스토어를 가질 수 있다.
웹뷰에는 브라우저에는 없는 경계가 있다.
따라서 native 앱에서 네트워크 요청, webView 에서 요청
두 요청 간에 쿠키 공유가 자동으로 되지 않는다.
네이티브 앱 영역 ← 경계 → 웹 영역
→ 로그인 상태가 어긋나게 되는 원인
WebView는 메모리 부족, 백그라운드, IOS 정책 등으로 인해
WebProcess / NetworkProcess가 죽었다가 재생성될 수 있다.
그럼 이때 아래와 같은 문제들로 인해 화면이 하얗게 보일 수 있다!
→ 완전 앱의 일부인 셈!