PWA (Progressive Web App)

한눈에 보기

PWA는 웹 기술로 만든 앱에 설치, 오프라인 동작, 푸시 알림 같은 네이티브 경험을 더한 웹 앱이다. 서비스 워커, 웹 앱 매니페스트, HTTPS라는 세 요건과 캐싱 전략, 네이티브 앱과의 비교를 정리한다.

최종 업데이트 2026.09.17

PWA(Progressive Web App)는 웹 기술로 만든 애플리케이션에 설치, 오프라인 동작, 푸시 알림 같은 네이티브 앱의 경험을 더한 웹 앱을 말한다. 서비스 워커(Service Worker), 웹 앱 매니페스트(Web App Manifest), HTTPS라는 세 가지 기술 요건 위에 성립하며, 별도의 앱 스토어 심사 없이 URL로 배포하면서도 홈 화면 아이콘으로 실행되는 앱처럼 쓸 수 있다. 웹의 도달력과 앱의 경험을 절충하려는 시도라는 점에서 하이브리드 앱과 목적이 겹치지만, 구현은 순수 웹 표준만으로 이루어진다는 차이가 있다.

PWA를 구성하는 세 요소

첫째 요소는 HTTPS다. 서비스 워커는 네트워크 요청을 가로챌 수 있는 강력한 기능이므로, 중간자 공격을 막기 위해 보안 연결에서만 동작하도록 표준이 강제한다. 둘째는 웹 앱 매니페스트로, 앱 이름, 아이콘, 시작 URL, 테마 색, 표시 방식을 JSON 파일로 선언한다. 브라우저는 이 파일을 보고 설치 가능 여부를 판단하며, display 값을 standalone으로 두면 설치 후 주소창 없는 독립 창으로 실행된다.

{
  "name": "데브핏",
  "short_name": "Devfit",
  "start_url": "/",
  "display": "standalone",
  "theme_color": "#6C5CE7",
  "icons": [{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }]
}

셋째이자 핵심은 서비스 워커다. 서비스 워커는 웹 페이지와 별개의 스레드에서 도는 스크립트로, 페이지가 닫혀 있어도 브라우저가 깨워 실행할 수 있다. 페이지와 네트워크 사이의 프록시(Proxy) 위치에서 모든 요청을 가로채고, 캐시 스토리지(Cache Storage)에 저장한 응답으로 대신 답할 수 있다. DOM(Document Object Model)에는 직접 접근할 수 없고, 등록, 설치, 활성화로 이어지는 생명 주기를 가진다.

오프라인 동작과 캐싱 전략

서비스 워커의 fetch 이벤트를 활용하면 네트워크 상태에 따른 응답 전략을 코드로 정의할 수 있다. 대표 전략은 네 가지다. 캐시 우선(Cache First)은 캐시에 있으면 바로 쓰고 없을 때만 네트워크로 가는 방식으로 폰트나 로고처럼 잘 바뀌지 않는 자원에 맞는다. 네트워크 우선(Network First)은 항상 최신을 시도하고 실패 시 캐시로 대체하므로 API 응답에 적합하다. 스테일 와일 리밸리데이트(Stale While Revalidate)는 캐시를 즉시 보여 주면서 뒤에서 새 버전을 받아 다음을 대비하는 절충안이다. 마지막으로 오프라인 폴백(Offline Fallback)은 모든 시도가 실패했을 때 미리 캐시해 둔 대체 페이지를 보여 준다. 여기에 백그라운드 동기화(Background Sync)를 더하면 오프라인 중에 작성한 요청을 큐에 쌓았다가 연결이 돌아왔을 때 자동 전송할 수 있다. 이런 전략 구현을 도와주는 라이브러리로 워크박스(Workbox)가 널리 쓰인다.

설치와 푸시 알림

매니페스트와 서비스 워커 요건을 갖추면 브라우저가 설치 가능 상태로 판단하고, 홈 화면 추가를 유도할 수 있다. 설치된 PWA는 앱 서랍과 홈 화면에 아이콘이 생기고 독립 창으로 실행되어 겉보기에 네이티브 앱과 구분이 어렵다. 푸시 알림은 푸시 API(Push API)와 알림 API(Notification API)의 조합으로 구현한다. 사용자 동의를 받아 브라우저의 푸시 서비스 구독 정보를 서버에 저장해 두면, 서버가 웹 푸시 프로토콜로 메시지를 보내고, 페이지가 닫혀 있어도 서비스 워커가 깨어나 알림을 표시한다. 다만 플랫폼 간 지원 편차가 현실적인 제약이다. 안드로이드(Android)의 크롬(Chrome)은 설치와 푸시를 완전하게 지원하는 반면, iOS의 사파리(Safari)는 지원이 늦고 제한적이어서 홈 화면에 추가한 웹 앱에 한해 푸시가 동작하는 등 조건이 붙는다. PWA를 도입할 때는 대상 사용자의 플랫폼 분포를 반드시 확인해야 한다.

네이티브 앱과의 비교

구분PWA네이티브 앱
배포URL, 심사 없음, 즉시 갱신스토어 심사, 갱신 지연
설치 용량매우 작다상대적으로 크다
오프라인서비스 워커 캐시로 가능완전 지원
기기 기능웹 API 범위로 제한전부 접근 가능
푸시 알림플랫폼별 편차 있음완전 지원
검색 유입웹 검색으로 가능스토어 검색 의존

PWA는 스토어 수수료와 심사 없이 앱 경험을 제공하고 싶은 서비스, 신흥 시장처럼 저장 공간과 네트워크가 제한된 환경, 설치 장벽 때문에 이탈이 큰 커머스에서 특히 효과적이다. 반면 고성능 그래픽이나 깊은 하드웨어 접근이 필요하면 여전히 네이티브가 답이다.

면접에서 이렇게 물어본다

  • PWA의 세 가지 핵심 구성 요소와 각각의 역할을 설명해 보라.
  • 서비스 워커의 생명 주기와 일반 스크립트와의 차이를 말해 보라.
  • 캐시 우선과 네트워크 우선 전략을 어떤 자원에 각각 적용하겠는가.
  • 서비스 워커가 HTTPS에서만 동작하도록 강제된 이유는 무엇인가.
  • PWA와 하이브리드 앱의 공통점과 차이를 설명해 보라.
웹 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기