"capability는 문장 하나야. '이 창들은 이 권한을 쓸 수 있다.' Tauri 보안 모델 전체가 그 문장의 변주야."
capability 파일이 뭐냐면
capability는 src-tauri/capabilities/에 JSON 파일로 살아. 각 파일이 permission 묶음을 창 묶음에 이어줘. 모양은 작고 읽기 쉬워. identifier(이 capability의 이름), description, windows 배열(어느 창 label에 걸리는지), permissions 배열(뭘 허락하는지). Tauri가 빌드할 때 그 폴더의 파일을 전부 읽어서 앱의 접근 제어 목록을 조립해.
진짜 하나 읽어보자
Cinder의 실제 capability를 보자. main 창에 걸리고 딱 필요한 것만 허락해. core:default(기본으로 안전한 API 묶음), always-on-top 동작에 쓰는 창 permission 둘, 그리고 플러그인 셋(store, clipboard-manager, window-state)의 default 묶음. 없는 걸 봐. 파일시스템도, 셸도, 넓은 네트워크도 없어. Cinder는 쓰는 권한만 허락하고 그 이상은 안 줘 — 이 파일이 곧 앱이 할 수 있는 일의 정확한 목록이야.
창마다 권한을 다르게
capability가 걸릴 창을 직접 지목하니까, 창마다 권한 수준을 다르게 줄 수 있어. 메인 창은 clipboard랑 store가 필요할 수 있지만 설정 창은 거의 아무것도 필요 없을 수 있잖아. capability를 창별로 쪼개서, 덜 믿어도 되거나 단순한 창이 쓸 일 없는 권한에 못 닿게 해. 이게 최소 권한을 구조로 표현한 거야 — 창별로 나눠 주는 건 대충 넘겨도 되는 디테일이 아니라 적극적으로 써야 할 기능이야.