개발자 정책 및 보안 가이드라인

Simon Hangl
Simon Hangl
Demián Renzulli
Demián Renzulli

분리형 웹 앱 (IWA)은 웹 애플리케이션이 일반적으로 표준 '드라이브 바이' 웹에서 제한되는 Direct SocketsControlled Frame과 같은 강력한 기능에 액세스할 수 있는 보안 모델을 제공합니다. IWA는 신뢰도가 높은 환경에서 작동하므로 엄격한 보안 및 개인 정보 보호 정책을 준수해야 합니다. 이 가이드라인은 웹 플랫폼의 기능이 강화됨에 따라 사용자가 안전하게 유지되고 브라우저 환경의 무결성이 유지되도록 설계되었습니다.

IWA 신뢰 모델

IWA 플랫폼의 핵심은 개발자가 높은 수준의 보안을 유지하도록 강제하는 엄격한 기술 정책을 중심으로 구축됩니다. 표준 웹 앱은 유연한 권한 모델을 사용하는 반면 IWA는 암호화 방식으로 서명되고 Web Bundle을 사용하여 제공되므로 출처와 무결성을 확인할 수 있습니다.

이 확인된 ID를 대가로 IWA는 권한이 있는 API에 액세스할 수 있습니다. 이러한 신뢰를 유지하기 위해 개발자는 강력한 기능을 사용할 때도 사용자 안전을 보장하는 강력한 콘텐츠 보안 정책 (CSP) 및 신뢰할 수 있는 유형을 비롯한 더 엄격한 정책을 준수하여 보안 우선 접근 방식을 따라야 합니다. 이는 다음을 의미합니다.

  • 투명성: 사용자는 애플리케이션의 권한 있는 API 사용에 놀라지 않아야 합니다.
  • 최소 권한: 앱은 명시된 목적에 필요한 특정 기능만 요청하고 사용해야 합니다.
  • 정적 무결성: 모든 실행 가능한 로직은 보안 감사를 허용하고 악성 코드의 사이드로드를 방지하기 위해 앱 패키지 내에 자체적으로 포함되어야 합니다.

IWA에는 외부 스크립트의 실행을 방지하는 엄격한 콘텐츠 보안 정책 (CSP)과 같은 강력한 기본 보호 기능이 포함되어 있지만 기술적 제약만으로는 모든 위험을 완화할 수 없습니다. 신뢰도가 높은 환경에서도 특정 구현 패턴이나 개발자 선택으로 인해 사용자 안전이나 개인 정보 보호가 의도치 않게 침해될 수 있습니다. 이 가이드에서는 이러한 제한된 시나리오와 권한이 있는 API 사용을 관리하는 정책을 간략하게 설명합니다.

이 가이드라인이 중요한 이유

이러한 정책을 준수하는 것은 규정 준수뿐만 아니라 고급 웹 애플리케이션을 위한 지속 가능한 생태계를 구축하는 데도 중요합니다. 이 가이드라인을 따르면 애플리케이션이 다음을 충족합니다.

  • 보안 회귀 방지: 로직을 자체적으로 포함하여 교차 사이트 스크립팅 (XSS) 및 원격 코드 실행과 같은 취약점을 방지합니다.
  • 사용자 개인 정보 보호: 민감한 데이터와 하드웨어 액세스가 명시적인 사용자 의도와 투명성을 통해서만 처리되도록 합니다.
  • 플랫폼 수명 보장: IWA 플랫폼이 기능 세트를 계속 확장하는 데 필요한 높은 보안 표준을 유지하는 데 도움이 됩니다.

핵심 원칙

투명성 및 사용자 의도

가장 기본적인 규칙은 사용자를 놀라게 하지 않는 것입니다. 애플리케이션의 동작은 명시된 목적 및 사용자 기대치와 일치해야 합니다.

  • 범위 내 유지: 애플리케이션의 명확한 목적을 벗어나는 기능을 구현하지 마세요.
  • 최소 API 사용 공간: 앱의 핵심 기능을 달성하는 데 필요한 특정 IWA API 세트만 요청하고 사용합니다.

동적 코드 사이드로드 불가

IWA 보안 모델은 관리자 또는 브라우저 공급업체가 모든 실행 가능한 로직을 확인할 수 있는지에 따라 달라집니다. 따라서 IWA 패키지는 독립적이어야 합니다. 플랫폼은 eval()new Function()와 같은 문자열 기반 실행을 차단하는 엄격한 콘텐츠 보안 정책 (CSP)을 통해 이를 적용합니다.

script-src 'self' 'wasm-unsafe-eval';
require-trusted-types-for 'script';

CSP를 사용하면 'wasm-unsafe-eval'에서 WebAssembly를 지원할 수 있지만 이 보안 경계의 정신을 우회해서는 안 됩니다.

