Web API - Service Worker API & Cache
Service Worker 와 Cache 를 활용하면 인터넷 연결이 끊겨도 동작하는 앱을 만들 수 있습니다.
Service Worker 는 브라우저에 등록되어, 브라우저와 네트워크 사이에서 프록시 서버의 역할을 수행합니다. 즉, Service Worker 는 서버인 것처럼 브라우저가 서버에게 보내는 요청에 응답할 수 있습니다.
Cache 는 브라우저의 Request 와 서버의 Response 를 저장할 수 있습니다.
오프라인에서 동작하는 앱을 만들려면, 먼저 Service Worker 를 등록합니다. 그리고 인터넷이 연결되어 있는 동안, 브라우저가 보내는 Request 와 Response 를 Cache 에 저장합니다. 그리고 인터넷 연결이 끊기게 되면, Service Worker 는 서버의 역할을 대신하여 인터넷이 연결된 것처럼 Cache 에 저장된 데이터를 바탕으로 마치 인터넷이 연결되어 있는 것처럼 브라우저의 요청에 응답합니다.
Service Worker 는 아래와 같이 등록할 수 있습니다.
// 일반적인 js 파일에서 Service Worker 를 등록합니다.
if('serviceWorker' in navigator) {
navigator.serviceWorker
.register('/relativePath/sw.js')
.then(() => { console.log('Service Worker 등록 완료'); });
}
Service Worker 는 브라우저의 요청을 가로채고 서버를 대신하여 응답할 수 있기 때문에 보안에 치명적입니다. 따라서 Service Worker 를 등록하려면 반드시 HTTPS 프로토콜로 접근해야 하고 Origin 이 다르면 등록할 수 없습니다. 그리고 Service Worker 는 실행 컨텍스트가 아닌 독립된 컨텍스트에서 실행되므로 스레드도 다르고 DOM 에 접근할 수 없습니다.
Service Worker 를 정의한 js 파일 내에서 self
키워드로 Service Worker 가 될 객체에 아래와 접근할 수 있습니다.
// /relativePath/sw.js 파일
// Service Worker 가 등록될 때 install 이벤트가 발생한다.
self.addEventListener('install', function(e) {
});
// 브라우저가 서버로 요청을 보내면 Service Worker 는 fetch 이벤트를 구독해서 요청에 접근할 수 있다.
self.addEventListener('fetch', function(e) {
e.respondWith(
// Cache 된 응답이 있는지 확인하고 응답이 없으면 서버로 요청을 전달한다.
caches.match(e.request).then(function(response) {
return response || fetch(e.request);
})
);
});
참고
'Develop > Frontend 가이드' 카테고리의 다른 글
[FE] webpack 에서 Source Map 이 동작하는 원리 (1) | 2021.05.30 |
---|---|
[FE] Web API - WebSocket API (0) | 2021.05.30 |
[FE] Web API - Client-side storage : IndexedDB (0) | 2021.05.12 |
[FE] Web API - Client-side storage : 로컬 스토리지 localStorage 와 세션 스토리지 sessionStorage (0) | 2021.05.10 |
[FE] Web API - Client-side storage : 쿠키 Cookie (0) | 2021.05.09 |
꾸준히 노력하는 개발자 "김예건" 입니다.