From 4d8826647776b62a6337b867defed45b504c3776 Mon Sep 17 00:00:00 2001 From: caraitto Date: Mon, 16 Dec 2024 13:35:04 -0500 Subject: [PATCH 1/2] [Explainer] Remove web bundle directFromSellerSignals Header-based directFromSellerSignals (directFromSellerSignalsHeaderAdSlot), which replaces web bundle directFromSellerSignals, is unaffected. Usage of web bundle directFromSellerSignals is extremely low: https://chromestatus.com/metrics/feature/timeline/popularity/5034. The feature was originally requested in https://github.com/WICG/turtledove/issues/119, and the header-based version was requested in https://github.com/WICG/turtledove/issues/119#issuecomment-1274013176. Blink I2D&R thread: https://groups.google.com/a/chromium.org/g/blink-dev/c/t9gHiTwV370 Chromium removal bug: https://crbug.com/384481095 --- FLEDGE.md | 69 +++++++++++++++---------------------------------------- 1 file changed, 19 insertions(+), 50 deletions(-) diff --git a/FLEDGE.md b/FLEDGE.md index 3f084aa27..7e9873a0d 100644 --- a/FLEDGE.md +++ b/FLEDGE.md @@ -24,8 +24,7 @@ See [the Protected Audience API specification](https://wicg.github.io/turtledove - [2.3 Scoring Bids](#23-scoring-bids) - [2.4 Scoring Bids in Component Auctions](#24-scoring-bids-in-component-auctions) - [2.5 Additional Trusted Signals (directFromSellerSignals)](#25-additional-trusted-signals-directfromsellersignals) - - [2.5.1 Using Subresource Bundles](#251-using-subresource-bundles) - - [2.5.2 Using Response Headers](#252-using-response-headers) + - [2.5.1 Using Response Headers](#252-using-response-headers) - [3. Buyers Provide Ads and Bidding Functions (BYOS for now)](#3-buyers-provide-ads-and-bidding-functions-byos-for-now) - [3.1 Fetching Real-Time Data from a Trusted Server](#31-fetching-real-time-data-from-a-trusted-server) - [3.1.1 Cross-Origin Trusted Server Signals](#311-cross-origin-trusted-server-signals) @@ -454,7 +453,7 @@ The optional `requestedSize` field recommends a frame size for the auction, whic `allSlotsRequestedSizes` may optionally be used to specify the size of all ad slots on the page, to be passed to each interest group's `trustedBuyerSignalsURL`, for interest groups that request it. All sizes in the list must be distinct. -The optional `directFromSellerSignalsHeaderAdSlot` field can also be used to pass signals to the auction, similar to `sellerSignals`, `perBuyerSignals`, and `auctionSignals`. The difference is that signals from `directFromSellerSignalsHeaderAdSlot` are trusted to come from the seller because the content loads from response headers from an https fetch request made to the seller's origin, ensuring the authenticity and integrity of the signals. For more details, see [2.5 directFromSellerSignals](#25-additional-trusted-signals-directfromsellersignals) and [2.5.2 directFromSellerSignalsHeaderAdSlot](#252-using-response-headers). +The optional `directFromSellerSignalsHeaderAdSlot` field can also be used to coordinate passing signals into the auction, similar to `sellerSignals`, `perBuyerSignals`, and `auctionSignals`. The difference is that signals from `directFromSellerSignalsHeaderAdSlot` are trusted to come from the seller because the content loads from response headers from an https fetch request made to the seller's origin, ensuring the authenticity and integrity of the signals. For more details, see [2.5 directFromSellerSignals](#25-additional-trusted-signals-directfromsellersignals) and [2.5.1 directFromSellerSignalsHeaderAdSlot](#251-using-response-headers). In some cases, multiple SSPs may want to participate in an auction, with the winners of separate auctions being passed up to another auction, run by another SSP. To facilitate these "component auctions", `componentAuctions` can optionally contain additional auction configurations for each seller's "component auction". The winning bid of each of these "component auctions" will be passed to the "top-level" auction. How bids are scored in this case is further described in [2.4 Scoring Bids in Component Auctions](#24-scoring-bids-in-component-auctions). The `AuctionConfig` of component auctions may not have their own `componentAuctions`. When `componentAuctions` is non-empty, `interestGroupBuyers` must be empty. That is, for any particular Protected Audience auction, either there is a single seller and no component auctions, or else all bids come from component auctions and the top-level auction can only choose among the component auctions' winners. @@ -502,7 +501,7 @@ In the case of a component auction, all `AuctionConfig` parameters for that comp ##### 2.1.1 Providing Signals Asynchronously -The values of some signals (those configured by fields `auctionSignals`, `sellerSignals`, `perBuyerSignals`, `perBuyerTimeouts`, `deprecatedRenderURLReplacements`, and `directFromSellerSignals`) can optionally be provided not as concrete values, but as [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). This permits some parts of the auction, such as loading of scripts and trusted signals, and launching of isolated worklet processes, to overlap the computation (or network retrieval) of those values. The worklet scripts will only see the resolved values; if any such Promise rejects the auction will be aborted (unless it managed to fail already or get otherwise aborted anyway). +The values of some signals (those configured by fields `auctionSignals`, `sellerSignals`, `perBuyerSignals`, `perBuyerTimeouts`, `deprecatedRenderURLReplacements`, and `directFromSellerSignalsHeaderAdSlot`) can optionally be provided not as concrete values, but as [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). This permits some parts of the auction, such as loading of scripts and trusted signals, and launching of isolated worklet processes, to overlap the computation (or network retrieval) of those values. The worklet scripts will only see the resolved values; if any such Promise rejects the auction will be aborted (unless it managed to fail already or get otherwise aborted anyway). ##### 2.1.2 Seller Security Considerations @@ -587,8 +586,8 @@ The function gets called once for each candidate ad in the auction. The argumen } ``` * directFromSellerSignals is an object that may contain the following fields: - * sellerSignals: Like auctionConfig.sellerSignals, but passed via the [directFromSellerSignals](#25-additional-trusted-signals-directfromsellersignals) mechanism. These are the signals whose subresource URL ends in `?sellerSignals`. - * auctionSignals: Like auctionConfig.auctionSignals, but passed via the [directFromSellerSignals](#25-additional-trusted-signals-directfromsellersignals) mechanism. These are the signals whose subresource URL ends in `?auctionSignals`. + * sellerSignals: Like auctionConfig.sellerSignals, but passed via the [directFromSellerSignals](#25-additional-trusted-signals-directfromsellersignals) mechanism. + * auctionSignals: Like auctionConfig.auctionSignals, but passed via the [directFromSellerSignals](#25-additional-trusted-signals-directfromsellersignals) mechanism. * crossOriginTrustedSignals: like `trustedScoringSignals`, but used when the server is cross-origin to the seller script. The value is an object that has as a key the trusted server's origin, e.g. `"https://example.org"`, and as value an object in format `trustedScoringSignals` uses. See @@ -631,39 +630,9 @@ The ultimate winner of the top-level auction is the single bid the top-level sel While the browser ensures (using TLS) that information stored in a buyer's interest group and coming from a buyer's trusted bidding signals server comes from the buyer, information passed into `runAdAuction()` is not known to come from the seller unless the seller calls `runAdAuction()` from its own iframe.  In a multi-seller auction it becomes impossible to have all sellers create the frame calling `runAdAuction()`.  `directFromSellerSignals` allows the browser to ensure the authenticity and integrity of information passed into an auction from the seller. -##### 2.5.1 Using Subresource Bundles +#### 2.5.1 Using Response Headers -The optional `directFromSellerSignals` field can be used to pass signals to the auction, similar to `sellerSignals` and `perBuyerSignals`. The difference is that `directFromSellerSignals` are trusted to come from a seller because the content loads from a [subresource bundle](https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md) loaded from a seller's origin. If present, `directFromSellerSignals` should be an HTTPS URL prefix using the seller's origin -- when combined with a browser-provided suffix (see details below), the resultant URL should be a resource in a subresource bundle that has been loaded by the current document, whose contents are of type `application/json`, with the following response headers: `Ad-Auction-Allowed: true` and `Ad-Auction-Only: true`. - -The URL prefix should not have a query string (i.e. `?a=b&c=d`). Different calls to `navigator.runAdAuction()` on a page may use different prefixes -- for instance, to give different signals to different ad slots. The browser will append the following suffixes to the prefix: - -* `?perBuyerSignals=[origin]`, where [origin] is one of the origins in `interestGroupBuyers` (encoded as a URL component): this corresponds to the `perBuyerSignals` for the buyer `origin` -* `?sellerSignals`: this corresponds to the `sellerSignals` only delivered to the seller -* `?auctionSignals`: this corresponds to `auctionSignals` delivered to the seller, and all buyers - -`runAdAuction()` will check all of the above URLs (`perBuyerSignals` for all buyers, `sellerSignals`, and `auctionSignals`) to see if they have been pre-registered as a subresource URL via `