Skip to content

Commit ac8f1c0

Browse files
ArthurSonzognidandclark
authored andcommitted
Add credentialless value to COEP
This defines Cross-Origin-Embedder-Policy: credentialless. The credentialless and require-corp values are similar. One or the other is a requirements for the cross-origin isolated capability. They differ mostly in terms of fetching. require-corp requires a Cross-Origin-Resource-Policy header for cross-origin opaque responses. credentialless doesn't, but omits credentials (cookies, client certificates, etc.) in cross-origin "no-cors" requests. See https://github.com/WICG/credentiallessness for additional context. Fetch PR: whatwg/fetch#1229. Tests: WPT html/cross-origin-embedder-policy/credentialless. Closes whatwg#6637.
1 parent 5bb6fbc commit ac8f1c0

1 file changed

Lines changed: 74 additions & 49 deletions

File tree

‎source‎

Lines changed: 74 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -80244,9 +80244,8 @@ console.assert(iframeWindow.frameElement === null);
8024480244
data-x="http-cross-origin-opener-policy">Cross-Origin-Opener-Policy</span>: <span
8024580245
data-x="coop-same-origin">same-origin</span></code>`, and</p></li>
8024680246

80247-
<li><p>every <span>Document</span> has `<code
80248-
data-x=""><span>Cross-Origin-Embedder-Policy</span>: <span
80249-
data-x="coep-require-corp">require-corp</span></code>`.</p></li>
80247+
<li><p>every <span>Document</span> has a `<code>Cross-Origin-Embedder-Policy</code>` header
80248+
whose value is <span>compatible with cross-origin isolation</span>.</p></li>
8025080249
</ul>
8025180250

8025280251
<p>On some platforms, it is difficult to provide the security properties required to grant safe
@@ -83303,8 +83302,9 @@ interface <dfn interface>BarProp</dfn> {
8330383302
data-x="http-cross-origin-opener-policy">Cross-Origin-Opener-Policy</code>` header, but results
8330483303
from a combination of setting both `<code data-x=""><span
8330583304
data-x="http-cross-origin-opener-policy">Cross-Origin-Opener-Policy</span>: <span
83306-
data-x="coop-same-origin">same-origin</span></code>` and `<code
83307-
data-x=""><span>Cross-Origin-Embedder-Policy</span>: require-corp</code>` together.</p>
83305+
data-x="coop-same-origin">same-origin</span></code>` and a
83306+
`<code>Cross-Origin-Embedder-Policy</code>` header whose value is <span>compatible with
83307+
cross-origin isolation</span> together.<p>
8330883308
</dd>
8330983309
</dl>
8331083310

@@ -83393,8 +83393,8 @@ interface <dfn interface>BarProp</dfn> {
8339383393
policy">obtaining a cross-origin embedder policy</span> from <var>response</var> and
8339483394
<var>reservedEnvironment</var>.</p></li>
8339583395

83396-
<li><p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is "<code
83397-
data-x="coep-require-corp">require-corp</code>", then set <var>policy</var>'s <span
83396+
<li><p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is
83397+
<span>compatible with cross-origin isolation</span>, then set <var>policy</var>'s <span
8339883398
data-x="coop-struct-value">value</span> to "<code
8339983399
data-x="coop-same-origin-plus-COEP">same-origin-plus-COEP</code>".</p></li>
8340083400

@@ -83435,10 +83435,10 @@ interface <dfn interface>BarProp</dfn> {
8343583435
<var>reservedEnvironment</var>.</p></li>
8343683436

8343783437
<li>
83438-
<p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is "<code
83439-
data-x="coep-require-corp">require-corp</code>" or <var>coep</var>'s <span
83440-
data-x="embedder-policy-report-only-value">report-only value</span> is "<code
83441-
data-x="coep-require-corp">require-corp</code>", then set <var>policy</var>'s <span
83438+
<p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is
83439+
<span>compatible with cross-origin isolation</span> or <var>coep</var>'s <span
83440+
data-x="embedder-policy-report-only-value">report-only value</span> is <span>compatible with
83441+
cross-origin isolation</span>, then set <var>policy</var>'s <span
8344283442
data-x="coop-struct-report-only-value">report-only value</span> to "<code
8344383443
data-x="coop-same-origin-plus-COEP">same-origin-plus-COEP</code>".</p>
8344483444

@@ -84451,8 +84451,8 @@ interface <dfn interface>BarProp</dfn> {
8445184451

8445284452
<h3 id="coep">Cross-origin embedder policies</h3>
8445384453

84454-
<p>An <dfn export>embedder policy value</dfn> controls the fetching of cross-origin resources
84455-
without explicit permission from resource owners. There are two such values:</p>
84454+
<p>An <dfn export>embedder policy value</dfn> is one of three strings that controls the fetching
84455+
of cross-origin resources without explicit permission from resource owners.</p>
8445684456

8445784457
<dl>
8445884458
<dt>"<dfn data-x="coep-unsafe-none" export for="embedder policy value"><code
@@ -84466,8 +84466,34 @@ interface <dfn interface>BarProp</dfn> {
8446684466
<dd><p>When this value is used, fetching cross-origin resources requires the server's
8446784467
explicit permission through the <span>CORS protocol</span> or the
8446884468
`<code>Cross-Origin-Resource-Policy</code>` header.</p></dd>
84469+
84470+
<dt>"<dfn data-x="coep-credentialless" export for="embedder policy value"><code
84471+
data-x="">credentialless</code></dfn>"</dt>
84472+
<dd><p>When this value is used, fetching cross-origin no-CORS resources omits credentials. In
84473+
exchange, an explicit `<code>Cross-Origin-Resource-Policy</code>` header is not required. Other
84474+
requests sent with credentials require the server's explicit permission through the <span>CORS
84475+
protocol</span> or the `<code>Cross-Origin-Resource-Policy</code>` header.</p></dd>
8446984476
</dl>
8447084477

84478+
<div class="warning">
84479+
<p>Before supporting "<code data-x="coep-credentialless">credentialless</code>", implementers are
84480+
strongly encouraged to support both:
84481+
84482+
<ul class="brief">
84483+
<li><a href="https://wicg.github.io/private-network-access/">Private Network Access</a></li>
84484+
<li><a href="https://github.com/annevk/orb">Opaque Response Blocking</a></li>
84485+
</ul>
84486+
84487+
<p>Otherwise, it would allow attackers to leverage the client's network position to read non
84488+
public resources, using the <span
84489+
data-x="concept-settings-object-cross-origin-isolated-capability">cross-origin isolated
84490+
capability</span>.</p>
84491+
</div>
84492+
84493+
<p>An <span>embedder policy value</span> is <dfn>compatible with cross-origin isolation</dfn> if
84494+
it is "<code data-x="coep-credentialless">credentialless</code>" or "<code
84495+
data-x="coep-require-corp">require-corp</code>".</p>
84496+
8447184497
<p>An <dfn export>embedder policy</dfn> consists of:</p>
8447284498

8447384499
<ul>
@@ -84572,17 +84598,17 @@ interface <dfn interface>BarProp</dfn> {
8457284598
<var>response</var>'s <span data-x="concept-response-header-list">header list</span>.</p></li>
8457384599

8457484600
<li>
84575-
<p>If <var>parsedItem</var> is non-null and <var>parsedItem</var>[0] is "<code
84576-
data-x="">require-corp</code>":</p>
84601+
<p>If <var>parsedItem</var> is non-null and <var>parsedItem</var>[0] is <span>compatible with
84602+
cross-origin isolation</span>:</p>
8457784603

8457884604
<ol>
84579-
<li><p>Set <var>policy</var>'s <span data-x="embedder-policy-value">value</span> to "<code
84580-
data-x="coep-require-corp">require-corp</code>".</p></li>.
84605+
<li><p>Set <var>policy</var>'s <span data-x="embedder-policy-value">value</span> to
84606+
<var>parsedItem</var>[0].</p></li>
8458184607

8458284608
<li><p>If <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"] <span
8458384609
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
84584-
data-x="embedder-policy-reporting-endpoint">endpoint</span> to <var>parsedItem</var>[1]["<code
84585-
data-x="coep-report-to">report-to</code>"].</p></li>
84610+
data-x="embedder-policy-reporting-endpoint">endpoint</span> to
84611+
<var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"].</p></li>
8458684612
</ol>
8458784613
</li>
8458884614

@@ -84592,17 +84618,17 @@ interface <dfn interface>BarProp</dfn> {
8459284618
list</span>.</p></li>
8459384619

8459484620
<li>
84595-
<p>If <var>parsedItem</var> is non-null and <var>parsedItem</var>[0] is "<code
84596-
data-x="">require-corp</code>":</p>
84621+
<p>If <var>parsedItem</var> is non-null and <var>parsedItem</var>[0] is <span>compatible with
84622+
cross-origin isolation</span>:</p>
8459784623

8459884624
<ol>
84599-
<li><p>Set <var>policy</var>'s <span data-x="embedder-policy-report-only-value">report-only
84600-
value</span> to "<code data-x="coep-require-corp">require-corp</code>".</p></li>.
84625+
<li><p>Set <var>policy</var>'s <span
84626+
data-x="embedder-policy-report-only-value">value</span> to <var>parsedItem</var>[0].</p></li>
8460184627

8460284628
<li><p>If <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"] <span
84603-
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
84604-
data-x="embedder-policy-report-only-reporting-endpoint">report-only reporting endpoint</span>
84605-
to <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"].</p></li>
84629+
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
84630+
data-x="embedder-policy-report-only-reporting-endpoint">endpoint</span> to
84631+
<var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"].</p></li>
8460684632
</ol>
8460784633
</li>
8460884634

@@ -84625,19 +84651,19 @@ interface <dfn interface>BarProp</dfn> {
8462584651
data-x="policy-container-embedder-policy">embedder policy</span>.</p></li>
8462684652

8462784653
<li><p>If <var>parentPolicy</var>'s <span data-x="embedder-policy-report-only-value">report-only
84628-
value</span> is "<code data-x="coep-require-corp">require-corp</code>" and
84629-
<var>responsePolicy</var>'s <span data-x="embedder-policy-value">value</span> is "<code
84630-
data-x="coep-unsafe-none">unsafe-none</code>", then <span>queue a cross-origin embedder policy
84631-
inheritance violation</span> with <var>response</var>, "<code data-x="">navigation</code>",
84632-
<var>parentPolicy</var>'s <span data-x="embedder-policy-report-only-reporting-endpoint">report
84633-
only reporting endpoint</span>, "<code data-x="">reporting</code>", and <var>target</var>'s <span
84654+
value</span> is <span>compatible with cross-origin isolation</span> and
84655+
<var>responsePolicy</var>'s <span data-x="embedder-policy-value">value</span> is not, then
84656+
<span>queue a cross-origin embedder policy inheritance violation</span> with <var>response</var>,
84657+
"<code data-x="">navigation</code>", <var>parentPolicy</var>'s <span
84658+
data-x="embedder-policy-report-only-reporting-endpoint">report only reporting endpoint</span>,
84659+
"<code data-x="">reporting</code>", and <var>target</var>'s <span
8463484660
data-x="bc-container-document">container document</span>'s <span>relevant settings
8463584661
object</span>.</p></li>
8463684662

84637-
<li><p>If <var>parentPolicy</var>'s <span data-x="embedder-policy-value">value</span> is "<code
84638-
data-x="coep-unsafe-none">unsafe-none</code>" or <var>responsePolicy</var>'s <span
84639-
data-x="embedder-policy-value">value</span> is "<code
84640-
data-x="coep-require-corp">require-corp</code>", then return true.</p></li>
84663+
<li><p>If <var>parentPolicy</var>'s <span data-x="embedder-policy-value">value</span> is not
84664+
<span>compatible with cross-origin isolation</span> or <var>responsePolicy</var>'s <span
84665+
data-x="embedder-policy-value">value</span> is <span>compatible with cross-origin
84666+
isolation</span>, then return true.</p></li>
8464184667

8464284668
<li><p><span>Queue a cross-origin embedder policy inheritance violation</span> with
8464384669
<var>response</var>, "<code data-x="">navigation</code>", <var>parentPolicy</var>'s <span
@@ -84665,18 +84691,17 @@ interface <dfn interface>BarProp</dfn> {
8466584691
data-x="policy-container-embedder-policy">embedder policy</span>.
8466684692

8466784693
<li><p>If <var>ownerPolicy</var>'s <span data-x="embedder-policy-report-only-value">report-only
84668-
value</span> is "<code data-x="coep-require-corp">require-corp</code>" and <var>policy</var>'s
84669-
<span data-x="embedder-policy-value">value</span> is "<code
84670-
data-x="coep-unsafe-none">unsafe-none</code>", then <span>queue a cross-origin embedder policy
84671-
inheritance violation</span> with <var>response</var>, "<code data-x="">worker
84694+
value</span> is <span>compatible with cross-origin isolation</span> and <var>policy</var>'s
84695+
<span data-x="embedder-policy-value">value</span> is not, then <span>queue a cross-origin
84696+
embedder policy inheritance violation</span> with <var>response</var>, "<code data-x="">worker
8467284697
initialization</code>", <var>owner's policy</var>'s <span
8467384698
data-x="embedder-policy-report-only-reporting-endpoint">report only reporting endpoint</span>,
8467484699
"<code data-x="">reporting</code>", and <var>owner</var>.</p></li>
8467584700

84676-
<li><p>If <var>ownerPolicy</var>'s <span data-x="embedder-policy-value">value</span> is "<code
84677-
data-x="coep-unsafe-none">unsafe-none</code>" or <var>policy</var>'s <span
84678-
data-x="embedder-policy-value">value</span> is "<code
84679-
data-x="coep-require-corp">require-corp</code>", then return true.</p></li>
84701+
<li><p>If <var>ownerPolicy</var>'s <span data-x="embedder-policy-value">value</span> is not
84702+
<span>compatible with cross-origin isolation</span> or <var>policy</var>'s <span
84703+
data-x="embedder-policy-value">value</span> is <span>compatible with cross-origin
84704+
isolation</span>, then return true.</p></li>
8468084705

8468184706
<li><p><span>Queue a cross-origin embedder policy inheritance violation</span> with
8468284707
<var>response</var>, "<code data-x="">worker initialization</code>", <var>owner's policy</var>'s
@@ -102561,11 +102586,11 @@ interface <dfn interface>SharedWorkerGlobalScope</dfn> : <span>WorkerGlobalScope
102561102586

102562102587
<li>
102563102588
<p>If <var>worker global scope</var>'s <span
102564-
data-x="concept-WorkerGlobalScope-embedder-policy">embedder policy</span> is "<code
102565-
data-x="coep-require-corp">require-corp</code>" and <var>is shared</var> is true, then set
102566-
<var>agent</var>'s <span>agent cluster</span>'s <span
102567-
data-x="agent-cluster-cross-origin-isolation">cross-origin isolation mode</span> to "<code
102568-
data-x="cross-origin-isolation-logical">logical</code>" or "<code
102589+
data-x="concept-WorkerGlobalScope-embedder-policy">embedder policy</span>'s <span
102590+
data-x="embedder-policy-value">value</span> is <span>compatible with cross-origin
102591+
isolation</span> and <var>is shared</var> is true, then set <var>agent</var>'s <span>agent
102592+
cluster</span>'s <span data-x="agent-cluster-cross-origin-isolation">cross-origin isolation
102593+
mode</span> to "<code data-x="cross-origin-isolation-logical">logical</code>" or "<code
102569102594
data-x="cross-origin-isolation-concrete">concrete</code>". The one chosen is
102570102595
<span>implementation-defined</span>.</p>
102571102596

0 commit comments

Comments
 (0)