스토리지 액세스 API

커뮤니티 그룹 초안 보고서,

현재 버전:
https://privacycg.github.io/storage-access/
이슈 트래킹:
GitHub
명세 내 인라인
에디터:
(Mozilla)
(Google)
(Apple Inc.)
이전 에디터:
(Apple Inc.)
(Apple Inc.)

개요

Storage Access API는 iframe의 콘텐츠가 웹사이트 데이터(예: 쿠키)에 대한 액세스를 요청할 수 있도록 합니다.

이 문서의 상태

이 명세는 HTML Living Standard에 병합될 예정입니다. WHATWG Living Standard도 아니고 W3C 표준 트랙에 올라가 있지도 않습니다.

이 명세는 Privacy Community Group에서 발행했습니다. W3C Community Contributor License Agreement (CLA)에 따라 제한적 옵트아웃과 기타 조건이 적용됩니다. W3C Community and Business Groups에 대해 자세히 알아보세요.

1. 소개

이 섹션은 비규범적입니다.

사용자 에이전트는 때때로 특정 iframe 내부의 콘텐츠가 쿠키와 같은 클라이언트 측 저장 메커니즘에 저장된 데이터에 액세스하는 것을 차단합니다. 이로 인해 클라이언트 측 저장소 접근에 의존하는 임베드 콘텐츠가 작동하지 않을 수 있습니다.

Storage Access API는 iframe 내부의 콘텐츠가 자신의 클라이언트 측 저장소에 대한 접근을 요청하고 부여받을 수 있게 하여, 클라이언트 측 저장소 접근에 의존하는 임베드 콘텐츠가 이러한 사용자 에이전트에서도 동작할 수 있도록 해줍니다. [STORAGE-ACCESS-INTRO]

2. 인프라

이 명세는 Infra 표준에 의존합니다. [INFRA]

3. Storage Access API

이 명세는 Document가 현재 자신의 비분할 데이터에 접근할 수 있는지 질의하는 메서드(hasStorageAccess())와, 자신의 비분할 데이터에 대한 접근을 요청할 때 사용할 수 있는 메서드(requestStorageAccess())를 정의합니다.

Alex가 https://social.example/를 방문합니다. 이 페이지는 쿠키를 설정합니다. 해당 쿠키는 퍼스트 파티 사이트 컨텍스트에서 설정되었습니다.

이후, Alex는 https://video.example/를 방문하고, 그 사이트에는 iframe이 포함되어 있어 https://social.example/heart-button을 로드합니다. 이 경우 social.exampleDocument doc서드 파티 컨텍스트에 있으며, 이전에 설정된 쿠키가 doc.cookie에서 보일 수도, 보이지 않을 수도 있습니다. 이는 사용자 에이전트의 저장소 접근 정책에 따라 다릅니다.

iframe 내에서 실행되는 스크립트는 doc.hasStorageAccess()를 호출하여 쿠키에 접근할 수 있는지 확인할 수 있습니다. 만약 접근이 없다면, doc.requestStorageAccess()를 호출하여 접근을 요청할 수 있습니다.

비분할 데이터사이트퍼스트 파티 사이트 컨텍스트에서 로드된 경우 사용할 수 있는 클라이언트 측 저장소입니다.

Document 는 해당 문서가 활성 문서이고 최상위 탐색 컨텍스트인 경우 퍼스트 파티 사이트 컨텍스트에 있다고 합니다. 아니면, origintop-level origin관련 설정 객체의 서로 동일 사이트인 경우, 퍼스트 파티 사이트 컨텍스트에 있다고 합니다.

Document퍼스트 파티 사이트 컨텍스트에 있지 않으면 서드 파티 컨텍스트에 있다고 합니다.

사용자 에이전트가 비분할 쿠키 접근을 명시적으로 허용하는지 판단하기 위해, 튜플 tuple에 두 사이트가 포함되어 있다고 하고, 다음 절차를 따르세요. 이 알고리즘은 "none", "allow", "disallow"를 반환합니다.

참고: 사용자 에이전트의 설정은 사이트별 허용 목록, 사용자가 브라우저 전역 설정을 변경하거나 유사한 커스텀 오버라이드를 통해 비분할 쿠키 접근을 명시적으로 허용 또는 차단할 수 있습니다.

  1. 사용자 에이전트가 tuple에 대한 비분할 쿠키 접근에 대해 명시적 설정이 없다면, "none"을 반환합니다.

  2. 사용자 에이전트 설정이 tuple에 대해 비분할 쿠키 접근을 명시적으로 허용한다면, "allow"를 반환합니다.

  3. Assert: 사용자 에이전트 설정이 tuple에 대해 비분할 쿠키 접근을 명시적으로 차단합니다.

  4. "disallow"를 반환합니다.

