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

fs, dialog, shell: 시스템 만지기

~14 min · tauri, fs, dialog, shell

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"이 세 플러그인이 네 앱이 사용자 기계로 손을 뻗는 자리야 — 그래서 제일 조심해야 할 자리이기도 하고."

fs: 파일 읽고 쓰기

fs 플러그인은 프론트엔드에 파일 접근을 열어줘 — readTextFile, writeTextFile, readDir 같은 것들 — 단, 네 capability scope가 허락한 경로 안에서만(security 트랙에서 배운 게 여기서 살로 붙는 거야). 방식은 이래. 읽기랑 쓰기를 $APPDATA나 사용자가 직접 고른 폴더로 좁히고, 디스크 전체는 절대 열지 마. fs는 허술하게 좁힌 scope가 그대로 취약점이 되는 플러그인이라, 제일 빡빡하게 조여야 할 대상이야.

dialog: 네이티브 파일 피커랑 다이얼로그

dialog 플러그인은 진짜 OS 다이얼로그를 띄워. open(파일이나 폴더 고르기), save(다른 이름으로 저장), 그리고 message/ask/confirm 같은 메시지 다이얼로그들. fs랑 궁합이 아주 좋아. 사용자가 다이얼로그로 파일을 직접 고르게 하면 돌아오는 그 경로는 사용자가 의식하고 고른 거잖아 — 파일시스템 전체를 열지 않고도 기본 scope 너머 접근을 주는, 자연스럽고 안전한 방법이야.

shell: 열기랑 실행 — 조심히

shell 플러그인(이랑 그것만 떼어낸 opener 플러그인)은 URL이나 파일을 사용자 기본 앱으로 열 수 있고, 프로세스도 실행할 수 있어. URL 열기는 위험이 낮아. 근데 아무 명령이나 실행하게 하는 건 이 도구상자에서 제일 위험한 권한이야. 셸 실행을 열어줄 거면 정해진 명령 하나로 딱 좁혀 — 프론트엔드가 명령 문자열을 마음대로 넘기게 두는 건 절대 안 돼. 링크만 열면 되는 거면 셸 실행 전체보다 opener를 골라. 더 작고 더 안전한 허락이야.

Code

고르고 읽기, 그리고 URL 안전하게 열기·tsx
import { open } from "@tauri-apps/plugin-dialog";
import { readTextFile } from "@tauri-apps/plugin-fs";
import { openUrl } from "@tauri-apps/plugin-opener";

// dialog → fs 시너지: 사용자가 파일을 고르니 경로가 신뢰돼.
const path = await open({ multiple: false, filters: [{ name: "Text", extensions: ["txt", "md"] }] });
if (typeof path === "string") {
  const contents = await readTextFile(path);
  console.log(contents);
}

// 기본 브라우저에서 링크 열기 — 저위험, opener 선호.
await openUrl("https://v2.tauri.app/");

External links

Exercise

'파일 열어서 보여주기' 흐름을 만들어봐. dialog 플러그인으로 사용자가 .txt 파일을 고르게 하고, fs 플러그인으로 읽어서 화면에 띄워. 파일시스템 scope를 넓게 열 필요가 없었다는 걸 확인해 — 다이얼로그가 사용자가 고른 경로를 건네줬으니까. 그다음 이 일에 왜 shell execute를 피하는지, 파일을 바깥 앱으로 열어야 하면 뭘 쓸지 한 문장으로 써.
Hint
dialog.open()이 고른 경로를 돌려주고, readTextFile(path)가 읽어. shell execute는 제일 위험한 허락이니 피하고, 파일을 기본 앱으로 열려면 셸 명령 말고 opener 플러그인(openPath)을 써.

Progress

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

댓글 0

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

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