PWA의 μ„œλΉ„μŠ€ μ›Œμ»€λŠ” HTTPSλ₯Ό μš”κ΅¬

PWA μ•±μ—μ„œ ν‘Έμ‹œ μ•Œλ¦Όμ„ 보내기 μœ„ν•΄μ„œλŠ” μ‚¬μš©μžκ°€ μ‚¬μ΄νŠΈ λ˜λŠ” 앱에 λŒ€ν•œ μ•Œλ¦Ό κΆŒν•œμ„ ν—ˆμš©ν•΄μ•Όν•˜λ©° PWA 앱이 μ’…λ£Œλ˜μ–΄μžˆμ–΄λ„ λ°±κ·ΈλΌμš΄λ“œ μƒνƒœμ—μ„œ λ™μž‘ν•˜λŠ” μ„œλΉ„μŠ€ μ›Œμ»€κ°€ ν•„μš”ν•˜λ‹€. Vite 기반으둜 κ΅¬μ„±λ˜μ–΄μžˆλŠ” ν”„λ‘œμ νŠΈμ—μ„œλŠ” PWA Plugin for Vite둜 μ‰½κ²Œ PWA μ„€μΉ˜ 지원과 ν•¨κ»˜ μ„œλΉ„μŠ€ μ›Œμ»€λ₯Ό 등둝할 수 있게 μ„€μ •ν•  수 μžˆλ‹€. μ„œλΉ„μŠ€ μ›Œμ»€λŠ” HTTPS μ—μ„œ λ™μž‘ν•΄μ•Όν•˜λ―€λ‘œ 개발 ν™˜κ²½μ—μ„œλŠ” vite-plugin-mkcertκ°€ 도움이 될 수 μžˆλ‹€.

μ„œλΉ„μŠ€ μ›Œμ»€μ˜ μƒνƒœ 변경을 κ³ λ €ν•˜κΈ°

μ„œλΉ„μŠ€ μ›Œμ»€μ˜ 생λͺ… μ£ΌκΈ°λ₯Ό μ΄ν•΄ν•˜κ³  μƒˆλ‘œ μ„€μΉ˜λ˜κ±°λ‚˜ μ—…λ°μ΄νŠΈλ˜λŠ” μ„œλΉ„μŠ€ μ›Œμ»€λ‘œ 인해 λ©”μ‹œμ§€ μˆ˜μ‹ μ΄ μ›ν™œν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€λŠ” 점을 μΈμ§€ν•΄μ•Όν•œλ‹€. ServiceWorkerGlobalScope.skipWaiting μ΄λ‚˜ Clients::claim()이 도움이 될 μˆ˜λ„ μžˆλ‹€.

μ„œλΉ„μŠ€ μ›Œμ»€ 파일이 firebase-messaging-sw.js 일 ν•„μš”λŠ” μ—†λ‹€
main.js
if ('serviceWorker' in navigator) { navigator.serviceWorker.register( import.meta.env.MODE === 'production' ? '/sw.js' : '/dev-sw.js?dev-sw', {type: import.meta.env.MODE === 'production' ? 'classic' : 'module'} ).then(registration => { console.log('register service worker', registration) }) }

FCM κ΄€λ ¨ 일뢀 κΈ€μ—μ„œ μ„œλΉ„μŠ€ μ›Œμ»€μ˜ 파일이 λ°˜λ“œμ‹œ firebase-messaing-sw.js 이어야 ν•œλ‹€κ³  μ–ΈκΈ‰ν•˜λŠ”λ° 잘λͺ»λœ 정보에 ν•΄λ‹Ήλ˜λ©° FCM λ©”μ‹œμ§€ μˆ˜μ‹ μ„ μœ„ν•΄μ„œ PWA μ•±μ—μ„œ μ‚¬μš©μ€‘μΈ μ„œλΉ„μŠ€ μ›Œμ»€ 내에 Firebase SDKλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ”κ²Œ μ€‘μš”ν•œ 뢀뢄이닀. μœ„ μ½”λ“œμ™€ 같이 개발 ν™˜κ²½μ—μ„œλŠ” dev-sw.jsλ₯Ό μ„œλΉ„μŠ€ μ›Œμ»€λ‘œ λ“±λ‘ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŒμ„ 보여쀀닀.

FCM ν‘Έμ‹œ μ•Œλ¦Όμ΄ μ—¬λŸ¬λ²ˆ ν‘œμ‹œλ˜λŠ” 문제 πŸ”₯

