File System Access API의 영구 권한

이제 권한을 반복적으로 부여하지 않고도 파일과 폴더에 대한 지속적인 읽기 및 쓰기 액세스 권한을 얻을 수 있습니다. 이 게시물에서는 작동 방식을 설명합니다. 자세히 살펴보기 전에 현재 상황과 해결되는 문제를 간략하게 요약합니다.

현재 방법의 문제

File System Access API를 사용하면 개발자가 읽기 및 쓰기(선택사항) 방식으로 사용자의 로컬 하드 디스크에 있는 파일에 액세스할 수 있습니다. 이 API를 활용하는 다른 여러 앱 중에서 인기 있는 앱은 브라우저에서 직접 실행되는 Microsoft의 IDE인 Visual Studio Code(VS Code)입니다. VS Code를 열면 새 파일을 만들거나 기존 파일 또는 폴더를 열 수 있는 Welcome 화면이 표시됩니다.

Visual Studio Code의 시작 화면

폴더 열기를 클릭하고 하드 디스크의 폴더 중 하나를 선택하면 VS Code에 이 폴더에 대한 보기 액세스 권한을 부여할지 묻는 메시지가 표시됩니다.

보기 액세스 권한을 요청하는 Visual Studio Code

액세스 권한을 부여하면 폴더 계층 구조를 탐색하고 VS Code 편집기에서 파일을 열 수 있습니다. 파일을 수정하면 폴더에 대한 edit 액세스 권한을 부여할지 묻는 메시지가 브라우저에 표시됩니다.

Visual Studio Code에서 수정 액세스 권한을 요청합니다.

이렇게 하면 주소 표시줄의 파일 아이콘이 변경되고 작은 아래쪽 화살표가 추가되어 앱에 읽기 및 쓰기 권한이 있음을 나타냅니다. 권한을 변경하려면 아이콘을 클릭한 후 액세스 권한 삭제를 클릭합니다. 그러면 앱에서 더 이상 파일을 수정할 수 없습니다.

주소 표시줄 아이콘 프롬프트가 있는 Visual Studio Code

액세스는 출처의 마지막 탭을 닫을 때까지 유지됩니다. 앱을 닫았다가 다시 열면 VS Code종류을 통해 중단한 부분부터 이어서 진행할 수 있습니다. 최근 열기를 클릭하면 VS Code는 이전에 열었던 폴더를 다시 열 수 있도록 제공합니다.

마지막으로 열린 파일을 제공하는 Visual Studio Code

하지만 이전에 폴더에 쓰기 권한을 부여했더라도 이제는 액세스 권한을 다시 부여해야 합니다. 진짜 빨리 피곤해. 솔루션, 즉 File System Access API의 영구 권한에 관해 알아보기 전에 VS Code는 어떻게 최근 폴더를 기억하나요?

새로고침 후 수정 액세스 권한을 요청하는 Visual Studio Code

File System Access API에서 파일 및 폴더 액세스는 FileSystemHandle 객체(파일의 경우 FileSystemFileHandle 객체, 폴더(디렉터리)의 경우 FileSystemDirectoryHandle 객체)를 통해 관리됩니다. 둘 다 IndexedDB에 저장할 수 있으며, 이것이 VS Code가 하는 일입니다. 이를 확인하려면 Chrome DevTools를 열고 Application 탭에서 IndexedDB 섹션으로 이동한 후 vscode-web-db 데이터베이스에서 관련 테이블 vscode-filehandles-store을 선택합니다.

저장된 FileSystemHandle과 함께 IndexedDB 섹션을 보여주는 Chrome DevTools의 Visual Studio Code 디버깅

새로운 방식: 변경사항과 시기

Chrome은 사용자가 파일 및 폴더에 대한 영구 액세스 권한을 선택적으로 부여하여 사용자에게 계속 메시지를 다시 표시할 필요가 없도록 하는 새로운 동작을 출시합니다. 새로운 동작은 Chrome 122부터 관찰됩니다. 이전에 테스트하려면 Chrome 120부터 chrome://flags/#file-system-access-persistent-permissionchrome://flags/#one-time-permission 두 플래그를 사용 설정됨으로 전환합니다.

첫째, 새로운 동작은 사용자가 방문할 때마다 선택한 파일 및 폴더에 대한 액세스 권한을 앱에 부여할 수 있는 새로운 3방향 권한 프롬프트로 구성됩니다.

3방향 권한 프롬프트가 있는 Visual Studio Code.