엄격히 금지된 행위

  • 원격 코드용 인터프리터 제공: 직접 소켓과 같은 권한 있는 네트워크 액세스를 사용하여 외부 스크립트를 다운로드하고 실행하는 코드 인터프리터 (예: WASM으로 컴파일된 Python 또는 Lua)를 포함할 수 없습니다.
  • 원격으로 로드된 로직: 서비스 워커를 사용하여 원격으로 로드된 코드를 IWA 출처에 삽입하지 마세요.
  • 코드와 데이터: JSON과 같은 데이터 다운로드는 허용되지만 해석되거나 실행되도록 설계된 코드를 다운로드하는 것은 직접적인 정책 위반입니다.

최소 권한의 원칙

항상 작업을 수행할 수 있는 가장 약한 API를 사용하세요. 권한이 있는 IWA 전용 API는 표준 웹 API의 보안 제약 조건이나 사용자 프롬프트를 우회하는 바로가기로 사용해서는 안 됩니다. 다음 표에는 기존 웹 API와 IWA 관련 기능을 언제 사용해야 하는지 결정하는 데 도움이 되는 일반적인 사용 사례가 나와 있습니다.

작업 표준 웹 API 사용 (권장) 권한이 있는 IWA API 피하기 (제한됨)
외장 하드 드라이브 액세스 표준 파일 I/O에는 File System Access API를 사용합니다. 무제한 WebUSB를 사용하여 저장소에 액세스하지 마세요.
스마트 카드 상호작용 Smart Card API를 사용합니다. 스마트 카드에는 제한 없는 WebUSB를 사용하지 마세요.
직렬 기기 통신 기기에 충분한 경우 WebSerial API를 사용합니다. WebSerial이 작업을 실행할 수 있는 경우 제한 없는 WebUSB를 사용하지 마세요.
신뢰할 수 있는 콘텐츠 삽입 표준 <iframe>를 사용합니다. 분리가 필요한 경우가 아니라면 간단한 삽입에 <controlledframe>를 사용하지 마세요.

API별 가이드라인

IWA API는 일반적으로 브라우저에서 제한되는 강력한 기능을 제공합니다. 일반적인 가이드라인은 사용자를 놀라게 하거나 사용자의 신뢰와 데이터를 손상시키는 방식으로 이러한 권한이 있는 기능을 사용하지 않는 것입니다.

Direct Sockets API

Direct Sockets API는 멀티캐스트 및 로컬 네트워크 액세스를 비롯한 원시 TCP 및 UDP 액세스를 부여합니다.

허용됨

  • 맞춤 프로토콜 지원: 현재 상위 수준 웹 API가 없는 맞춤 프로토콜을 사용하는 원격 서버에 연결합니다.
  • 백엔드 서비스 유지: 애플리케이션의 백엔드 서비스에만 사용되는 미리 정의된 하드 코딩된 서버에 연결합니다.
  • 필수 하드웨어 검색: 로컬 네트워크에 액세스하거나 멀티캐스트를 사용하여 앱의 기능에 필수적인 특정 관련 하드웨어 (예: 네트워크 연결 스토리지를 찾는 동영상 편집 앱)를 검색합니다.

허용되지 않음

  • 사용자에게 놀라움을 선사함: 텍스트 편집기가 로컬 네트워크 기기와 통신하는 등 앱의 기본 기능으로 명확하게 정당화되지 않는 네트워크 액세스를 구현합니다.
  • 임의로 네트워크 스캔: 사용자를 프로파일링하거나 관련 없는 기기를 검색하기 위해 사용자의 로컬 네트워크를 광범위하게 스캔합니다 (예: 192.168.1.0/24 포트 스캔).
  • 로컬 기기 타겟팅: 로컬 네트워크의 다른 기기를 조사하거나 재구성하거나 공격하는 행위는 엄격히 금지됩니다.

Controlled Frame API

<controlledframe> 요소를 사용하면 스크립트 삽입 및 헤더 변경을 비롯한 교차 출처 콘텐츠를 삽입하고 수정할 수 있습니다.

허용됨

  • 사용자 인터페이스 간소화: 서드 파티 서비스를 삽입하고 CSS를 삽입하여 관련 없는 UI 요소를 숨기거나 더 일관된 환경을 제공합니다.
  • 보안 통신 중재: postMessage로 삽입된 페이지에서 요청을 수신하고 권한이 있는 API를 통해 가져온 필수 데이터만 삭제하여 반환하는 방식으로 게이트키퍼 역할을 합니다.

