본문으로 건너뛰기

개발 중 보안

좋든 싫든, 오늘날의 앱은 수많은 공격을 받을 수 있고, 또 정기적으로 받는 운영 체제에서 살고 있습니다. 보안에 취약한 앱이 운영 체제를 우회해 들어올 취약점이 될 때, 전문 해커들이 사용하는 도구에 기여하는 셈이 됩니다. 도구가 되어서는 안됩니다.

이것이 당신의 앱에서 보안을 향상시키고, 의도치 않은 시스템 레벨 인터페이스 접근을 막고, 안전한 앱을 만들기 위해 최선을 다하는 이유입니다. 사용자는 개발자가 모범 사례를 따를 거라 생각합니다. 저희는 모범 사례를 따르기 쉽게 만듭니다, 하지만 아래 내용에 대해 여전히 알아둘 필요가 있습니다.

보안은 커뮤니티의 책임입니다

Tauri 앱의 보안 수준은 Tauri 그 자체와 Rust 의존성, npm 의존성, 작성하신 코드, 그리고 최종 앱을 실행하는 기기의 보안 수준까지 모두 합산한 것임을 기억하셔야 합니다. Tauri 팀은 최선을 다하고, 보안 커뮤니티 역시 제 역할을 하겠지만, 꼭 중요한 모범 사례들을 적용하셔야 합니다.

앱을 최신 상태로 유지해야 합니다

앱을 출시할 때, Tauri를 포함한 번들 역시 보내야 합니다. 따라서, Tauri에 영향을 주는 취약점이 앱 보안에 영향을 줄 수 있습니다. Tauri를 최신 버전으로 업데이트해, 치명적인 취약점이 이미 패치되어 앱을 악용할 수 없도록 해야 합니다. 또, 컴파일러 (rustc)와 트랜스파일러 (nodejs) 역시 종종 해결된 보안 문제들을 내려받아야 하므로 최신 상태를 유지해야 합니다.

의존성을 검토해야 합니다

npm과 Create.io에서는 편리한 패키지를 많이 제공하지만, 신뢰할 수 있는 서드 파티 라이브러리를 고르거나 Rust로 새로 작성하는 것은 귀하의 몫입니다. 만약 알려진 취약점에 영향을 받거나 더이상 관리되지 않는 오래된 라이브러리를 쓰신다면 앱의 보안과 여러분의 수면 시간이 위험에 처할 수 있습니다. npm audit이나 cargo audit 등의 도구를 사용해 검증 과정을 자동화하고 보안 커뮤니티의 중요 업무에 기대어보세요.

더 안전한 코드를 적용해야 합니다

앱의 제1차 방어선은 귀하께서 작성하신 코드입니다. Tauri가 교차 사이트 스크립팅이나 원격 코드 실행 등 일반적인 웹 취약점에서 보호해줄 수 있음에도 부적절한 설정은 보안에 영향을 줄 수 있습니다. 그런 상황이 아니더라도, 보안 소프트웨어 개발 모범 사례 적용 및 보안 테스트를 수행하는 편이 좋습니다. 이 말의 의미는 다음 구획에서 더 자세히 설명하겠습니다.

사용자를 가르쳐야 합니다

진정한 보안은 예상치 못한 동작이 일어나지 않게 하는 것을 의미합니다. 즉, 더 안전해진다는 것은 오로지 일어나길 원하는 일만 일어난다는 것을 알고 마음의 평화를 갖는 것입니다. 그러나, 현실 세계에서는 이상적인 "꿈"일 뿐입니다. 하지만, 최대한 많은 위험 요소를 제거하고 견고한 기반 위에 구축함으로써 Tauri 선택했다는 것은 사용자와 사용자의 안전 및 장치 보호에 관심이 있다는 신호입니다.

위협 모델

Tauri 앱은 생애 주기의 여러 지점에서 수많은 조각으로 구성됩니다. 여기에 일반적인 위협과 그 대응책을 설명해두었습니다.

업스트림 위협

Tauri는 프로젝트에 대한 직접적인 종속성이며 커밋, 검토, 풀 요청 및 릴리스에 대한 엄격한 권한 제어를 유지합니다. 저희는 최신 의존성을 유지하고, 업데이트, 포크 그리고 수정 조치를 취하기 위해 최선을 다합니다. 다른 프로젝트는 잘 관리되지 않을 수 있고, 검사조차 받지 않았을 수 있습니다. 다른 프로젝트를 가져오기 전에 건강한 프로젝트인지 고민하세요. 그렇지 않으면 모르는 사이 기술 부채를 받을 수도 있습니다.