이 새로운 3방향 프롬프트에는 다음과 같은 옵션이 있습니다.

  • 이번 시간 허용: 앱이 현재 세션의 파일에 액세스하도록 허용합니다. 이는 기존 동작에 해당합니다.
  • 방문할 때마다 허용: 액세스 권한이 취소되지 않는 한 앱이 무기한 액세스할 수 있도록 허용합니다. 앱에 영구 액세스 권한이 부여되면 새로 열린 파일 및 폴더에도 영구적으로 액세스할 수 있습니다.
  • 허용 안함: 앱이 파일에 액세스하도록 허용하지 않습니다. (이는 기존 동작에 상응합니다.)

둘째, 사이트 설정에 새로운 섹션이 도입됩니다. 사용자는 파일 수정 전환 버튼 옆에 있는 실행 아이콘을 통해 이 섹션에 액세스할 수 있습니다.

파일 편집 아이콘이 있는 Visual Studio Code 사이트 설정

이 실행 아이콘을 클릭하면 해당 앱의 개인 정보 보호 및 보안 설정이 열리며, 사용자에게 앱이 액세스할 수 있는 모든 파일 및 폴더의 항목 목록이 표시됩니다. 휴지통 아이콘을 클릭하여 항목별로 액세스 권한을 취소할 수 있습니다. 항목별 액세스 권한을 삭제하면 일반적으로 앱에 여전히 파일 액세스 권한이 부여될 수 있습니다. 일반적으로 액세스 권한을 취소하려면 앞서 설명한 대로 주소 표시줄의 아이콘을 클릭하면 됩니다.

vscode.dev 사이트의 Chrome 개인 정보 보호 및 보안 설정

새 동작을 트리거하는 방법

File System Access API에 관한 개발자 측의 변경사항은 없습니다. 영구 권한으로 새 동작을 트리거하려면 세 가지 방법을 사용하여 충족해야 하는 전제조건이 다릅니다.

  1. 사용자가 출처를 마지막으로 방문했을 때 파일이나 폴더 (또는 여러 파일 또는 폴더)에 대한 권한을 부여해야 하며 앱은 상응하는 FileSystemHandle 객체를 IndexedDB에 저장했어야 합니다. 다음에 출처를 방문하면 앱은 IndexedDB에서 저장된 FileSystemHandle 객체 중 하나를 검색한 다음 FileSystemHandle.requestPermission() 메서드를 호출해야 합니다. 이러한 전제조건이 충족되면 새로운 3방향 프롬프트가 표시됩니다.
  2. 출처는 이전에 액세스가 부여된 FileSystemHandle에서 FileSystemHandle.requestPermission() 메서드를 호출했어야 하지만 이 메서드는 한동안 탭이 백그라운드에 있었기 때문에 액세스 권한이 자동으로 취소되었습니다. 권한 자동 취소는 Chrome의 일회성 권한 도움말에 설명된 것과 동일한 로직에 따라 작동합니다. 이러한 전제조건이 충족되면 새로운 3방향 프롬프트가 표시됩니다.
  3. 사용자가 앱을 설치해야 합니다. 사용자가 액세스 권한을 부여하면 설치된 앱이 자동으로 권한을 유지합니다. 이 경우 3방향 메시지가 표시되지 않고 대신 앱이 기본적으로 새 동작을 가져옵니다.

첫 번째와 두 번째 사례에서는 requestPermission() 메서드가 호출된 객체뿐만 아니라 앱이 이전에 액세스한 모든 FileSystemHandle 객체가 프롬프트에 나열됩니다. 일회성 권한에서 작동하는 방식에 맞춰 사용자가 메시지를 3번 이상 거부하거나 닫으면 더 이상 트리거되지 않으며 대신 일반 권한 메시지가 표시됩니다.

새로운 동작 사용해 보기

지원되는 Chrome 버전이 있거나 필요한 플래그가 설정된 경우 웹의 VS Code에서 새 동작을 테스트할 수 있습니다. 폴더를 열고 액세스 권한을 부여한 다음 탭을 닫았다가 다시 열고 최근 항목 열기를 클릭합니다. 프롬프트를 트리거하기 위해 즉시 새로고침할 수 없으므로 모든 탭을 닫아야 합니다. 이전 폴더를 선택하면 새 프롬프트가 표시됩니다. 보다 간단한 테스트 사례는 영구 파일 시스템 액세스 데모소스 코드를 확인하세요.

결론

File System Access API의 영구 권한은 API에서 가장 많이 요청되는 기능 중 하나이며 구현 버그도 큰 인기를 누리며 많은 개발자들이 이 기능을 활용하고 있습니다. 이 기능을 개발자, 그리고 무엇보다 사용자가 손에 맡기면서 플랫폼별 앱과 비교하여 기능 격차가 크게 좁혀졌습니다.

감사의 말

이 게시물은 크리스틴 홀링스워스, 오스틴 설리반, 레이첼 앤드류가 리뷰했습니다.