C.W.K.
Stream
Lesson 04 of 06 · published

Scopes: 파일시스템 & 네트워크에 울타리 치기

~14 min · tauri, scopes, filesystem, security

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"permission은 문을 열어. scope는 방문자가 집 안 어디까지 걸어 들어갈지 정해."

맨 permission으론 왜 부족한가

fs:allow-read-text-file 부여는 '이 앱은 텍스트 파일을 읽을 수 있다'고 말해 — 근데 어떤 파일? scope 없이는 사용자 디스크 전체를 뜻할 수 있어. scope가 permission을 특정 경로(파일시스템용)나 특정 URL(네트워크용)로 좁혀. '파일 읽기 가능'이랑 '앱 자기 데이터 폴더 안 파일 읽기 가능'의 차이야. 디스크나 네트워크 만지는 건 뭐든, scope에 진짜 안전이 살아.

변수 있는 경로 scope

파일시스템 scope는 경로 패턴을 쓰고, Tauri가 변수를 줘서 절대 경로를 하드코딩 안 해: $APPDATA, $APPCONFIG, $HOME, $RESOURCE 등. permission을 allow(그리고 선택적으로 deny) 경로 패턴 객체로 써. $APPDATA/** 같은 glob은 '앱 데이터 디렉터리 아래 뭐든'을 뜻해. 민감한 하위 폴더용 deny랑 짝지으면 앱을 딱 만져야 할 영역에 울타리 친 거야.

최소 권한, 기계화

scope가 최소 권한을 구호에서 설정으로 바꾸는 방법이야. 기능이 $APPDATA에만 쓰는데 $HOME/**을 부여하지 마. API 호스트 하나만 부르는데 https://**를 허용하지 마. 넓히는 모든 와일드카드는 뚫린 프론트엔드가 악용할 공격 표면이야. 기능이 돌게 하는 제일 좁은 scope가 항상 정답이야 — 그리고 넓게 부여해야 할 때 deny 패턴이 정밀한 구멍을 뚫게 해줘.

Code

파일시스템을 앱 자기 데이터 디렉터리로 울타리·json
// capability 안 scope된 fs permission: 앱 데이터 디렉터리 안에서만
// 읽기/쓰기, 그리고 'secrets' 하위 폴더는 명시적으로 절대 안 됨.
{
  "identifier": "main-caps",
  "windows": ["main"],
  "permissions": [
    "core:default",
    {
      "identifier": "fs:allow-read-text-file",
      "allow": [{ "path": "$APPDATA/**" }],
      "deny":  [{ "path": "$APPDATA/secrets/**" }]
    },
    {
      "identifier": "fs:allow-write-text-file",
      "allow": [{ "path": "$APPDATA/**" }]
    }
  ]
}

External links

Exercise

앱의 fs permission 하나를 $APPDATA/**로 scope하고 $APPDATA/secrets/**용 명시적 deny를 둬. 허용 영역 안 파일을 읽는(됨) command랑 secrets/ 안을 읽는(거부됨) command(또는 fs 플러그인)를 써. deny가 이기는지 확인해. OS 혼자선 못 줄 정밀함으로 파일시스템에 울타리 친 거야.
Hint
permission의 객체 형태를 allow/deny 경로 배열로 써. $APPDATA는 (네 identifier로 이름 붙은) 앱 데이터 디렉터리로 풀려. 부모가 허용돼도 secrets/ 읽기는 실패해야 해 — deny-over-allow랑 scope가 같이 작동하는 거야.

Progress

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

댓글 0

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

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