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나 사용자가 명시적으로 고른 폴더로 scope하고, 디스크 전체는 절대 안 돼. fs는 허술한 scope가 진짜 취약점이 되는 플러그인이라, 제일 빡빡하게 scope할 거야.

dialog: 네이티브 피커랑 프롬프트

dialog 플러그인은 진짜 OS 다이얼로그를 보여줘: open(파일/폴더 피커), save(다른 이름으로 저장), 메시지류 message/ask/confirm. fs랑 사랑스러운 시너지가 있어: 사용자가 다이얼로그로 파일을 고르게 하면, 반환된 경로는 사용자가 의식적으로 고른 거야 — 파일시스템 전체를 안 열고 기본 scope 너머 접근을 주는 자연스럽고 안전한 방법이야.

shell: 열기랑 실행 — 조심히

shell 플러그인(과 집중된 opener 플러그인)은 URL이나 파일을 사용자 기본 앱에서 열 수 있고, 프로세스를 실행할 수 있어. URL 열기는 저위험; 임의 명령 실행은 도구상자에서 제일 위험한 단일 권한이야. 셸 실행을 부여하면, 특정 고정 명령으로 scope해 — 프론트엔드가 임의 명령 문자열을 넘기게 절대 두지 마. 링크 열기만이면 전체 셸 실행보다 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

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

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