-
Notifications
You must be signed in to change notification settings - Fork 42
Description
Chrome is marking DBSC sessions as session_ended during the refresh flow, even when the server correctly responds with a 403 Forbidden status and a valid Secure-Session-Challenge header in the expected RFC9651 Structured Field format.
Problem Description
During the DBSC refresh flow (Step 1: Challenge), Chrome sends a refresh request with Sec-Secure-Session-Id header, and the server responds with:
- Status Code:
403 Forbidden(as per W3C DBSC §8.8) - Header:
Secure-Session-Challenge: "challenge_token";id="session_identifier" - Body: Plain text
"OK" - Headers:
Cache-Control: no-store,Content-Type: text/plain
However, Chrome's net-export logs show session_ended instead of proceeding to Step 2 (Proof).
Expected Behavior
According to W3C DBSC specification §8.8:
- Status
403: Chrome should retry with cached challenge - Chrome should proceed to Step 2 by sending
Secure-Session-Responseheader with signed JWT
Actual Behavior
- Chrome receives the
403response withSecure-Session-Challengeheader - Chrome marks the session as
session_endedinstead of proceeding to Step 2 - No Step 2 request is made to refresh endpoint (no
Secure-Session-Responseheader sent)
Implementation Details
Challenge Header Format
The server constructs the Secure-Session-Challenge header as follows:
Secure-Session-Challenge: "DBSC-<random_string>";id="<session_identifier>"
Where:
challenge_tokenis a plain string (e.g.,"DBSC-m74paggdrt")session_identifiermatches thesession_identifiersent during registration- Format follows RFC9651 Structured Fields:
"string-value";param="value"
Response Headers
HTTP/1.1 403 Forbidden
Content-Type: text/plain
Cache-Control: no-store
Secure-Session-Challenge: "DBSC-m74paggdrt";id="3ab57e6b-d886-4cc8-801c-ec1db4403ac9"
Access-Control-Allow-Origin: <origin>
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Secure-Session-Registration, Secure-Session-ChallengeResponse Body
OK
Questions
-
Session Identifier Matching: The
idparameter matches thesession_identifierfrom registration. Are there any additional requirements for this matching? -
Response Format: Is there any requirement for the response body format beyond plain text? The spec mentions
403but doesn't specify body requirements. -
Timing: Could there be a timing issue where Chrome marks
session_endedbefore processing the challenge header? -
Error Handling: What specific conditions cause Chrome to mark a session as
session_endedduring the challenge step?
Additional Context
- The registration flow works correctly (Chrome successfully registers the session)
- The
session_identifiersent during registration matches theidparameter in the challenge header - The issue occurs consistently, not intermittently
- Net-export logs confirm
session_endedstatus
Thank you for your assistance, if you want I can provide even further details!