개발 위협

개발자라면 개발 환경에 관심을 가질 거라 생각합니다. 운영 체제, 빌드 도구, 그리고 연관 의존성을 최신으로 유지하는 것은 개발자의 몫입니다.

우리 모두가 마주할 진짜 위험은 일반적으로 프로젝트의 직접 의존성을 공격하는 것으로, "공급망 공격"이라고도 알려져 있습니다. 하지만, 점점 더 많은 종류의 공격이 개발 시스템을 직접 표적으로 삼고 있으므로 이 문제를 정면으로 해결해야 합니다.

추천하는 방법 하나는 중요한 의존성을 오직 git에서 해시 리비전으로, 하다못해 차선책으로 태그 이름으로 가져오는 것입니다. Rust 생태계 뿐만 아니라 Node 생태계에서도 마찬가지입니다. 또, 모든 기여자가 커밋을 서명하도록 하고 Git 브랜치와 파이프라인을 보호하시는 것이 좋습니다.

빌드 시간 위협

현대 조직은 바이너리 결과물 생성을 위해 CI/CD를 사용합니다. Tauri에서는 여러 플랫폼에서 빌드하기 위한 GitHub Worlflow도 제공합니다. 만약 자체 CI/CD를 만들었고, 서드 파티 도구에 의존한다면 버전을 명시적으로 고정하지 않은 액션이 있는지 살펴보셔야 합니다.

배포할 플랫폼을 위한 바이너리를 서명할 필요가 있고, 그 작업이 복잡하고 설정하는 비용이 클 수 있으나 최종 사용자는 개발자가 앱을 검증했기를 기대합니다.

실행 시간 위협

웹뷰가 안전하지 않다고 가정했기 때문에, Tauri는 신뢰할 수 없는 사용자 콘텐츠를 불러오는 상황에서 웹뷰의 시스템 API 접근에 대한 여러 보호를 구현했습니다.

상세한 내용은 아래에서 읽어보실 수 있습니다. 하지만 CSP를 사용하면 웹뷰가 사용할 수 있는 통신 유형이 잠깁니다. 나아가, 문맥 격리는 신뢰할 수 없는 콘텐츠나 스크립트가 웹뷰 내부에서 API에 접근하는 것을 막습니다.

그리고 부디, 무엇을 하시든 웹뷰에서의 개인 키 암호화 결과를 절대 신뢰하지 마세요. Rust가 존재하는 이유입니다.

업데이트 도구 위협

우리는 가능한 간단하고 안전하게 앱에 최신 업데이트를 제공하기 위해 최선을 다했습니다. 그러나, 매니페스트 서버, 빌드 서버, 혹은 바이너리 호스팅 서비스의 제어 권한을 잃는다면 무의미해집니다. 만약 자체 시스템을 구축한다면, 전문 OPS 아키텍트에게 의견을 묻고 올바르게 구축하세요.

안전한 콘텐츠 불러오기

Tauri는 HTML 페이지에서 콘텐츠 보안 정책 (CSP)을 제한합니다. 로컬 스크립트 이름은 해시되고, 스타일과 외부 스크립트는 암호화 논스로 참조됩니다. 이로써 허가되지 않은 콘텐츠를 불러오지 못하게 막을 수 있습니다.

위험

CDN을 통해 제공되는 스크립트 등 공격 요소로 활용될 여지가 있는 원격 콘텐츠를 불러오는 것을 피하세요. 또, 신뢰 불가능한 파일은 새롭고 파악하기 어려운 공격 요소가 될 수 있습니다.

CSP 보호는 [tauri > security > csp]가 Tauri 설정 파일에서 켜진 경우에만 활성화됩니다. 최대한 제약되어 있게 만드시는 편이 좋습니다. 웹뷰는 신뢰할 수 있는, 그리고 가능하면 직접 소유하고 있는 곳에서만 애셋을 불러올 수 있게 해야 합니다. 컴파일 시간에, Tauri는 논스와 해시 값에 CSP 속성을 자동으로 덧붙입니다. 따라서, 앱의 어떤 점이 특별한지만 고민하시면 됩니다.

script-src, style-src, CSP 출처를 살펴보시면 이 보호 정책에 대해 더 많이 알아보실 수 있습니다.