FedCM 사이트 연결 상태를 결정하기 위해, origin embedderorigin identityProvider가 주어졌을 때 다음 단계를 따르세요. 이 알고리즘은 불리언을 반환합니다.

  1. item에 대해 connected accounts set을 반복:

    1. (rp, idp, account)을 item으로 둡니다.

    2. rpembedder동일 사이트이고, idpidentityProvider동일 사이트라면 true를 반환합니다.

  2. false를 반환합니다.

실효성 있는 FedCM 연결 상태를 결정하기 위해, origin embedder, origin identityProvider, Document doc이 주어졌을 경우, 다음 절차를 따르세요. 이 알고리즘은 불리언을 반환합니다.

  1. policyStatusdoc가 "identity-credentials-get"을 사용할 수 있는지 여부를 저장합니다.

  2. policyStatus가 "Disabled"라면 false를 반환합니다.

  3. connected사이트 연결 상태 결정 절차의 결과를 저장합니다.

  4. connected가 false라면 false를 반환합니다.

  5. preventSilentAccess에, user agent크리덴셜 저장소prevent silent access flagembedder 기준으로 저장합니다.

  6. preventSilentAccess가 true라면 false를 반환합니다.

  7. true를 반환합니다.

3.1. 스토리지 접근 관련 사용자 에이전트 상태 변화

environment 정의를 다음과 같이 수정합니다:

  1. has storage access 라는 이름의 새 멤버를 불리언 타입으로 추가합니다.

source snapshot params 정의를 다음과 같이 수정합니다:

  1. has storage access 라는 이름의 새 멤버를 불리언 타입으로 추가합니다.

  2. environment id라는 이름의 새 멤버를 opaque 문자열 타입으로 추가합니다.

스토리지 접근 적격성은 "unset", "ineligible", 또는 "eligible" 중 하나입니다.

request스토리지 접근 적격성 eligible for storage-access를 가집니다. 초기 값은 "unset"입니다.

참고: request스토리지 접근 적격성은, storage-access 권한이 이미 부여된 적이 있는지 등, 해당 request가 어떤 쿠키를 포함할지 결정할 때 고려 대상이 되어야 하는지 나타냅니다. 특히, requestStorageAccess가 resolve되고 environmenthas storage access가 true로 설정되어도, 해당 request가 발행하는 모든 environment의 요청이 모두 비분할 쿠키를 포함하는 것은 아닙니다.

예를 들어, 사용자가 https://top.com에서 페이지를 방문하고 거기에 https://embed.com의 iframe이 embed되어 있다고 가정합니다. 이 iframe의 스크립트가 requestStorageAccess를 resolve시켰다면, 이후 이 iframe이 https://3p.com에서 리소스를 fetch하더라도, 해당 요청에는 Storage Access API를 통해 쿠키가 포함되지 않습니다.

초기 스토리지 접근 적격성 결정을 위해, request request가 주어졌을 때 다음 단계로 진행합니다:
  1. requestclient가 null이면, "unset"을 반환합니다.

  2. requestclientancestry가 "cross-site"가 아니면, "unset"을 반환합니다.

"ancestry" 개념은 HTML에 https://github.com/whatwg/html/pull/11133에서 추가되고 있습니다.

  1. requestclienthas storage access가 false라면, "ineligible"을 반환합니다.

  2. requestorigin동일 출처가 아니라면 requesturlorigin과 비교해서, "ineligible"을 반환합니다.

  3. allowedShould request be allowed to use feature?를 "storage-access"와 request로 실행한 결과를 저장합니다.

  4. allowed가 false라면 "ineligible"을 반환합니다.

  5. "eligible"을 반환합니다.

3.2. Document에 대한 변경 사항

partial interface Document {
  Promise<boolean> hasStorageAccess();
  Promise<undefined> requestStorageAccess();
};

