"웹뷰는 부탁만 할 수 있어. 행동은 코어만 해."
누가 뭘 돌리나
뇌 둘을 떠올려봐. 웹뷰 뇌는 화면의 언어로 생각해 — DOM, 이벤트, 레이아웃, 네 React 트리. 얘는 샌드박스 안이야 — 서버처럼 파일을 열거나, 프로세스를 띄우거나, 네트워크를 읽을 수 없어. 코어 뇌는 기계의 언어로 생각해 — 파일, 소켓, OS API, 스레드. 얘는 완전 권한자야. Tauri 설계 전부가 이 둘을 협력시키되, 못 믿을 쪽(웹뷰 — 원격이나 공격자 영향 받은 콘텐츠를 그릴 수도 있어)이 권한자 쪽으로 곧장 손 못 뻗게 하는 거야.
그래서 둘은 서로 함수를 직접 안 불러. 메시지를 보내. 웹뷰가 invoke('do_thing', { ... })를 부르면, Tauri가 그걸 네가 #[tauri::command]로 표시한 Rust 함수로 라우팅하고, 그 함수가 코어에서 돌아서 값을 돌려주면 웹뷰엔 resolve된 Promise로 도착해.
경계를 넘는 건 전부 데이터
두 반쪽이 메모리를 안 나눠 가지니까, 다리를 넘는 건 뭐든 직렬화돼 — 한쪽에서 평범한 데이터(JSON 떠올려)로 바뀌고 반대쪽에서 다시 조립돼. 웹뷰한테 살아있는 파일 핸들이나 DB 커넥션이 박힌 Rust 구조체를 건넬 순 없어. 숫자, 문자열, 배열, 객체를 건네지. 이건 HTTP API랑 대화할 때 이미 아는 규율이랑 똑같아 — 선로는 데이터를 나르지 살아있는 참조를 나르지 않아. 지금 몸에 새기면 bridge 트랙이 당연하게 느껴질 거야.
이게 동시에 보안 이야기인 이유
메시지 경계는 그냥 배관이 아냐 — 울타리야. 웹뷰는 네가 등록한 정확한 command만, 그리고 (security에서 보겠지만) capability가 허락한 것만 invoke할 수 있어. 프론트엔드의 버그나 주입된 스크립트가 디스크를 rm -rf 못 해. 프론트엔드엔 악용할 디스크 접근 자체가 없으니까 — 코어한테 부탁만 할 수 있고, 코어는 허락하라고 들은 요청에만 답해.