허용되지 않음

  • 사용자 인증 정보 도용: 삽입된 콘텐츠에서 비밀번호, 세션 쿠키 또는 기타 민감한 사용자 데이터를 캡처하는 스크립트를 삽입합니다.
  • 서비스 약관 위반: 프로그래매틱 광고 클릭 또는 무단 스크래핑과 같이 서비스 약관을 위반하는 방식으로 삽입된 플랫폼을 변경합니다.
  • 권한 있는 액세스 프록시: 신뢰할 수 없는 삽입된 콘텐츠에 권한 있는 IWA API에 대한 직접 또는 제어되지 않은 액세스 권한을 부여하는 통과를 만듭니다.
  • 통제되지 않는 AI 구현: 구체적이고 투명한 사용 사례 제약 조건 없이 AI를 통해 로그인한 사용자를 대신하여 작업을 실행합니다.

제한 없는 화면 녹화

표준 웹에서 발견되는 반복적인 사용자 권한 메시지 없이 화면 캡처를 허용합니다.

허용됨

  • 핵심 기능 제공: 가상 회의 또는 튜토리얼 녹화 기능과 같이 화면 캡처를 앱 서비스의 명백한 부분으로 사용합니다.
  • 사용자 인지 보장: 사용자가 애플리케이션과 상호작용하기 전에 녹화가 발생할 수 있음을 명확하게 알립니다.

허용되지 않음

  • 은밀한 녹화: 사용자의 명시적이고 사전 지식 및 동의 없이 사용자의 화면을 캡처합니다.
  • 개인 정보 보호 규정 위반: 현지 또는 국제 개인 정보 보호법을 위반하는 녹화 관행에 참여하는 행위

무제한 WebUSB

제한 없는 WebUSB는 표준 WebUSB 차단 목록을 우회하여 기기와의 하위 수준 상호작용을 허용합니다.

허용됨

  • 독점 하드웨어 지원: 산업용 컨트롤러와 같이 고급 웹 API가 없는 특수 하드웨어나 기존 하드웨어와 상호작용합니다.

이제 허용됨

창 관리 (window.openwindow.focus)

IWA는 표준 웹에 필요한 사용자 동작 없이 팝업을 만들고 창에 포커스를 둘 수 있습니다.

허용됨

  • 작업 완료 알림: 동영상 렌더링과 같이 사용자가 시작한 중요한 백그라운드 작업이 완료되면 앱 창에 포커스를 맞춥니다.

허용되지 않음

  • 스팸: 요청되지 않은 창을 여러 개 표시하여 사용자를 괴롭힙니다.
  • 피싱: 시스템 대화상자를 모방하거나 사용자를 속이도록 설계된 창을 엽니다.
  • 포커스 훔치기: 중요하지 않은 이벤트에 대해 다른 애플리케이션에서 포커스를 훔쳐 사용자를 방해합니다.

결론

격리된 웹 앱의 보안 아키텍처는 사용자를 위한 신뢰도 높은 환경을 유지하면서 개발자에게 권한을 부여하도록 설계되었습니다. 이 가이드라인을 준수하면 애플리케이션이 IWA 생태계의 책임감 있는 시민으로 유지됩니다. 이 가이드에서 가장 중요한 내용은 다음과 같습니다.

  • 투명성 우선시: 애플리케이션의 동작은 항상 명시된 목적과 일치해야 합니다. 사용자를 놀라게 하거나 배신하는 기능을 구현해서는 안 됩니다.
  • 패키지 무결성 적용: 정적 확인을 허용하려면 모든 실행 가능 로직이 IWA 번들 내에 자체적으로 포함되어야 합니다. 동적 코드 사이드로드 또는 원격 인터프리터를 통해 보안 모델을 우회하는 것은 엄격히 금지됩니다.
  • 최소 권한 준수: 주어진 작업에 사용할 수 있는 가장 제한적인 API를 항상 선택하세요. 권한이 있는 IWA API는 애플리케이션의 핵심 기능에 표준 웹 API가 충분하지 않은 경우에만 사용해야 합니다.
  • 게이트키퍼 역할: <controlledframe>와 같은 강력한 도구를 사용하는 경우 IWA는 신뢰할 수 없는 콘텐츠의 투명 프록시가 아닌 보안 중재자 역할을 해야 합니다.

IWA를 게시하기 전에 다음 질문을 통해 구현을 최종 감사하세요.

  1. 이 작업에 가장 간단하고 제약이 많은 API를 사용하고 있나요?
  2. 사용자가 내 앱의 동작에 놀라거나 배신감을 느끼지 않나요?

첫 번째 질문에 대한 답이 '아니요'이거나 두 번째 질문에 대한 답이 '예'인 경우 애플리케이션이 IWA 보안 정책을 위반할 가능성이 높으며 삭제될 수 있습니다.