Document doc에서 hasStorageAccess() 메서드를 호출할 때 다음 단계를 수행해야 합니다:

  1. p새로운 promise로 둔다.

  2. doc완전히 활성화 상태가 아니면, reject p를 "InvalidStateError" DOMException 이유로 거부하고 p를 반환한다.

  3. docoriginopaque origin이면, resolve p를 false로 하고 반환한다.

  4. globaldoc관련 global object로 둔다.

  5. globalsecure context가 아니면, resolve p를 false로 하고 반환한다.

  6. doctop-level origindoc관련 settings object에서 opaque origin이면 resolve p를 false로 하고 반환한다.

  7. browsingContextdoc브라우징 컨텍스트로 둔다.

  8. topLevelSite사이트 획득을 통해 doctop-level origin에 대해 얻는다.

  9. embeddedSite사이트 획득을 통해 docorigin에서 얻는다.

  10. 다음 단계를 병렬로 실행한다:

    1. explicitSetting사용자 에이전트가 비분할 쿠키 접근을 명시적으로 허용하는지를 (topLevelSite, embeddedSite)로 실행한 결과로 둔다.

    2. permissionState현재 권한 상태 가져오기를 "storage-access"와 global로 실행한 결과로 둔다.

    3. 전역 태스크 대기열networking 작업 소스global에 다음과 같이 동작한다:

      1. explicitSetting이 "disallow"이면, resolve p를 false로 한다.

      2. explicitSetting이 "allow"이면, resolve p를 true로 한다.

      3. Assert: explicitSetting은 "none"이다.

      4. browsingContext최상위 브라우징 컨텍스트이면, resolve p를 true로 한다.

      5. browsingContextbrowsingContext최상위 브라우징 컨텍스트active document와 same authority이면, resolve p를 true로 한다.

        여기서 "same authority"는 교차 사이트 부모 문서의 존재 등 추가 보안 요소를 고려하여 사용자 에이전트가 same site를 체크할 수 있도록 하는 미래 개념의 placeholder이다. 실제 동작은 쿠키용 site 비교나 최상위 문서와 same site 비교를 포함할 수 있다.

      6. permissionStategranted이면, resolve pglobalhas storage access로 한다.

        참고: 글로벌 storage access 권한 상태는 로컬 has storage access 플래그보다 우선적용되어, 사용자 설정에서 권한을 회수한 경우 이를 즉시 반영한다.

      7. resolve p를 false로 한다.

  11. p를 반환한다.