PWA μ•±μ˜ ν‘Έμ‹œ μ•Œλ¦Όμ—μ„œ FCM λ©”μ‹œμ§€κ°€ μ—¬λŸ¬λ²ˆ ν‘œμ‹œλ˜λŠ” λ¬Έμ œμ™€ 같이 λ°±κ·ΈλΌμš΄λ“œ μƒνƒœμ— μžˆλŠ” PWA μ•±μ—μ„œ ν‘Έμ‹œ μ•Œλ¦Όμ΄ μ—¬λŸ¬λ²ˆ ν‘œμ‹œλ˜λŠ” μ΄μœ λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ©”μ‹œμ§€ μˆ˜μ‹ μ‹œ μ•Œλ¦Ό λ©”μ‹œμ§€μ— μ˜ν•œ κΈ°λ³Έ ν™”λ©΄ ν‘œμ‹œμ— λŒ€ν•΄ κ³ λ €ν•˜μ§€ μ•Šμ€ λ¬Έμ œμ— ν•΄λ‹Ήλœλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ»€μŠ€ν…€ λ©”μ‹œμ§€λ‘œ ν‘Έμ‹œ μ•Œλ¦Όμ„ μ œκ³΅ν•˜κ³  μ‹Άλ‹€λ©΄ μ„œλ²„μ—μ„œλŠ” μ•Œλ¦Ό λ©”μ‹œμ§€κ°€ ν¬ν•¨λ˜μ§€ μ•Šμ€ 데이터 λ©”μ‹œμ§€λ‘œ κ΅¬μ„±ν•˜μ—¬ μ „λ‹¬ν•΄μ•Όν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λΌμ΄μ–ΈνŠΈ API ν‚€λŠ” μ•ˆμ „ν•˜λ‹€

일반적으둜 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ λ™μž‘ν•˜λŠ” SDK에 λŒ€ν•œ ν‚€λŠ” 외뢀에 λ…ΈμΆœλ  수 밖에 μ—†μœΌλ―€λ‘œ FCM λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•  수 μžˆλŠ” μ΅œμ†Œν•œμ˜ κΆŒν•œμ„ λ³΄μœ ν•œλ‹€. FCM μ½˜μ†”μ—μ„œ μ›Ή ν‘Έμ‹œ μΈμ¦μ„œλŠ” μ΅œλŒ€ 2κ°œκΉŒμ§€ λ°œκΈ‰ν•  수 μžˆμœΌλ―€λ‘œ VAPIDλ₯Ό ν™˜κ²½λ³„λ‘œ λ‚˜λˆ„μ–΄μ„œ μ‚¬μš©ν•˜λŠ” 것도 쒋아보인닀. 더 μžμ„Έν•œ λ‚΄μš©μ€ Firebase용 API ν‚€ μ‚¬μš© 및 관리에 λŒ€ν•΄ μ•Œμ•„λ³΄κΈ°λ₯Ό μ°Έκ³ ν•˜μ—¬ 고렀해보도둝 ν•˜μž.

μ‹œμŠ€ν…œ 규λͺ¨μ— λ”°λ₯Έ 토큰 관리 μ „λž΅

FCM 등둝 토큰 관리λ₯Ό μœ„ν•œ ꢌμž₯사항과 FCM λ©”μ‹œμ§€λ₯Ό λŒ€κ·œλͺ¨λ‘œ 전솑할 λ•Œμ˜ ꢌμž₯사항λ₯Ό μ°Έκ³ ν•˜μ—¬ μ‹œμŠ€ν…œμ— μ €μž₯λ˜μ–΄ λ©”μ‹œμ§€ 전솑 μ‹œ μ‚¬μš©λ˜λŠ” ν† ν°μ˜ 수λ₯Ό κ΄€λ¦¬ν•˜λŠ”κ²Œ ν•„μš”ν•˜λ‹€. μ„œλ²„μ—μ„œλŠ” μ‚¬μš©μžκ°€ PWA 앱을 μ‚­μ œν•˜λŠ”μ§€λ₯Ό κ°μ§€ν•˜μ—¬ 더이상 토큰이 μ‚¬μš©λ˜μ§€ μ•ŠλŠ”μ§€ μ•Œ 수 μ—†λ‹€. FCM λ©”μ‹œμ§€ 전솑 μ‹œ λ¬΄μ œν•œμœΌλ‘œ λ°œμ†‘ν•  μˆ˜λŠ” μ—†μœΌλ―€λ‘œ μ˜€λž«λ™μ•ˆ μ‚¬μš©λ˜μ§€ μ•Šκ±°λ‚˜ 만료된 토큰은 주기적으둜 μ‚­μ œν•˜λŠ” μž‘μ—…μ΄ μžˆμ–΄μ•Όν•œλ‹€.

iOS의 PWA μ•± 지원 μ—¬λΆ€

μ•ˆλ“œλ‘œμ΄λ“œμ™€ 크둬 λΈŒλΌμš°μ €μ™€ 달리 iOS λ˜λŠ” μ‚¬νŒŒλ¦¬ λΈŒλΌμš°μ €μ— 따라 PWA μ•± μ„€μΉ˜ 및 ν‘Έμ‹œ APIλ₯Ό μ§€μ›ν•˜λŠ”μ§€μ˜ μ—¬λΆ€κ°€ 닀름을 μΈμ§€ν•΄μ•Όν•œλ‹€. λ˜ν•œ, ν™ˆ ν™”λ©΄μœΌλ‘œ μΆ”κ°€λ˜λŠ” 앱은 λ°˜λ“œμ‹œ 기본으둜 μ œκ³΅λ˜λŠ” μ‚¬νŒŒλ¦¬ λΈŒλΌμš°μ €λ‘œ μ‹€ν–‰λ˜λŠ” 것도 μ€‘μš”ν•œ 뢀뢄에 ν•΄λ‹Ήλœλ‹€.