웹용 Permissions API

이전에 Geolocation API를 사용해 본 적이 있다면 메시지를 표시하지 않고 Geolocation을 사용할 권한이 있는지 확인하고 싶었을 것입니다. 불가능했습니다. 현재 위치를 요청해야 했으며, 이로 인해 권한 상태가 표시되거나 사용자에게 메시지가 표시되었습니다.

일부 API는 이 방식으로 작동하지 않습니다. Notifications API에는 Notification.permission을 통해 현재 권한 상태를 확인할 수 있는 자체 방법이 있습니다.

웹 플랫폼의 API가 늘어남에 따라 개발자가 API별로 작동 방식을 기억하지 않고도 권한 상태를 확인할 수 있는 단일 표준 방식이 필요합니다. Chrome 버전 43에서 사용할 수 있는 Permission API는 API의 권한 상태를 확인하는 단일 표준 방법으로 사용하기 위한 것입니다.

permissions.query()

permissions.query() 메서드를 사용하여 권한 상태를 확인합니다. 이렇게 하면 부여됨 (권한이 있음), 거부됨 (API 액세스가 차단됨) 또는 메시지 표시 (사용자에게 메시지가 표시되어야 함)의 상태가 반환됩니다. 예를 들면 다음과 같습니다.

// Check for Geolocation API permissions
navigator.permissions.query({name:'geolocation'})
    .then(function(permissionStatus) {
    console.log('geolocation permission state is ', permissionStatus.state);

    permissionStatus.onchange = function() {
        console.log('geolocation permission state has changed to ', this.state);
    };
    });

쿼리 메서드는 권한 이름을 정의하는 PermissionDescriptor 객체를 사용합니다. 응답은 PermissionStatus 객체로 확인되는 Promise입니다. 이 객체에서 permissionStatus.state를 사용하여 '부여됨', '거부됨' 또는 '메시지'의 상태를 확인할 수 있습니다. permissionStatus.onchange의 이벤트 핸들러를 구현하고 권한 상태 변경을 처리할 수도 있습니다.

지원되는 PermissionDescriptors

위 예에서는 다음과 같은 권한 설명자 {name:'geolocation'}를 사용하여 위치 정보 액세스 권한 상태를 쿼리하는 방법을 보여줍니다.

알림 권한 설명자는 이름 속성 {name:'notifications'}만 필요하므로 유사합니다.

Pushmidi에는 각각 해당 API에만 적용되는 추가 매개변수가 있습니다.

푸시 권한의 경우 userVisibleOnly 매개변수를 제공할 수 있습니다. 모든 푸시 메시지에 알림을 표시할지 또는 무음 푸시 알림을 보낼지 여부를 나타냅니다. 현재 Chrome은 알림이 있는 푸시 메시지만 지원합니다. 다음과 같이 사용할 수 있습니다.

navigator.permissions.query({name:'push', userVisibleOnly:true})

Midi는 sysex 매개변수를 허용합니다. 시스템 전용 메시지를 보내거나 수신해야 하는지 여부를 나타냅니다. 미디의 경우 다음과 같습니다.

navigator.permissions.query({name:'midi', sysex:true})

권한 요청

사용자에게 권한을 요청하는 방법은 특정 API에 따라 다릅니다. 예를 들어 getCurrentPosition()를 호출하면 위치정보에 권한 메시지가 표시됩니다.

navigator.geolocation.getCurrentPosition(function(position) {
    console.log('Geolocation permissions granted');
    console.log('Latitude:' + position.coords.latitude);
    console.log('Longitude:' + position.coords.longitude);
});

반면 알림은 requestPermission()를 호출할 때 사용자에게 메시지를 표시합니다.

Notification.requestPermission(function(result) {
    if (result === 'denied') {
    console.log('Permission wasn\'t granted. Allow a retry.');
    return;
    } else if (result === 'default') {
    console.log('The permission request was dismissed.');
    return;
    }
    console.log('Permission was granted for notifications');
});

여기서 중요한 점은 Permission API를 사용하면 현재 웹에 있는 다양한 API를 지원하면서 권한 상태를 일관된 방식으로 모니터링할 수 있다는 것입니다.

이렇게 하면 사용자에게 추가 권한이 필요한 이유가 명확한 경우에만 메시지를 표시하고 권한이 부여되었음을 알 때 이러한 API를 최대한 활용하여 사용자에게 더 나은 환경을 구축할 수 있다는 큰 이점이 있습니다.

여기에서 전체 예시를 확인할 수 있습니다.

브라우저 지원

Chrome은 이를 구현한 최초의 브라우저이며 Mozilla는 이를 출시할 계획이고 Microsoft는 이 API에 관심을 보였습니다.

알려진 문제

  • 사용자가 권한 요청을 닫으면 위치 정보 액세스 권한 메시지가 다시 표시되지 않습니다. 하지만 권한 상태는 '메시지'로 유지됩니다. [bugs.chromium.org]