Document doc에서 requestStorageAccess() 메서드를 호출할 때 다음 단계를 수행해야 합니다:

  1. p새로운 프로미스로 둔다.

  2. doc완전히 활성 상태가 아니면, reject p를 "InvalidStateError" DOMException으로 거부하고 p를 반환한다.

  3. globaldoc관련 전역 객체로 둔다.

  4. settingsdoc관련 설정 객체로 둔다.

  5. global보안 컨텍스트가 아니면, reject p를 "NotAllowedError" DOMException으로 거부하고 p를 반환한다.

  6. doc"storage-access" 사용 허가됨이 아니면, reject p를 "NotAllowedError" DOMException으로 거부하고 p를 반환한다.

  7. docorigin불투명 origin이면, reject p를 "NotAllowedError" DOMException으로 거부하고 p를 반환한다.

  8. settingstop-level origin불투명 origin이면, reject p를 "NotAllowedError" DOMException으로 거부하고 p를 반환한다.

  9. docactive sandboxing flag setsandbox storage access by user activation flag가 설정되어 있다면, reject p를 "NotAllowedError" DOMException으로 거부하고 p를 반환한다.

  10. browsingContextdoc브라우징 컨텍스트로 둔다.

  11. topLevelOrigindoctop-level origin으로 둔다.

  12. topLevelSite사이트 얻기를 통해 topLevelOrigin에서 얻는다.

  13. embeddedOrigindocorigin으로 둔다.

  14. embeddedSite사이트 얻기를 통해 embeddedOrigin에서 얻는다.

  15. has transient activationdocWindow 객체가 일시적 활성화를 가지고 있는지 여부로 둔다.

  16. 다음 단계를 병렬로 실행한다:

    1. process permission state라는 알고리즘을 두고, 권한 상태 state를 받아 다음을 실행한다:

      1. 전역 태스크 큐네트워킹 태스크 소스global에 대해 실행:

        1. stategranted이면:

          1. globalhas storage access를 true로 설정한다.

          2. resolve pundefined로 한다.

        2. 그 외:

          1. 사용자 활성화 소모global에 적용한다.

          2. reject p를 "NotAllowedError" DOMException으로 거부한다.

    2. explicitSetting사용자 에이전트가 비분할 쿠키 접근을 명시적으로 허용하는지 판단하기를 (topLevelSite, embeddedSite)에 대해 실행한 결과로 둔다.

    3. explicitSetting이 "disallow"이면:

      1. deniedprocess permission state 실행.

      2. 이 단계를 중단한다.

    4. explicitSetting이 "allow"이면:

      1. grantedprocess permission state 실행.

      2. 이 단계를 중단한다.

    5. Assert: explicitSetting은 "none"이다.

    6. browsingContext최상위 브라우징 컨텍스트이면:

      1. grantedprocess permission state 실행.

      2. 이 단계를 중단한다.

    7. embeddedSitesame site이면 topLevelSite와:

      참고: 이 체크는 의도적으로 same site임. 임베디드 사이트가 사용자의 관여 없이 requestStorageAccess()를 통해 보안 목적 제한 상황에서 저장소 접근에 opt-in할 수 있도록 허용한다.

      1. grantedprocess permission state 실행.

      2. 이 단계를 중단한다.

    8. previous permission state현재 권한 상태 가져오기를 "storage-access"와 global의 인자로 실행한 결과로 둔다.

    9. previous permission stateprompt가 아니면:

      1. process permission stateprevious permission state로 실행.

      2. 이 단계를 중단한다.

    10. connected실효성 있는 FedCM 연결 상태 결정topLevelOrigin, embeddedOrigin, doc에 대해 실행한 값으로 둔다.

    11. connected가 true이면:

      참고: 사용자 에이전트는 기존 FedCM 연결로 저장소 접근을 허용받은 (site, site) 튜플들을 추적하고, 쿠키 접근 시 목록을 재검토해 악의적 공격자가 잘못된 environmenthas storage access 상태를 쓰도록 속이는 일을 방지할 것 권장.

      1. grantedprocess permission state 실행.

      2. 이 단계를 중단한다.

    12. has transient activation이 false이면:

      1. deniedprocess permission state 실행.

      2. 이 단계를 중단한다.

    13. permissionState권한 사용 요청을 "storage-access"로 실행한 결과로 둔다.

      참고: 권한 요청 및 프롬프트 표시 여부 판단 시, 사용자 에이전트는 사용자 경험을 위해 구현 정의 동작을 적용 가능함. 특히 storage-access 경우, 프롬프트 없이 커스텀 규칙으로 권한을 자동 부여/거부할 수 있음이 알려져 있다.

    14. process permission statepermissionState로 실행.

  17. p를 반환한다.

참고: 이 알고리즘의 의도는 storage-access 권한이 부여되기 전에 항상 사용자 활성화를 요구하는 것입니다. 사용자 에이전트가 사용자 활성화 없이 자체 휴리스틱으로 storage-access 권한을 부여할 수는 있으나, 상호운용성 저하의 원인이 될 수 있으므로 이러한 동작은 비추천합니다.

source snapshot params 스냅샷 시:

  1. has storage accesssourceDocumenthas storage access로 설정한다.

  2. environment idsourceDocumentrelevant settings objectid로 설정한다.

create navigation params by fetching 알고리즘에 대해, step 3으로 다음 단계를 삽입한다:

  1. originalURLentry의 URL로 둔다.

reserved clientcreate navigation params by fetching에서 생성할 때:

  1. reserved clienthas storage accesssourceSnapshotParamshas storage access로 설정한다. 단, 다음 모든 조건을 만족해야 한다:

    1. sourceSnapshotParamsenvironment idnavigableactive documentrelevant settings objectid와 동일.

    2. originalURLorigincurrentURLorigin동일 출처이다.

    3. response가 null이거나, responsehas-cross-origin-redirects가 false이다.

  2. 그렇지 않으면 requestreserved clienthas storage access를 false로 설정한다.

window environment settings object 설정 시:

  1. settings objecthas storage accessreserved environmenthas storage access로 설정한다.

3.4. Fetch 통합

3.4.1. 페칭

fetch의 step 14 이후에 새로운 단계를 삽입한다:

  1. requesteligible for storage-access초기 storage-access 적격성 결정의 결과로 request를 넣어 설정한다.

3.4.2. HTTP-redirect-fetch

HTTP-redirect fetch의 step 17 이후에 새로운 단계를 삽입한다:

  1. requesteligible for storage-access가 "unset"이 아니고, locationURLoriginrequestcurrent URLorigin동일 출처가 아니면, requesteligible for storage-access를 "ineligible"로 설정한다.

3.5. 다양한 클라이언트 측 스토리지 메커니즘 변경점

