본문 바로가기
C.W.K.
Stream
Lesson 04 of 07 · published

plugin-updater로 자동 업데이트

~14 min · tauri, updater, security, distribution

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"업데이트 채널은 사용자 기계로 곧장 이어지는 관이야. 거기 흐르는 걸 서명해. 안 그러면 공격자의 꿈을 대신 지어준 거야."

updater가 하는 일

updater 플러그인은 내보낸 앱이 스스로 새 버전을 확인하고 받아서 설치하게 해줘. 스토어를 거칠 필요 없이. 앱이 네가 띄워둔 엔드포인트를 주기적으로 확인하고, 버전을 비교하고, 더 새 게 있으면 받아서 적용해. 직접 배포하는 데스크톱 앱한테는, 모든 사용자한테 다시 받으라고 하지 않고도 고친 걸 밀어줄 수 있는 방법이야.

믿음의 뿌리는 서명이야

여기가 틀리면 안 되는 부분이야. 업데이트는 곧 사용자 기계에서 실행될 바이너리니까 암호학적으로 서명돼 있어야 해. tauri signer generate로 키 쌍을 만들어. 공개 키는 tauri.conf.json에 들어가서 앱에 박히고, 비공개 키는 릴리스할 때 업데이트 번들에 서명해. 앱은 설치하기 전에 번들 서명을 자기 안에 박힌 공개 키로 검증하고. 그러니까 공격자가 네 업데이트 서버를 장악해도 악성코드를 못 밀어 — 네 비공개 키가 없으니 서명 검증에서 걸리거든. 믿음은 서명에 있지 URL에 있는 게 절대 아냐.

매니페스트랑 전체 흐름

네 업데이트 엔드포인트가 최신 버전이랑 플랫폼별 다운로드 URL이랑 서명을 적은 작은 JSON 매니페스트를 내보내. 플러그인이 그걸 가져와서 업데이트가 필요한지 판단하고, (맞는 capability가 있으면) 받아서 설치해. 사용자 경험은 네가 정해. 조용히 백그라운드에서 업데이트하든, 물어보고 확인받든. 어느 쪽이든 그 비공개 서명 키만은 앱의 목숨줄처럼 지켜 — 실제로 그게 목숨줄이니까.

Code

업데이트 서명 키 쌍 만들기·bash
# updater 키페어 생성 (한 번; 비공개 키를 안전하게 보관).
npm run tauri signer generate -- -w ~/.tauri/myapp.key
# 공개 키 출력 → tauri.conf.json updater.pubkey에 붙여넣기
# 비공개 키(랑 비밀번호)는 릴리스 때 업데이트 번들에 서명.
검증까지 마친 업데이트를 확인하고 적용하기·tsx
import { check } from "@tauri-apps/plugin-updater";
import { relaunch } from "@tauri-apps/plugin-process";

const update = await check();   // 네 매니페스트 엔드포인트를 침
if (update) {
  // 이게 resolve되기 전에 플러그인이 서명을 검증해.
  await update.downloadAndInstall();
  await relaunch();             // 새 버전으로 재시작
}

External links

Exercise

앱의 업데이트 신뢰 사슬 전체를 네 말로 설명해봐. 키 쌍이 어디서 나오는지, 어느 키가 앱에 들어가고 어느 키가 릴리스에 서명하는지, 매니페스트엔 뭐가 담기는지, 그리고 업데이트 서버가 뚫려도 왜 악성코드를 못 미는지 정확한 이유까지. 그다음 비공개 키를 어디 둘지 말해. URL이 아니라 서명이 자동 업데이트를 지킨다는 걸 이해했다는 증거야.
Hint
tauri signer generate → 공개 키는 tauri.conf에(앱에 실려), 비공개 키가 번들에 서명. 매니페스트엔 버전이랑 플랫폼별 URL이랑 서명이 들어가. 서버를 뺏겨도 비공개 키가 없으면 서명을 위조 못 하니까 앱이 나쁜 번들을 거부해. 비공개 키는 보호된 CI 시크릿에 두고 따로 안전하게 백업.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.