이 API는 HTTP 쿠키에만 영향을 미친다. 차후 개정에서는 다른 클라이언트 상태에도 영향을 줄 수 있다. [RFC6265]

3.5.1. 쿠키

이 API는 서드 파티 컨텍스트에서 비분할 쿠키 접근을 차단하는 환경 및 사용자 에이전트 설정과 함께 쓰는 것을 목적으로 한다. 이 문서 작성 시점에서는, 이 개념은 아직 HTTP-network-or-cache fetchcookie 알고리즘에 통합되어 있지 않다. 이러한 통합을 위해, cookie store는 요청의 최상위 및 임베드 사이트(교차 사이트, 분할, 쿠키 첨부 여부 결정), 그리고 request가 스토리지 접근이 가능한 문서에서 생성되었는지도 받아야 하며, 이 정보는 본 명세에서 정의한 requesteligible for storage-access를 통해 전달된다.

쿠키 저장소가 스토리지 접근 정보를 받을 수 있게 되면 HTTP-network-or-cache fetchcookie 에서도 쿠키를 가져올 때 requesteligible for storage-accesscookie store에 전달하도록 업데이트할 예정이다.

스토리지 접근으로 cookie store에서 비분할 쿠키를 가져올 때, 사용자 에이전트는 여전히 적용되는 SameSite 제한(즉, 서드 파티 컨텍스트 내에서 SameSite=Strict 또는 SameSite=Lax으로 표시된 쿠키 미첨부)을 따른다.

참고: 사용자 에이전트마다 SameSite 쿠키 속성의 기본값이 다를 수 있다. 이로 인해 일부 사용자 에이전트(기본값이 SameSite=None인 경우)에서는 SameSite 속성이 없는 비분할 쿠키가 요청에 첨부되고, 다른 에이전트(SameSite=Lax가 기본값인 경우)에서는 첨부되지 않을 수 있다. 웹 개발자들은 이러한 문제를 피하기 위해 쿠키에 SameSite 속성을 명시적으로 지정하는 것이 좋다.

3.6. 스토리지 접근 샌드박싱

sandboxing flag set에는 sandbox storage access by user activation flag가 있다. 이 플래그는 콘텐츠가 스토리지 접근을 요청하지 못하게 한다.

샌드박싱 지시문 파싱 알고리즘의 3번째 단계 하위로 다음을 추가한다:

4. 권한 통합

Storage Access API는 파워풀 기능을 정의하며, name은 "storage-access"이다. 다음 권한 관련 알고리즘들을 정의한다:

permission query algorithm
"storage-access" 권한을 질의하려면, PermissionDescriptor permissionDescPermissionStatus status가 주어졌을 때:
  1. statusstatepermissionDescpermission state로 설정한다.

  2. statusstatedenied라면, statusstateprompt로 설정한다.

    참고: "denied" 권한 상태는 사용자의 결정을 개발자에게 노출하지 않기 위해 표시되지 않습니다. 이는 사용자를 보복이나 반복 프롬프트로부터 보호하기 위함입니다.

permission key type
"storage-access" 기능의 permission key는, 튜플 타입이며, site top-levelsite requester로 이루어져 있다.

(("https", "news.example"), ("https", "social.example"))은 "storage-access" 기능의 permission key이며, top-level("https", "news.example")이고, requester("https", "social.example")이다.

permission key generation algorithm
"storage-access" 기능에 대한 새 permission key 생성 시, origin originorigin embeddedOrigin이 주어졌을 때:
  1. topLevelSiteobtain a siteorigin에서 얻는다.

  2. embeddedSiteobtain a siteembeddedOrigin에서 얻는다.

  3. (topLevelSite, embeddedSite)를 반환한다.

permission key comparison algorithm
"storage-access" 기능의 permission key key1key2 비교하려면:
  1. key1top-levelkey2top-levelsame site가 아니면 false를 반환한다.

  2. key1requesterkey2requestersame site가 아니면 false를 반환한다.

  3. true를 반환한다.

5. 권한 정책 통합

Storage Access API는 policy-controlled feature를 정의하며 식별자는 "storage-access"이다. 기본 허용 목록"*"이다.

참고: Documentpermissions policy는 해당 문서의 콘텐츠가 requestStorageAccess()를 통해 스토리지 접근 요청을 할 수 있는지 결정한다. 어떤 문서에서라도 비활성화되어 있으면, 해당 문서에서 requestStorageAccess() 호출 시 거부된다.

6. 프라이버시 고려 사항

Storage Access API는 교차 사이트 쿠키 제거를 가능하게 한다. 특히, 인증이 필요한 임베드 케이스가 계속 동작하도록 허용한다. 즉, 개발자가 교차 사이트 쿠키에 다시 접근할 수 있는 수단을 제공하나, 추가 제약을 둔다.

중첩된 Documentactive document로서 최상위 브라우징 컨텍스트에 있을 때와 동일한 쿠키를, requestStorageAccess() 호출 후 resolve되는 Promise에서 획득한다. 이 쿠키는 서버 인증 및 사용자별 정보 로드에 사용할 수 있다.

이 기능은 제3자가 추적 목적으로 남용할 위험이 있으나, API의 명시적 목표는 교차 사이트 쿠키 폐지 후의 프라이버시 이득을 약화하지 않는 데 있다. 즉, 플랫폼 특화 정보로 stateless 추적을 막고, 새로 추가되는 상태는 임베더와 임베디 문서 sites 범위로 한정된 permission뿐이다.

기본 교차 사이트 쿠키가 이미 폐지된 경우 프라이버시 논점이 더 복잡해진다. 과제는 Storage Access API를 언제 어떻게 쿠키가 없는(또는 분할 쿠키만 있는) 중첩 Document에 예전 상태로 접근을 허용할지 결정하는 것이다. 즉, 비분할 데이터에 접근 권한을 부여하는 시점을 결정해야 한다.

이상적인 경우, 중첩 Document가 자신의 비분할 데이터를 획득할 조건은 다음과 같다:

  1. 사용자가 중첩 Document와 상호작용한 경우

  2. 중첩 Document가 임베더에 의해 API 사용이 허용된 경우

  3. 중첩 Document보안 컨텍스트인 경우

  4. 사용자가 임베더에서 임베디가 쿠키를 쓸 수 있도록 명시적, 쌍방 permission을 부여한 경우

  5. 사용자가 "storage-access" 권한 요청에 너무 자주 노출되어 명시적 동의의 의미가 약화되지 않은 경우

이 명세는 구현자에게 처음 세 가지 요건을 요구한다. 이를 통해 사용자가 중첩 Document의 내용을 인지하며, 임베더가 인증을 차단하지 않았고, 교차 사이트 쿠키가 네트워크 공격자에게 노출되지 않음을 보장한다.

마지막 두 항목은 상충한다. 이상적으로는 requestStorageAccess() 호출마다 프롬프트를 띄워야 한다. 그러나 이 경우 페이지가 사용자 프롬프트를 남용할 수 있으므로, 사용자 피로도를 줄이기 위해 사용자 에이전트가 과다 프롬프트를 방지해야 한다.

A modal dialog box which states 'Do you want to allow “video.example” to use cookies and website data while browsing “news.example”? This will allow “video.example” to track your activity.' and which has two buttons, “Don’t Allow” and “Allow”.
사이트에서 document.requestStorageAccess()를 호출할 때 사용자가 볼 수 있는 프롬프트 예시

따라서 마지막 두 항목은 핵심적인 절충점을 나타낸다. 위 요건을 모두 충족하면 사용자 선택 없이도 비분할 데이터에 대한 요청 허용/거부 시점을 구현 정의로 허용한다. 이 절충은 본 제안의 프라이버시 보증, 구체적으로 4번 항목을 약화하나, 구현자에게 본 API로는 스토리지 접근이 불가능하도록 만드는 권한을 준다. 하지만 이 방식이 5번 조건을 허용하기 위해 불가피함이 입증되었다.

사용자 에이전트마다 구현 정의 동작이 크게 다르다면 개발자 경험이 저하되므로, 가능한 한 자동 허용/거부 동작의 최소화 및 표준화가 바람직하다.

6.1. 권한 범위

API 설계 시 또 다른 논점은 "storage-access" 권한을 키로 사용할 때 origin을 사용할지, site를 사용할지 여부이다. 우리는 site를 선택했다. 왜냐하면, site는 프라이버시의 허용 가능한 경계선이라고 판단했고, 동일 사이트 및 동일 페이지 내 교차 origin 중첩 Document 사용을 사용자 프롬프트 한 번으로 지원할 수 있기 때문이다.

7. 보안 고려 사항

이 명세는 교차 사이트 쿠키 제거 이후와 비교해도 웹 플랫폼의 보안 특성이 저하되지 않아야 한다. 서드 파티 쿠키 제거는 보안에 이익이 있으며, 특히 CSRF 등 인증 요청에 기대는 공격 경감을 위해서다. Storage Access API가 이러한 공격의 발판이 되는 것을 원치 않는다.

이를 위해 "storage-access" 권한 부여의 영향을 중첩 비분할 데이터에 대한 접근 권한으로 한정한다. 이 권한은 DocumentrequestStorageAccess()를 호출했을 때부터 그 중첩 Document가 origin 경계를 넘는 네비게이션을 하기 전까지만 유효하다. 즉, 실제 권한은 requestStorageAccess()를 호출한 페이지만이 인증 요청을 보낼 수 있으며, 나아가 embedee 페이지는 Content Security Policy의 "frame-ancestors" 디렉티브를 통해 허용할 embedder를 제어할 수 있다. 이로써 embedee가 보안을 위해 origin 범위 제어권을 유지할 수 있다.

7.1. 명예 훼손 공격

이 방식은 임베디된 서비스의 명예 훼손 공격을 막는 데에도 효과적이다. 모든 교차 사이트 인증 요청은 프라이버시에 민감해진 이용자에게 잠재적 명예 훼손 우려가 있다고 보고 있다. 따라서 퍼스트 파티 또는 sibling 교차 사이트가 사용자의 인증 쿠키를 사용해 임베드 리소스 요청을 일으키는 것도 해당 교차 사이트 소유자에 대한 명예 공격이 될 수 있다. 이 또한 API가 보안 컨텍스트에서만 사용되도록 요구하는 이유다. 네트워크 공격자가 embedee를 조작해 이 API를 쓰도록 유도하지 못하게 하기 위해서이다.

embedder는 중첩된 Document 들이 인증되거나 사용자에게 권한 프롬프트가 표시될 수 있는지, 혹은 Permission Policy와 중첩 Document 샌드박싱을 통해 제어할 수 있다.

7.2. 알림 남용

Storage Access API를 설계하면서 알림 남용 문제도 고려했다. 구체적으로, 중첩 Document 에서 사용자의 상호작용을 요구하고, 사용자가 거부했을 때 그 거절을 소비하여 사용자의 권한 프롬프트 표시 조건을 제한하도록 한다. 이로써 사용자가 거부한 직후 권한을 재요청하는 등의 공격을 완화한다.

8. 자동화

사용자 에이전트 자동화 및 애플리케이션 테스트를 위해, 본 문서는 확장 명령어[WebDriver] 명세에 대해 정의합니다.

8.1. 스토리지 접근 설정

HTTP Method URI Template
POST /session/{session id}/storageaccess

스토리지 접근 설정 확장 명령현재 브라우징 컨텍스트의 스토리지 접근 정책을 수정한다.

remote end 단계는 아래와 같다:

  1. blockedparameters에서 blocked라는 이름의 프로퍼티 값으로 구한다.

  2. blocked불리언이 아니면 WebDriver errorWebDriver error code invalid argument를 반환한다.

  3. embedded originparameters에서 origin 프로퍼티의 값으로 얻는다.

  4. embedded origin이 단일 U+002A 별표 문자(*)가 아니라면:

    1. parsedURLURL 파서embedded origin을 넣어 실행한 결과로 얻는다.

    2. parsedURL이 실패이면, WebDriver errorWebDriver error code invalid argument를 반환한다.

    3. embedded originparsedURLorigin으로 설정한다.

  5. 현재 브라우징 컨텍스트최상위 브라우징 컨텍스트가 아니면 WebDriver errorWebDriver error code unsupported operation을 반환한다.

  6. doc현재 브라우징 컨텍스트active document로 둔다.

  7. settingsdocrelevant settings object로 둔다.

  8. top-level sitesettingssite 얻기 결과로 둔다.

  9. embedded origin이 단일 U+002A 별표 문자(*)이면:

    1. blockedtrue라면:

      1. 구현 정의 단계들을 실행해 top-level site에서 비분할 데이터가 어떤 사이트도 서드 파티 컨텍스트에서 접근할 수 없도록 보장한다.

    2. 그 외에 blockedfalse라면:

      1. 구현 정의 단계들을 실행해 top-level site에서 어떤 사이트든 비분할 데이터서드 파티 컨텍스트에서 접근할 수 있도록 보장한다.

  10. 그 외에는:

    1. embedded originsettingsoriginsame site라면, WebDriver errorWebDriver error code unsupported operation을 반환한다.

    2. blockedtrue라면:

      1. 구현 정의 단계들을 실행해 embedded origintop-level site서드 파티 컨텍스트에서 비분할 데이터에 접근할 수 없도록 보장한다.

    3. 그 외에 blockedfalse라면:

      1. 구현 정의 단계들을 실행해 embedded origintop-level site서드 파티 컨텍스트에서 비분할 데이터에 접근할 수 있도록 보장한다.

  11. 구현 정의 단계들이 실패하면 WebDriver errorWebDriver error code unknown error를 반환한다.

  12. success(성공) 및 데이터 null을 반환한다.

감사의 글

이 명세는 Storage Access API를 고안한 전 편집자 John Wilander, 초기 텍스트의 상당 부분을 집필한 Theresa O’Connor가 만든 토대 위에 구축되었습니다. 그들의 아이디어와 기여에 감사를 표합니다.

다음 분들께도 많은 감사를 드립니다. Anne van Kesteren, Ben Kelly, Brad Girardeau, Brad Hill, Brady Eidson, Brandon Maslen, Chris Mills, Dave Longley, Domenic Denicola, Ehsan Akhgari, Geoffrey Garen, Jack Frankland, James Coleman, James Hartig, Jeffrey Yasskin, Kushal Dave, Luís Rudge, Maciej Stachowiak, Matias Woloski, Mike O’Neill, Mike West, Pete Snyder, Rob Stone, Stefan Leyhane, Steven Englehardt, Travis Leithead, Yan Zhu, Zach Edwards, 그리고 whatwg/html#3338, privacycg/proposals#2, privacycg/storage-access/issues 에서 의견을 남겨주신 모든 분들께 이 제안에 대한 피드백에 감사드립니다.

WebKit 오픈 소스 프로젝트에서 Storage Access API 프롬프트 이미지를 사용하도록 허락해주신 것에도 감사드립니다. 이 이미지는 webkit.org 에 처음 게시되었습니다.

적합성

문서 관례

적합성 요건은 설명적 주장의 조합과 RFC 2119 용어로 표현됩니다. 이 문서의 규범적 부분에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"이라는 핵심 단어는 RFC 2119에서 설명한 대로 해석되어야 합니다. 다만 가독성을 위해, 본 명세에서는 이 단어들이 모두 대문자로 표기되지는 않습니다.

이 명세의 모든 본문은 명시적으로 비규범적, 예제, 참고로 표시된 부분을 제외하고는 모두 규범적입니다. [RFC2119]

이 명세서의 예제는 “예를 들어(for example)”라는 말로 도입되거나 class="example"로 표준 본문과 구분됩니다. 예시는 다음과 같습니다:

이것은 정보 제공용 예제입니다.

정보성 주석(설명)은 “참고(Note)”라는 단어로 시작하며, class="note"로 표준 문서와 구분됩니다. 다음과 같습니다:

참고, 이것은 정보성 주석입니다.

색인

이 명세서에서 정의된 용어

참조로 정의된 용어

참고문헌

표준 참고문헌

[CREDENTIAL-MANAGEMENT-1]
Nina Satragno; Marcos Caceres. Credential Management Level 1. URL: https://w3c.github.io/webappsec-credential-management/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FEDCM-1]
Nicolas Pena Moreno. Federated Credential Management API. URL: https://w3c-fedid.github.io/FedCM/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC6265]
A. Barth. HTTP State Management Mechanism. April 2011. Proposed Standard. URL: https://httpwg.org/specs/rfc6265.html
[RFC6265BIS]
Cookies: HTTP State Management Mechanism. Editor's Draft. URL: https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WebDriver]
Simon Stewart; David Burns. WebDriver. URL: https://w3c.github.io/webdriver/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보 참고문헌

[STORAGE-ACCESS-INTRO]
John Wilander. Introducing Storage Access API. February 2018. Blog post. URL: https://webkit.org/blog/8124/introducing-storage-access-api/

IDL 색인

partial interface Document {
  Promise<boolean> hasStorageAccess();
  Promise<undefined> requestStorageAccess();
};

이슈 색인

"ancestry"라는 개념이 HTML에 추가되고 있습니다: https://github.com/whatwg/html/pull/11133
"same authority"는 사용자 에이전트가 교차 사이트 부모 문서 존재 등 추가 보안 특성을 유지하며 same site 체크를 수행할 수 있도록 허용하는 미래 개념의 placeholder입니다. 실제로는 site for cookies 비교 또는 최상위 문서와의 same site 체크가 될 수 있습니다.